- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/select.hfa
re23b3ce r6f774be 103 103 //============================================================================================= 104 104 105 static inline void __make_select_node_unsat( select_node & this ) with( this ) { 106 __atomic_store_n( clause_status, __SELECT_UNSAT, __ATOMIC_SEQ_CST ); 107 } 108 static inline void __make_select_node_sat( select_node & this ) with( this ) { 109 __atomic_store_n( clause_status, __SELECT_SAT, __ATOMIC_SEQ_CST ); 110 } 111 105 112 // used for the 2-stage avail needed by the special OR case 106 113 static inline bool __mark_select_node( select_node & this, unsigned long int val ) with( this ) { … … 116 123 } 117 124 118 static inline void __make_select_node_unsat( select_node & this ) with( this ) { 119 __atomic_store_n( clause_status, __SELECT_UNSAT, __ATOMIC_SEQ_CST ); 120 } 121 static inline void __make_select_node_sat( select_node & this ) with( this ) { 122 __atomic_store_n( clause_status, __SELECT_SAT, __ATOMIC_SEQ_CST ); 125 // used for the 2-stage avail by the thread who owns a pending node 126 static inline bool __pending_set_other( select_node & other, select_node & mine, unsigned long int val ) with( other ) { 127 /* paranoid */ verify( park_counter == 0p ); 128 /* paranoid */ verify( clause_status != 0p ); 129 130 unsigned long int cmp_status = __SELECT_UNSAT; 131 while( !__atomic_compare_exchange_n( clause_status, &cmp_status, val, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) ) { 132 if ( cmp_status != __SELECT_PENDING ) 133 return false; 134 135 // toggle current status flag to avoid starvation/deadlock 136 __make_select_node_unsat( mine ); 137 cmp_status = __SELECT_UNSAT; 138 if ( !__atomic_compare_exchange_n( mine.clause_status, &cmp_status, __SELECT_PENDING, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST ) ) 139 return false; 140 cmp_status = __SELECT_UNSAT; 141 } 142 return true; 123 143 } 124 144
Note: See TracChangeset
for help on using the changeset viewer.