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