Changeset 56e5b24


Ignore:
Timestamp:
Sep 13, 2021, 1:41:57 PM (3 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum
Children:
b5ec090
Parents:
821c534
Message:

Manually read from event fd instead of calling eventfd_read, which doesn't handle interrupts the way I want.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel.cfa

    r821c534 r56e5b24  
    231231                                __cfadbg_print_safe(runtime_core, "Kernel : core %p waiting on eventfd %d\n", this, this->idle);
    232232
    233                                 __disable_interrupts_hard();
    234                                 eventfd_t val;
    235                                 eventfd_read( this->idle, &val );
    236                                 __enable_interrupts_hard();
     233                                {
     234                                        eventfd_t val;
     235                                        ssize_t ret = read( this->idle, &val, sizeof(val) );
     236                                        if(ret < 0) {
     237                                                switch((int)errno) {
     238                                                case EAGAIN:
     239                                                #if EAGAIN != EWOULDBLOCK
     240                                                        case EWOULDBLOCK:
     241                                                #endif
     242                                                case EINTR:
     243                                                        // No need to do anything special here, just assume it's a legitimate wake-up
     244                                                        break;
     245                                                default:
     246                                                        abort( "KERNEL : internal error, read failure on idle eventfd, error(%d) %s.", (int)errno, strerror( (int)errno ) );
     247                                                }
     248                                        }
     249                                }
    237250
    238251                                #if !defined(__CFA_NO_STATISTICS__)
Note: See TracChangeset for help on using the changeset viewer.