< prev index next >

src/share/vm/gc/shared/workgroup.cpp

Print this page




 482   }
 483   return true;
 484 }
 485 
 486 bool SequentialSubTasksDone::all_tasks_completed() {
 487   uint* n_completed_ptr = &_n_completed;
 488   uint  complete        = *n_completed_ptr;
 489   while (true) {
 490     uint res = Atomic::cmpxchg(complete+1, n_completed_ptr, complete);
 491     if (res == complete) {
 492       break;
 493     }
 494     complete = res;
 495   }
 496   if (complete+1 == _n_threads) {
 497     clear();
 498     return true;
 499   }
 500   return false;
 501 }
 502 
 503 FreeIdSet::FreeIdSet(uint size, Monitor* mon) :
 504   _size(size), _mon(mon), _hd(0), _waiters(0), _claimed(0)
 505 {
 506   guarantee(size != 0, "must be");
 507   _ids = NEW_C_HEAP_ARRAY(uint, size, mtGC);
 508   for (uint i = 0; i < size - 1; i++) {
 509     _ids[i] = i+1;
 510   }
 511   _ids[size-1] = end_of_list; // end of list.
 512 }
 513 
 514 FreeIdSet::~FreeIdSet() {
 515   FREE_C_HEAP_ARRAY(uint, _ids);
 516 }
 517 
 518 uint FreeIdSet::claim_par_id() {
 519   MutexLockerEx x(_mon, Mutex::_no_safepoint_check_flag);
 520   while (_hd == end_of_list) {
 521     _waiters++;
 522     _mon->wait(Mutex::_no_safepoint_check_flag);
 523     _waiters--;
 524   }
 525   uint res = _hd;
 526   _hd = _ids[res];
 527   _ids[res] = claimed;  // For debugging.
 528   _claimed++;
 529   return res;
 530 }
 531 
 532 void FreeIdSet::release_par_id(uint id) {
 533   MutexLockerEx x(_mon, Mutex::_no_safepoint_check_flag);
 534   assert(_ids[id] == claimed, "Precondition.");
 535   _ids[id] = _hd;
 536   _hd = id;
 537   _claimed--;
 538   if (_waiters > 0) {
 539     _mon->notify_all();
 540   }
 541 }


 482   }
 483   return true;
 484 }
 485 
 486 bool SequentialSubTasksDone::all_tasks_completed() {
 487   uint* n_completed_ptr = &_n_completed;
 488   uint  complete        = *n_completed_ptr;
 489   while (true) {
 490     uint res = Atomic::cmpxchg(complete+1, n_completed_ptr, complete);
 491     if (res == complete) {
 492       break;
 493     }
 494     complete = res;
 495   }
 496   if (complete+1 == _n_threads) {
 497     clear();
 498     return true;
 499   }
 500   return false;
 501 }








































< prev index next >