equal
deleted
inserted
replaced
119 uint32_t version = 0; |
119 uint32_t version = 0; |
120 |
120 |
121 for (;;) { |
121 for (;;) { |
122 decode_versioned_pointer(vstack, stack->next_addr(), &version); |
122 decode_versioned_pointer(vstack, stack->next_addr(), &version); |
123 T* const new_vstack = encode_versioned_pointer(stack, version + 1); |
123 T* const new_vstack = encode_versioned_pointer(stack, version + 1); |
124 T* const prev_vstack = Atomic::cmpxchg(new_vstack, &_head, vstack); |
124 T* const prev_vstack = Atomic::cmpxchg(&_head, vstack, new_vstack); |
125 if (prev_vstack == vstack) { |
125 if (prev_vstack == vstack) { |
126 // Success |
126 // Success |
127 break; |
127 break; |
128 } |
128 } |
129 |
129 |
143 if (stack == NULL) { |
143 if (stack == NULL) { |
144 return NULL; |
144 return NULL; |
145 } |
145 } |
146 |
146 |
147 T* const new_vstack = encode_versioned_pointer(stack->next(), version + 1); |
147 T* const new_vstack = encode_versioned_pointer(stack->next(), version + 1); |
148 T* const prev_vstack = Atomic::cmpxchg(new_vstack, &_head, vstack); |
148 T* const prev_vstack = Atomic::cmpxchg(&_head, vstack, new_vstack); |
149 if (prev_vstack == vstack) { |
149 if (prev_vstack == vstack) { |
150 // Success |
150 // Success |
151 return stack; |
151 return stack; |
152 } |
152 } |
153 |
153 |