344 } |
344 } |
345 |
345 |
346 template <typename Mspace> |
346 template <typename Mspace> |
347 inline bool ReleaseOp<Mspace>::process(typename Mspace::Type* t) { |
347 inline bool ReleaseOp<Mspace>::process(typename Mspace::Type* t) { |
348 assert(t != NULL, "invariant"); |
348 assert(t != NULL, "invariant"); |
349 if (t->retired() || t->try_acquire(_thread)) { |
349 // assumes some means of exclusive access to t |
350 if (t->transient()) { |
350 if (t->transient()) { |
351 if (_release_full) { |
351 if (_release_full) { |
352 mspace_release_full_critical(t, _mspace); |
352 mspace_release_full_critical(t, _mspace); |
353 } else { |
353 } else { |
354 mspace_release_free_critical(t, _mspace); |
354 mspace_release_free_critical(t, _mspace); |
355 } |
|
356 return true; |
|
357 } |
355 } |
358 t->reinitialize(); |
356 return true; |
359 assert(t->empty(), "invariant"); |
357 } |
360 t->release(); // publish |
358 t->reinitialize(); |
361 } |
359 assert(t->empty(), "invariant"); |
|
360 assert(!t->retired(), "invariant"); |
|
361 t->release(); // publish |
362 return true; |
362 return true; |
363 } |
363 } |
364 |
364 |
365 #ifdef ASSERT |
365 #ifdef ASSERT |
366 template <typename T> |
366 template <typename T> |