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 } |