src/hotspot/share/jfr/recorder/storage/jfrStorageControl.cpp
changeset 58863 c16ac7a2eba4
parent 50429 83aec1d357d4
child 59252 623722a6aeb9
equal deleted inserted replaced
58861:2c3cc4b01880 58863:c16ac7a2eba4
    24 
    24 
    25 #include "precompiled.hpp"
    25 #include "precompiled.hpp"
    26 #include "jfr/recorder/storage/jfrStorageControl.hpp"
    26 #include "jfr/recorder/storage/jfrStorageControl.hpp"
    27 #include "runtime/atomic.hpp"
    27 #include "runtime/atomic.hpp"
    28 #include "runtime/mutexLocker.hpp"
    28 #include "runtime/mutexLocker.hpp"
    29 #include "runtime/orderAccess.hpp"
       
    30 
    29 
    31 // returns the updated value
    30 // returns the updated value
    32 static jlong atomic_add(size_t value, size_t volatile* const dest) {
    31 static jlong atomic_add(size_t value, size_t volatile* const dest) {
    33   size_t compare_value;
    32   size_t compare_value;
    34   size_t exchange_value;
    33   size_t exchange_value;
    35   do {
    34   do {
    36     compare_value = OrderAccess::load_acquire(dest);
    35     compare_value = *dest;
    37     exchange_value = compare_value + value;
    36     exchange_value = compare_value + value;
    38   } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
    37   } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
    39   return exchange_value;
    38   return exchange_value;
    40 }
    39 }
    41 
    40 
    42 static jlong atomic_dec(size_t volatile* const dest) {
    41 static jlong atomic_dec(size_t volatile* const dest) {
    43   size_t compare_value;
    42   size_t compare_value;
    44   size_t exchange_value;
    43   size_t exchange_value;
    45   do {
    44   do {
    46     compare_value = OrderAccess::load_acquire(dest);
    45     compare_value = *dest;
    47     assert(compare_value >= 1, "invariant");
    46     assert(compare_value >= 1, "invariant");
    48     exchange_value = compare_value - 1;
    47     exchange_value = compare_value - 1;
    49   } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
    48   } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
    50   return exchange_value;
    49   return exchange_value;
    51 }
    50 }
   100 }
    99 }
   101 
   100 
   102 // concurrent with accuracy requirement
   101 // concurrent with accuracy requirement
   103 
   102 
   104 size_t JfrStorageControl::global_lease_count() const {
   103 size_t JfrStorageControl::global_lease_count() const {
   105   return OrderAccess::load_acquire(&_global_lease_count);
   104   return Atomic::load(&_global_lease_count);
   106 }
   105 }
   107 
   106 
   108 size_t JfrStorageControl::increment_leased() {
   107 size_t JfrStorageControl::increment_leased() {
   109   return atomic_add(1, &_global_lease_count);
   108   return atomic_add(1, &_global_lease_count);
   110 }
   109 }