Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel_private.hfa

    r24e321c r5f5a729  
    282282}
    283283
     284static inline bool try_lock(__cluster_proc_list & this) {
     285        /* paranoid */ verify( ! __preemption_enabled() );
     286
     287        // Start by locking the global RWlock so that we know no-one is
     288        // adding/removing processors while we mess with the idle lock
     289        ready_schedule_lock();
     290
     291        // Simple counting lock, acquired, acquired by incrementing the counter
     292        // to an odd number
     293        uint64_t l = this.lock;
     294        if(
     295                (0 == (l % 2))
     296                && __atomic_compare_exchange_n(&this.lock, &l, l + 1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
     297        ) {
     298                // success
     299                /* paranoid */ verify( ! __preemption_enabled() );
     300                return true;
     301        }
     302
     303        // failed to lock
     304        ready_schedule_unlock();
     305
     306        /* paranoid */ verify( ! __preemption_enabled() );
     307        return false;
     308}
     309
    284310static inline void unlock(__cluster_proc_list & this) {
    285311        /* paranoid */ verify( ! __preemption_enabled() );
Note: See TracChangeset for help on using the changeset viewer.