@@ -70,7 +70,7 @@ static inline bool opal_update_counted_pointer(volatile opal_counted_pointer_t *
7070 opal_counted_pointer_t * old , opal_list_item_t * item )
7171{
7272 opal_counted_pointer_t new_p ;
73- new_p .data .item = (intptr_t ) item ;
73+ opal_atomic_store_ptr_relaxed ( & new_p .data .item , (intptr_t ) item ) ;
7474 new_p .data .counter = old -> data .counter + 1 ;
7575 return opal_atomic_compare_exchange_strong_128 (& addr -> atomic_value , & old -> value , new_p .value );
7676}
@@ -83,7 +83,7 @@ opal_read_counted_pointer(volatile opal_counted_pointer_t *volatile addr,
8383 * specific order */
8484 value -> data .counter = addr -> data .counter ;
8585 opal_atomic_rmb ();
86- value -> data .item = addr -> data .item ;
86+ opal_atomic_store_ptr_relaxed ( & value -> data .item , opal_atomic_load_ptr_relaxed ( & addr -> data .item )) ;
8787}
8888
8989#endif
@@ -122,7 +122,7 @@ OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_lifo_t);
122122 */
123123static inline bool opal_lifo_is_empty (opal_lifo_t * lifo )
124124{
125- return (opal_list_item_t * ) lifo -> opal_lifo_head .data .item == & lifo -> opal_lifo_ghost ;
125+ return (opal_list_item_t * ) opal_atomic_load_ptr_relaxed ( & lifo -> opal_lifo_head .data .item ) == & lifo -> opal_lifo_ghost ;
126126}
127127
128128#if OPAL_HAVE_ATOMIC_COMPARE_EXCHANGE_128 && !OPAL_HAVE_ATOMIC_LLSC_PTR
@@ -133,7 +133,7 @@ static inline bool opal_lifo_is_empty(opal_lifo_t *lifo)
133133 */
134134static inline opal_list_item_t * opal_lifo_push_atomic (opal_lifo_t * lifo , opal_list_item_t * item )
135135{
136- opal_list_item_t * next = (opal_list_item_t * ) lifo -> opal_lifo_head .data .item ;
136+ opal_list_item_t * next = (opal_list_item_t * ) opal_atomic_load_ptr_relaxed ( & lifo -> opal_lifo_head .data .item ) ;
137137
138138 do {
139139 item -> opal_list_next = next ;
@@ -159,7 +159,7 @@ static inline opal_list_item_t *opal_lifo_pop_atomic(opal_lifo_t *lifo)
159159 opal_read_counted_pointer (& lifo -> opal_lifo_head , & old_head );
160160
161161 do {
162- item = (opal_list_item_t * ) old_head .data .item ;
162+ item = (opal_list_item_t * ) opal_atomic_load_ptr_relaxed ( & old_head .data .item ) ;
163163 if (item == & lifo -> opal_lifo_ghost ) {
164164 return NULL ;
165165 }
@@ -181,7 +181,7 @@ static inline opal_list_item_t *opal_lifo_pop_atomic(opal_lifo_t *lifo)
181181 */
182182static inline opal_list_item_t * opal_lifo_push_atomic (opal_lifo_t * lifo , opal_list_item_t * item )
183183{
184- opal_list_item_t * next = (opal_list_item_t * ) lifo -> opal_lifo_head .data .item ;
184+ opal_list_item_t * next = (opal_list_item_t * ) opal_atomic_load_ptr_relaxed ( & lifo -> opal_lifo_head .data .item ) ;
185185
186186 /* item free acts as a mini lock to avoid ABA problems */
187187 item -> item_free = 1 ;
@@ -218,13 +218,13 @@ static inline opal_list_item_t *opal_lifo_pop_atomic(opal_lifo_t *lifo)
218218 attempt = 0 ;
219219 }
220220
221- opal_atomic_ll_ptr (& lifo -> opal_lifo_head .data .item , item );
221+ opal_atomic_ll_ptr (& lifo -> opal_lifo_head .data .item . value , item );
222222 if (& lifo -> opal_lifo_ghost == item ) {
223223 return NULL ;
224224 }
225225
226226 next = (opal_list_item_t * ) item -> opal_list_next ;
227- opal_atomic_sc_ptr (& lifo -> opal_lifo_head .data .item , next , ret );
227+ opal_atomic_sc_ptr (& lifo -> opal_lifo_head .data .item . value , next , ret );
228228 } while (!ret );
229229
230230 opal_atomic_wmb ();
@@ -242,7 +242,7 @@ static inline opal_list_item_t *opal_lifo_pop_atomic(opal_lifo_t *lifo)
242242{
243243 opal_list_item_t * item , * head , * ghost = & lifo -> opal_lifo_ghost ;
244244
245- while ((item = (opal_list_item_t * ) lifo -> opal_lifo_head .data .item ) != ghost ) {
245+ while ((item = (opal_list_item_t * ) opal_atomic_load_ptr_relaxed ( & lifo -> opal_lifo_head .data .item ) ) != ghost ) {
246246 /* ensure it is safe to pop the head */
247247 if (opal_atomic_swap_32 ((opal_atomic_int32_t * ) & item -> item_free , 1 )) {
248248 continue ;
@@ -282,17 +282,17 @@ static inline opal_list_item_t *opal_lifo_pop_atomic(opal_lifo_t *lifo)
282282/* single-threaded versions of the lifo functions */
283283static inline opal_list_item_t * opal_lifo_push_st (opal_lifo_t * lifo , opal_list_item_t * item )
284284{
285- item -> opal_list_next = (opal_list_item_t * ) lifo -> opal_lifo_head .data .item ;
285+ item -> opal_list_next = (opal_list_item_t * ) opal_atomic_load_ptr_relaxed ( & lifo -> opal_lifo_head .data .item ) ;
286286 item -> item_free = 0 ;
287- lifo -> opal_lifo_head .data .item = (intptr_t ) item ;
287+ opal_atomic_store_ptr_relaxed ( & lifo -> opal_lifo_head .data .item , (intptr_t ) item ) ;
288288 return (opal_list_item_t * ) item -> opal_list_next ;
289289}
290290
291291static inline opal_list_item_t * opal_lifo_pop_st (opal_lifo_t * lifo )
292292{
293293 opal_list_item_t * item ;
294- item = (opal_list_item_t * ) lifo -> opal_lifo_head .data .item ;
295- lifo -> opal_lifo_head .data .item = (intptr_t ) item -> opal_list_next ;
294+ item = (opal_list_item_t * ) opal_atomic_load_ptr_relaxed ( & lifo -> opal_lifo_head .data .item ) ;
295+ opal_atomic_store_ptr_relaxed ( & lifo -> opal_lifo_head .data .item , (intptr_t ) item -> opal_list_next ) ;
296296 if (item == & lifo -> opal_lifo_ghost ) {
297297 return NULL ;
298298 }
0 commit comments