17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "jfr/recorder/storage/jfrStorageControl.hpp"
27 #include "runtime/atomic.hpp"
28 #include "runtime/mutexLocker.hpp"
29
30 // returns the updated value
31 static jlong atomic_add(size_t value, size_t volatile* const dest) {
32 size_t compare_value;
33 size_t exchange_value;
34 do {
35 compare_value = *dest;
36 exchange_value = compare_value + value;
37 } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
38 return exchange_value;
39 }
40
41 static jlong atomic_dec(size_t volatile* const dest) {
42 size_t compare_value;
43 size_t exchange_value;
44 do {
45 compare_value = *dest;
46 assert(compare_value >= 1, "invariant");
47 exchange_value = compare_value - 1;
48 } while (Atomic::cmpxchg(exchange_value, dest, compare_value) != compare_value);
49 return exchange_value;
50 }
51
52 const size_t max_lease_factor = 2;
53 JfrStorageControl::JfrStorageControl(size_t global_count_total, size_t in_memory_discard_threshold) :
54 _global_count_total(global_count_total),
55 _full_count(0),
56 _global_lease_count(0),
57 _dead_count(0),
58 _to_disk_threshold(0),
59 _in_memory_discard_threshold(in_memory_discard_threshold),
60 _global_lease_threshold(global_count_total / max_lease_factor),
61 _scavenge_threshold(0),
62 _to_disk(false) {}
63
64 bool JfrStorageControl::to_disk() const {
65 return _to_disk;
66 }
67
68 void JfrStorageControl::set_to_disk(bool enable) {
120
121 size_t JfrStorageControl::dead_count() const {
122 return _dead_count;
123 }
124
125 size_t JfrStorageControl::increment_dead() {
126 return atomic_add(1, &_dead_count);
127 }
128
129 size_t JfrStorageControl::decrement_dead() {
130 return atomic_dec(&_dead_count);
131 }
132
133 bool JfrStorageControl::should_scavenge() const {
134 return dead_count() >= _scavenge_threshold;
135 }
136
137 void JfrStorageControl::set_scavenge_threshold(size_t number_of_dead_buffers) {
138 _scavenge_threshold = number_of_dead_buffers;
139 }
140
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "jfr/recorder/storage/jfrStorageControl.hpp"
27 #include "runtime/atomic.hpp"
28 #include "runtime/mutexLocker.hpp"
29
30 // returns the updated value
31 static jlong atomic_add(size_t value, size_t volatile* const dest) {
32 size_t compare_value;
33 size_t exchange_value;
34 do {
35 compare_value = *dest;
36 exchange_value = compare_value + value;
37 } while (Atomic::cmpxchg(dest, compare_value, exchange_value) != compare_value);
38 return exchange_value;
39 }
40
41 static jlong atomic_dec(size_t volatile* const dest) {
42 size_t compare_value;
43 size_t exchange_value;
44 do {
45 compare_value = *dest;
46 assert(compare_value >= 1, "invariant");
47 exchange_value = compare_value - 1;
48 } while (Atomic::cmpxchg(dest, compare_value, exchange_value) != compare_value);
49 return exchange_value;
50 }
51
52 const size_t max_lease_factor = 2;
53 JfrStorageControl::JfrStorageControl(size_t global_count_total, size_t in_memory_discard_threshold) :
54 _global_count_total(global_count_total),
55 _full_count(0),
56 _global_lease_count(0),
57 _dead_count(0),
58 _to_disk_threshold(0),
59 _in_memory_discard_threshold(in_memory_discard_threshold),
60 _global_lease_threshold(global_count_total / max_lease_factor),
61 _scavenge_threshold(0),
62 _to_disk(false) {}
63
64 bool JfrStorageControl::to_disk() const {
65 return _to_disk;
66 }
67
68 void JfrStorageControl::set_to_disk(bool enable) {
120
121 size_t JfrStorageControl::dead_count() const {
122 return _dead_count;
123 }
124
125 size_t JfrStorageControl::increment_dead() {
126 return atomic_add(1, &_dead_count);
127 }
128
129 size_t JfrStorageControl::decrement_dead() {
130 return atomic_dec(&_dead_count);
131 }
132
133 bool JfrStorageControl::should_scavenge() const {
134 return dead_count() >= _scavenge_threshold;
135 }
136
137 void JfrStorageControl::set_scavenge_threshold(size_t number_of_dead_buffers) {
138 _scavenge_threshold = number_of_dead_buffers;
139 }
|