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 } |