126 void JfrBuffer::acquire(const void* id) { |
126 void JfrBuffer::acquire(const void* id) { |
127 assert(id != NULL, "invariant"); |
127 assert(id != NULL, "invariant"); |
128 const void* current_id; |
128 const void* current_id; |
129 do { |
129 do { |
130 current_id = Atomic::load(&_identity); |
130 current_id = Atomic::load(&_identity); |
131 } while (current_id != NULL || Atomic::cmpxchg(id, &_identity, current_id) != current_id); |
131 } while (current_id != NULL || Atomic::cmpxchg(&_identity, current_id, id) != current_id); |
132 } |
132 } |
133 |
133 |
134 bool JfrBuffer::try_acquire(const void* id) { |
134 bool JfrBuffer::try_acquire(const void* id) { |
135 assert(id != NULL, "invariant"); |
135 assert(id != NULL, "invariant"); |
136 const void* const current_id = Atomic::load(&_identity); |
136 const void* const current_id = Atomic::load(&_identity); |
137 return current_id == NULL && Atomic::cmpxchg(id, &_identity, current_id) == current_id; |
137 return current_id == NULL && Atomic::cmpxchg(&_identity, current_id, id) == current_id; |
138 } |
138 } |
139 |
139 |
140 void JfrBuffer::release() { |
140 void JfrBuffer::release() { |
141 OrderAccess::storestore(); |
141 OrderAccess::storestore(); |
142 _identity = NULL; |
142 _identity = NULL; |