Changes in / [d99a716:66a89e7]


Ignore:
Location:
libcfa/src/concurrency
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/invoke.h

    rd99a716 r66a89e7  
    215215                struct __thread_user_link cltr_link;
    216216
     217                // used to store state between clh lock/unlock
     218                volatile bool * clh_prev;
     219
    217220                // used to point to this thd's current clh node
    218221                volatile bool * clh_node;
  • libcfa/src/concurrency/locks.hfa

    rd99a716 r66a89e7  
    228228struct clh_lock {
    229229        volatile bool * volatile tail;
    230     volatile bool * volatile head;
    231230};
    232231
     
    238237        *(curr_thd->clh_node) = false;
    239238        volatile bool * prev = __atomic_exchange_n((bool **)(&l.tail), (bool *)(curr_thd->clh_node), __ATOMIC_SEQ_CST);
    240         while(!__atomic_load_n(prev, __ATOMIC_SEQ_CST)) Pause();
    241     __atomic_store_n((bool **)(&l.head), (bool *)curr_thd->clh_node, __ATOMIC_SEQ_CST);
    242     curr_thd->clh_node = prev;
     239        while(!__atomic_load_n(prev, __ATOMIC_ACQUIRE)) Pause();
     240        curr_thd->clh_prev = prev;
    243241}
    244242
    245243static inline void unlock(clh_lock & l) {
    246         __atomic_store_n((bool *)(l.head), true, __ATOMIC_SEQ_CST);
     244        thread$ * curr_thd = active_thread();
     245        __atomic_store_n(curr_thd->clh_node, true, __ATOMIC_RELEASE);
     246        curr_thd->clh_node = curr_thd->clh_prev;
    247247}
    248248
Note: See TracChangeset for help on using the changeset viewer.