3360 };
3361
3362 void G1CollectedHeap::string_dedup_cleaning(BoolObjectClosure* is_alive,
3363 OopClosure* keep_alive,
3364 G1GCPhaseTimes* phase_times) {
3365 G1StringDedupCleaningTask cl(is_alive, keep_alive, phase_times);
3366 workers()->run_task(&cl);
3367 }
3368
3369 class G1RedirtyLoggedCardsTask : public AbstractGangTask {
3370 private:
3371 G1RedirtyCardsQueueSet* _qset;
3372 G1CollectedHeap* _g1h;
3373 BufferNode* volatile _nodes;
3374
3375 void par_apply(RedirtyLoggedCardTableEntryClosure* cl, uint worker_id) {
3376 size_t buffer_size = _qset->buffer_size();
3377 BufferNode* next = Atomic::load(&_nodes);
3378 while (next != NULL) {
3379 BufferNode* node = next;
3380 next = Atomic::cmpxchg(node->next(), &_nodes, node);
3381 if (next == node) {
3382 cl->apply_to_buffer(node, buffer_size, worker_id);
3383 next = node->next();
3384 }
3385 }
3386 }
3387
3388 public:
3389 G1RedirtyLoggedCardsTask(G1RedirtyCardsQueueSet* qset, G1CollectedHeap* g1h) :
3390 AbstractGangTask("Redirty Cards"),
3391 _qset(qset), _g1h(g1h), _nodes(qset->all_completed_buffers()) { }
3392
3393 virtual void work(uint worker_id) {
3394 G1GCPhaseTimes* p = _g1h->phase_times();
3395 G1GCParPhaseTimesTracker x(p, G1GCPhaseTimes::RedirtyCards, worker_id);
3396
3397 RedirtyLoggedCardTableEntryClosure cl(_g1h);
3398 par_apply(&cl, worker_id);
3399
3400 p->record_thread_work_item(G1GCPhaseTimes::RedirtyCards, worker_id, cl.num_dirtied());
|
3360 };
3361
3362 void G1CollectedHeap::string_dedup_cleaning(BoolObjectClosure* is_alive,
3363 OopClosure* keep_alive,
3364 G1GCPhaseTimes* phase_times) {
3365 G1StringDedupCleaningTask cl(is_alive, keep_alive, phase_times);
3366 workers()->run_task(&cl);
3367 }
3368
3369 class G1RedirtyLoggedCardsTask : public AbstractGangTask {
3370 private:
3371 G1RedirtyCardsQueueSet* _qset;
3372 G1CollectedHeap* _g1h;
3373 BufferNode* volatile _nodes;
3374
3375 void par_apply(RedirtyLoggedCardTableEntryClosure* cl, uint worker_id) {
3376 size_t buffer_size = _qset->buffer_size();
3377 BufferNode* next = Atomic::load(&_nodes);
3378 while (next != NULL) {
3379 BufferNode* node = next;
3380 next = Atomic::cmpxchg(&_nodes, node, node->next());
3381 if (next == node) {
3382 cl->apply_to_buffer(node, buffer_size, worker_id);
3383 next = node->next();
3384 }
3385 }
3386 }
3387
3388 public:
3389 G1RedirtyLoggedCardsTask(G1RedirtyCardsQueueSet* qset, G1CollectedHeap* g1h) :
3390 AbstractGangTask("Redirty Cards"),
3391 _qset(qset), _g1h(g1h), _nodes(qset->all_completed_buffers()) { }
3392
3393 virtual void work(uint worker_id) {
3394 G1GCPhaseTimes* p = _g1h->phase_times();
3395 G1GCParPhaseTimesTracker x(p, G1GCPhaseTimes::RedirtyCards, worker_id);
3396
3397 RedirtyLoggedCardTableEntryClosure cl(_g1h);
3398 par_apply(&cl, worker_id);
3399
3400 p->record_thread_work_item(G1GCPhaseTimes::RedirtyCards, worker_id, cl.num_dirtied());
|