12 #ifndef __THREADING_PP_H__
13 #define __THREADING_PP_H__
19 #include "platform/likely.h"
21 #if !defined(__GNUC__) && !defined(__INTEL_COMPILER)
22 #error Unknown compiler; could not guess which compare-and-swap instructions to use
24 #define CAS(ptr, oldval, newval) __sync_bool_compare_and_swap(ptr, oldval, newval)
25 #define tid_memory_barrier __sync_synchronize
29 typedef uint64_t tid_presence_t;
31 static inline void tid_init_presence_mask(tid_presence_t* presence_mask){
32 *presence_mask = 0x0ULL;
38 static inline void tid_mark_as_present(
unsigned int tid,
volatile tid_presence_t* presence_mask){
39 tid_presence_t old_val, new_val;
43 TID_MARK_AS_PRESENT_RETRY:
44 old_val = *presence_mask;
47 if( unlikely(tid == ROFL_PIPELINE_LOCKED_TID ) && unlikely( ( old_val & ( 1<<tid ) ) > 0)){
50 goto TID_MARK_AS_PRESENT_RETRY;
54 new_val = old_val | ( 1<<tid );
56 }
while( CAS(presence_mask, old_val, new_val) ==
false);
59 assert( ( *presence_mask & (1<<tid) ) > 0);
65 static inline void tid_mark_as_not_present(
unsigned int tid,
volatile tid_presence_t* presence_mask){
66 tid_presence_t old_val, new_val;
69 old_val = *presence_mask;
72 assert( ( old_val & (1<<tid) ) > 0);
75 new_val = old_val & ~(1 << tid);
77 }
while( CAS(presence_mask, old_val, new_val) ==
false);
83 static inline void tid_wait_all_not_present(
volatile tid_presence_t* presence_mask){
86 tid_presence_t present;
93 present = *presence_mask;
95 for(i=0;i<ROFL_PIPELINE_MAX_TIDS;i++){
98 if( unlikely( ( present & tid) > 0 ) ){
101 tmp = *presence_mask;
102 if( likely( ( tmp&tid ) == 0) )
110 #endif //THREADING_PP