Changeset 58f99b3


Ignore:
Timestamp:
Jan 12, 2021, 12:44:15 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
d48b174
Parents:
426f60c
Message:

Retry interruptable syscalls instead of blocking interrupts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/io/setup.cfa

    r426f60c r58f99b3  
    310310        }
    311311
    312         extern void signal_unblock( int sig );
    313         extern void signal_block  ( int sig );
    314 
    315312        static void __io_create( __io_data & this, const io_context_params & params_in ) {
    316313                // Step 1 : call to setup
     
    431428                cq.cqes = (struct io_uring_cqe *)(((intptr_t)cq.ring_ptr) + params.cq_off.cqes);
    432429
    433                 signal_block( SIGUSR1 );
    434 
    435430                // Step 4 : eventfd
    436                 int efd = eventfd(0, 0);
    437                 if (efd < 0) {
    438                         abort("KERNEL ERROR: IO_URING EVENTFD - %s\n", strerror(errno));
    439                 }
    440 
    441                 int ret = syscall( __NR_io_uring_register, fd, IORING_REGISTER_EVENTFD, &efd, 1);
    442                 if (ret < 0) {
    443                         abort("KERNEL ERROR: IO_URING EVENTFD REGISTER - %s\n", strerror(errno));
    444                 }
    445 
    446                 signal_unblock( SIGUSR1 );
     431                int efd;
     432                for() {
     433                        efd = eventfd(0, 0);
     434                        if (efd < 0) {
     435                                if (errno == EINTR) continue;
     436                                abort("KERNEL ERROR: IO_URING EVENTFD - %s\n", strerror(errno));
     437                        }
     438                        break;
     439                }
     440
     441                int ret;
     442                for() {
     443                        ret = syscall( __NR_io_uring_register, fd, IORING_REGISTER_EVENTFD, &efd, 1);
     444                        if (ret < 0) {
     445                                if (errno == EINTR) continue;
     446                                abort("KERNEL ERROR: IO_URING EVENTFD REGISTER - %s\n", strerror(errno));
     447                        }
     448                        break;
     449                }
    447450
    448451                // some paranoid checks
Note: See TracChangeset for help on using the changeset viewer.