< prev index next >

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

Print this page
rev 10742 : Make fields used in lock-free algorithms volatile


 433   }
 434 }
 435 
 436 
 437 SubTasksDone::~SubTasksDone() {
 438   if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks);
 439 }
 440 
 441 // *** SequentialSubTasksDone
 442 
 443 void SequentialSubTasksDone::clear() {
 444   _n_tasks   = _n_claimed   = 0;
 445   _n_threads = _n_completed = 0;
 446 }
 447 
 448 bool SequentialSubTasksDone::valid() {
 449   return _n_threads > 0;
 450 }
 451 
 452 bool SequentialSubTasksDone::is_task_claimed(uint& t) {
 453   uint* n_claimed_ptr = &_n_claimed;
 454   t = *n_claimed_ptr;
 455   while (t < _n_tasks) {
 456     jint res = Atomic::cmpxchg(t+1, n_claimed_ptr, t);
 457     if (res == (jint)t) {
 458       return false;
 459     }
 460     t = *n_claimed_ptr;
 461   }
 462   return true;
 463 }
 464 
 465 bool SequentialSubTasksDone::all_tasks_completed() {
 466   uint* n_completed_ptr = &_n_completed;
 467   uint  complete        = *n_completed_ptr;
 468   while (true) {
 469     uint res = Atomic::cmpxchg(complete+1, n_completed_ptr, complete);
 470     if (res == complete) {
 471       break;
 472     }
 473     complete = res;
 474   }
 475   if (complete+1 == _n_threads) {
 476     clear();
 477     return true;
 478   }
 479   return false;
 480 }


 433   }
 434 }
 435 
 436 
 437 SubTasksDone::~SubTasksDone() {
 438   if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks);
 439 }
 440 
 441 // *** SequentialSubTasksDone
 442 
 443 void SequentialSubTasksDone::clear() {
 444   _n_tasks   = _n_claimed   = 0;
 445   _n_threads = _n_completed = 0;
 446 }
 447 
 448 bool SequentialSubTasksDone::valid() {
 449   return _n_threads > 0;
 450 }
 451 
 452 bool SequentialSubTasksDone::is_task_claimed(uint& t) {
 453   t = _n_claimed;

 454   while (t < _n_tasks) {
 455     jint res = Atomic::cmpxchg(t+1, &_n_claimed, t);
 456     if (res == (jint)t) {
 457       return false;
 458     }
 459     t = res;
 460   }
 461   return true;
 462 }
 463 
 464 bool SequentialSubTasksDone::all_tasks_completed() {
 465   uint complete = _n_completed;

 466   while (true) {
 467     uint res = Atomic::cmpxchg(complete+1, &_n_completed, complete);
 468     if (res == complete) {
 469       break;
 470     }
 471     complete = res;
 472   }
 473   if (complete+1 == _n_threads) {
 474     clear();
 475     return true;
 476   }
 477   return false;
 478 }
< prev index next >