37 public:
38 static const uint INVALID_WORKER_ID = uint(-1);
39
40 private:
41 char _gc_state;
42 char _oom_during_evac;
43 ShenandoahSATBMarkQueue _satb_mark_queue;
44 PLAB* _gclab;
45 size_t _gclab_size;
46 uint _worker_id;
47 bool _force_satb_flush;
48 int _disarmed_value;
49
50 ShenandoahThreadLocalData() :
51 _gc_state(0),
52 _oom_during_evac(0),
53 _satb_mark_queue(&ShenandoahBarrierSet::satb_mark_queue_set()),
54 _gclab(NULL),
55 _gclab_size(0),
56 _worker_id(INVALID_WORKER_ID),
57 _force_satb_flush(false) {
58 }
59
60 ~ShenandoahThreadLocalData() {
61 if (_gclab != NULL) {
62 delete _gclab;
63 }
64 }
65
66 static ShenandoahThreadLocalData* data(Thread* thread) {
67 assert(UseShenandoahGC, "Sanity");
68 return thread->gc_data<ShenandoahThreadLocalData>();
69 }
70
71 static ByteSize satb_mark_queue_offset() {
72 return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _satb_mark_queue);
73 }
74
75 public:
76 static void create(Thread* thread) {
77 new (data(thread)) ShenandoahThreadLocalData();
111 }
112
113 static uint worker_id(Thread* thread) {
114 assert(thread->is_Worker_thread(), "Must be a worker thread");
115 return data(thread)->_worker_id;
116 }
117
118 static void set_force_satb_flush(Thread* thread, bool v) {
119 data(thread)->_force_satb_flush = v;
120 }
121
122 static bool is_force_satb_flush(Thread* thread) {
123 return data(thread)->_force_satb_flush;
124 }
125
126 static void initialize_gclab(Thread* thread) {
127 assert (thread->is_Java_thread() || thread->is_Worker_thread(), "Only Java and GC worker threads are allowed to get GCLABs");
128 assert(data(thread)->_gclab == NULL, "Only initialize once");
129 data(thread)->_gclab = new PLAB(PLAB::min_size());
130 data(thread)->_gclab_size = 0;
131 data(thread)->_disarmed_value = ShenandoahCodeRoots::disarmed_value();
132 }
133
134 static PLAB* gclab(Thread* thread) {
135 return data(thread)->_gclab;
136 }
137
138 static size_t gclab_size(Thread* thread) {
139 return data(thread)->_gclab_size;
140 }
141
142 static void set_gclab_size(Thread* thread, size_t v) {
143 data(thread)->_gclab_size = v;
144 }
145
146 static void set_disarmed_value(Thread* thread, int value) {
147 data(thread)->_disarmed_value = value;
148 }
149
150 #ifdef ASSERT
151 static void set_evac_allowed(Thread* thread, bool evac_allowed) {
|
37 public:
38 static const uint INVALID_WORKER_ID = uint(-1);
39
40 private:
41 char _gc_state;
42 char _oom_during_evac;
43 ShenandoahSATBMarkQueue _satb_mark_queue;
44 PLAB* _gclab;
45 size_t _gclab_size;
46 uint _worker_id;
47 bool _force_satb_flush;
48 int _disarmed_value;
49
50 ShenandoahThreadLocalData() :
51 _gc_state(0),
52 _oom_during_evac(0),
53 _satb_mark_queue(&ShenandoahBarrierSet::satb_mark_queue_set()),
54 _gclab(NULL),
55 _gclab_size(0),
56 _worker_id(INVALID_WORKER_ID),
57 _force_satb_flush(false),
58 _disarmed_value(ShenandoahCodeRoots::disarmed_value()) {
59 }
60
61 ~ShenandoahThreadLocalData() {
62 if (_gclab != NULL) {
63 delete _gclab;
64 }
65 }
66
67 static ShenandoahThreadLocalData* data(Thread* thread) {
68 assert(UseShenandoahGC, "Sanity");
69 return thread->gc_data<ShenandoahThreadLocalData>();
70 }
71
72 static ByteSize satb_mark_queue_offset() {
73 return Thread::gc_data_offset() + byte_offset_of(ShenandoahThreadLocalData, _satb_mark_queue);
74 }
75
76 public:
77 static void create(Thread* thread) {
78 new (data(thread)) ShenandoahThreadLocalData();
112 }
113
114 static uint worker_id(Thread* thread) {
115 assert(thread->is_Worker_thread(), "Must be a worker thread");
116 return data(thread)->_worker_id;
117 }
118
119 static void set_force_satb_flush(Thread* thread, bool v) {
120 data(thread)->_force_satb_flush = v;
121 }
122
123 static bool is_force_satb_flush(Thread* thread) {
124 return data(thread)->_force_satb_flush;
125 }
126
127 static void initialize_gclab(Thread* thread) {
128 assert (thread->is_Java_thread() || thread->is_Worker_thread(), "Only Java and GC worker threads are allowed to get GCLABs");
129 assert(data(thread)->_gclab == NULL, "Only initialize once");
130 data(thread)->_gclab = new PLAB(PLAB::min_size());
131 data(thread)->_gclab_size = 0;
132 }
133
134 static PLAB* gclab(Thread* thread) {
135 return data(thread)->_gclab;
136 }
137
138 static size_t gclab_size(Thread* thread) {
139 return data(thread)->_gclab_size;
140 }
141
142 static void set_gclab_size(Thread* thread, size_t v) {
143 data(thread)->_gclab_size = v;
144 }
145
146 static void set_disarmed_value(Thread* thread, int value) {
147 data(thread)->_disarmed_value = value;
148 }
149
150 #ifdef ASSERT
151 static void set_evac_allowed(Thread* thread, bool evac_allowed) {
|