62 // 32-bit: 4K * 8 = 32KiB; 64-bit: 8K * 16 = 128KiB
63 #define QUEUE_SIZE (1 << NOT_LP64(12) LP64_ONLY(13))
64 typedef OverflowTaskQueue<ObjArrayTask, mtGC, QUEUE_SIZE> ObjArrayTaskQueue;
65 typedef GenericTaskQueueSet<ObjArrayTaskQueue, mtGC> ObjArrayTaskQueueSet;
66 #undef QUEUE_SIZE
67
68 static ParCompactionManager** _manager_array;
69 static OopTaskQueueSet* _stack_array;
70 static ObjArrayTaskQueueSet* _objarray_queues;
71 static ObjectStartArray* _start_array;
72 static RegionTaskQueueSet* _region_array;
73 static PSOldGen* _old_gen;
74
75 private:
76 OverflowTaskQueue<oop, mtGC> _marking_stack;
77 ObjArrayTaskQueue _objarray_stack;
78
79 // Is there a way to reuse the _marking_stack for the
80 // saving empty regions? For now just create a different
81 // type of TaskQueue.
82 RegionTaskQueue* _region_stack;
83
84 static RegionTaskQueue** _region_list;
85 // Index in _region_list for current _region_stack.
86 uint _region_stack_index;
87
88 // Indexes of recycled region stacks/overflow stacks
89 // Stacks of regions to be compacted are embedded in the tasks doing
90 // the compaction. A thread that executes the task extracts the
91 // region stack and drains it. These threads keep these region
92 // stacks for use during compaction task stealing. If a thread
93 // gets a second draining task, it pushed its current region stack
94 // index into the array _recycled_stack_index and gets a new
95 // region stack from the task. A thread that is executing a
96 // compaction stealing task without ever having executing a
97 // draining task, will get a region stack from _recycled_stack_index.
98 //
99 // Array of indexes into the array of region stacks.
100 static uint* _recycled_stack_index;
101 // The index into _recycled_stack_index of the last region stack index
102 // pushed. If -1, there are no entries into _recycled_stack_index.
103 static int _recycled_top;
104 // The index into _recycled_stack_index of the last region stack index
105 // popped. If -1, there has not been any entry popped.
106 static int _recycled_bottom;
107
108 static ParMarkBitMap* _mark_bitmap;
109
110 Action _action;
111
112 HeapWord* _last_query_beg;
113 oop _last_query_obj;
114 size_t _last_query_ret;
115
116 static PSOldGen* old_gen() { return _old_gen; }
117 static ObjectStartArray* start_array() { return _start_array; }
118 static OopTaskQueueSet* stack_array() { return _stack_array; }
119
120 static void initialize(ParMarkBitMap* mbm);
121
122 protected:
123 // Array of tasks. Needed by the ParallelTaskTerminator.
124 static RegionTaskQueueSet* region_array() { return _region_array; }
125 OverflowTaskQueue<oop, mtGC>* marking_stack() { return &_marking_stack; }
126
134 void reset_bitmap_query_cache() {
135 _last_query_beg = NULL;
136 _last_query_obj = NULL;
137 _last_query_ret = 0;
138 }
139
140 Action action() { return _action; }
141 void set_action(Action v) { _action = v; }
142
143 // Bitmap query support, cache last query and result
144 HeapWord* last_query_begin() { return _last_query_beg; }
145 oop last_query_object() { return _last_query_obj; }
146 size_t last_query_return() { return _last_query_ret; }
147
148 void set_last_query_begin(HeapWord *new_beg) { _last_query_beg = new_beg; }
149 void set_last_query_object(oop new_obj) { _last_query_obj = new_obj; }
150 void set_last_query_return(size_t new_ret) { _last_query_ret = new_ret; }
151
152 static void reset_all_bitmap_query_caches();
153
154 RegionTaskQueue* region_stack() { return _region_stack; }
155 void set_region_stack(RegionTaskQueue* v) { _region_stack = v; }
156
157 inline static ParCompactionManager* manager_array(uint index);
158
159 inline static RegionTaskQueue* region_list(int index) {
160 return _region_list[index];
161 }
162
163 uint region_stack_index() { return _region_stack_index; }
164 void set_region_stack_index(uint v) { _region_stack_index = v; }
165
166 // Pop and push unique reusable stack index
167 static int pop_recycled_stack_index();
168 static void push_recycled_stack_index(uint v);
169 static void reset_recycled_stack_index() {
170 _recycled_bottom = _recycled_top = -1;
171 }
172
173 ParCompactionManager();
174 ~ParCompactionManager();
175
176 // Pushes onto the region stack at the given index. If the
177 // region stack is full,
178 // pushes onto the region overflow stack.
179 static void region_list_push(uint stack_index, size_t region_index);
180 static void verify_region_list_empty(uint stack_index);
181 ParMarkBitMap* mark_bitmap() { return _mark_bitmap; }
182
183 // void drain_stacks();
184
185 bool should_update();
186 bool should_copy();
187
188 // Save for later processing. Must not fail.
189 inline void push(oop obj);
190 inline void push_objarray(oop objarray, size_t index);
191 inline void push_region(size_t index);
192
193 // Check mark and maybe push on marking stack.
194 template <typename T> inline void mark_and_push(T* p);
195
196 inline void follow_klass(Klass* klass);
197
198 void follow_class_loader(ClassLoaderData* klass);
199
|
62 // 32-bit: 4K * 8 = 32KiB; 64-bit: 8K * 16 = 128KiB
63 #define QUEUE_SIZE (1 << NOT_LP64(12) LP64_ONLY(13))
64 typedef OverflowTaskQueue<ObjArrayTask, mtGC, QUEUE_SIZE> ObjArrayTaskQueue;
65 typedef GenericTaskQueueSet<ObjArrayTaskQueue, mtGC> ObjArrayTaskQueueSet;
66 #undef QUEUE_SIZE
67
68 static ParCompactionManager** _manager_array;
69 static OopTaskQueueSet* _stack_array;
70 static ObjArrayTaskQueueSet* _objarray_queues;
71 static ObjectStartArray* _start_array;
72 static RegionTaskQueueSet* _region_array;
73 static PSOldGen* _old_gen;
74
75 private:
76 OverflowTaskQueue<oop, mtGC> _marking_stack;
77 ObjArrayTaskQueue _objarray_stack;
78
79 // Is there a way to reuse the _marking_stack for the
80 // saving empty regions? For now just create a different
81 // type of TaskQueue.
82 RegionTaskQueue _region_stack;
83
84 static ParMarkBitMap* _mark_bitmap;
85
86 Action _action;
87
88 HeapWord* _last_query_beg;
89 oop _last_query_obj;
90 size_t _last_query_ret;
91
92 static PSOldGen* old_gen() { return _old_gen; }
93 static ObjectStartArray* start_array() { return _start_array; }
94 static OopTaskQueueSet* stack_array() { return _stack_array; }
95
96 static void initialize(ParMarkBitMap* mbm);
97
98 protected:
99 // Array of tasks. Needed by the ParallelTaskTerminator.
100 static RegionTaskQueueSet* region_array() { return _region_array; }
101 OverflowTaskQueue<oop, mtGC>* marking_stack() { return &_marking_stack; }
102
110 void reset_bitmap_query_cache() {
111 _last_query_beg = NULL;
112 _last_query_obj = NULL;
113 _last_query_ret = 0;
114 }
115
116 Action action() { return _action; }
117 void set_action(Action v) { _action = v; }
118
119 // Bitmap query support, cache last query and result
120 HeapWord* last_query_begin() { return _last_query_beg; }
121 oop last_query_object() { return _last_query_obj; }
122 size_t last_query_return() { return _last_query_ret; }
123
124 void set_last_query_begin(HeapWord *new_beg) { _last_query_beg = new_beg; }
125 void set_last_query_object(oop new_obj) { _last_query_obj = new_obj; }
126 void set_last_query_return(size_t new_ret) { _last_query_ret = new_ret; }
127
128 static void reset_all_bitmap_query_caches();
129
130 RegionTaskQueue* region_stack() { return &_region_stack; }
131
132 inline static ParCompactionManager* manager_array(uint index);
133
134 ParCompactionManager();
135
136 // Pushes onto the region stack at the given index. If the
137 // region stack is full,
138 // pushes onto the region overflow stack.
139 static void verify_region_list_empty(uint stack_index);
140 ParMarkBitMap* mark_bitmap() { return _mark_bitmap; }
141
142 // void drain_stacks();
143
144 bool should_update();
145 bool should_copy();
146
147 // Save for later processing. Must not fail.
148 inline void push(oop obj);
149 inline void push_objarray(oop objarray, size_t index);
150 inline void push_region(size_t index);
151
152 // Check mark and maybe push on marking stack.
153 template <typename T> inline void mark_and_push(T* p);
154
155 inline void follow_klass(Klass* klass);
156
157 void follow_class_loader(ClassLoaderData* klass);
158
|