455 }
456 }
457
458
459 SubTasksDone::~SubTasksDone() {
460 if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks);
461 }
462
463 // *** SequentialSubTasksDone
464
465 void SequentialSubTasksDone::clear() {
466 _n_tasks = _n_claimed = 0;
467 _n_threads = _n_completed = 0;
468 }
469
470 bool SequentialSubTasksDone::valid() {
471 return _n_threads > 0;
472 }
473
474 bool SequentialSubTasksDone::is_task_claimed(uint& t) {
475 uint* n_claimed_ptr = &_n_claimed;
476 t = *n_claimed_ptr;
477 while (t < _n_tasks) {
478 jint res = Atomic::cmpxchg(t+1, n_claimed_ptr, t);
479 if (res == (jint)t) {
480 return false;
481 }
482 t = *n_claimed_ptr;
483 }
484 return true;
485 }
486
487 bool SequentialSubTasksDone::all_tasks_completed() {
488 uint* n_completed_ptr = &_n_completed;
489 uint complete = *n_completed_ptr;
490 while (true) {
491 uint res = Atomic::cmpxchg(complete+1, n_completed_ptr, complete);
492 if (res == complete) {
493 break;
494 }
495 complete = res;
496 }
497 if (complete+1 == _n_threads) {
498 clear();
499 return true;
500 }
501 return false;
502 }
|
455 }
456 }
457
458
459 SubTasksDone::~SubTasksDone() {
460 if (_tasks != NULL) FREE_C_HEAP_ARRAY(jint, _tasks);
461 }
462
463 // *** SequentialSubTasksDone
464
465 void SequentialSubTasksDone::clear() {
466 _n_tasks = _n_claimed = 0;
467 _n_threads = _n_completed = 0;
468 }
469
470 bool SequentialSubTasksDone::valid() {
471 return _n_threads > 0;
472 }
473
474 bool SequentialSubTasksDone::is_task_claimed(uint& t) {
475 t = *(&_n_claimed);
476 while (t < _n_tasks) {
477 jint res = Atomic::cmpxchg(t+1, &_n_claimed, t);
478 if (res == (jint)t) {
479 return false;
480 }
481 t = res;
482 }
483 return true;
484 }
485
486 bool SequentialSubTasksDone::all_tasks_completed() {
487 uint complete = *(&_n_completed);
488 while (true) {
489 uint res = Atomic::cmpxchg(complete+1, &_n_completed, complete);
490 if (res == complete) {
491 break;
492 }
493 complete = res;
494 }
495 if (complete+1 == _n_threads) {
496 clear();
497 return true;
498 }
499 return false;
500 }
|