< prev index next >

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

Print this page

        

*** 151,172 **** WorkData worker_wait_for_task() { // Wait for the coordinator to dispatch a task. _start_semaphore->wait(); ! uint num_started = Atomic::add(1u, &_started); // Subtract one to get a zero-indexed worker id. uint worker_id = num_started - 1; return WorkData(_task, worker_id); } void worker_done_with_task() { // Mark that the worker is done with the task. // The worker is not allowed to read the state variables after this line. ! uint not_finished = Atomic::sub(1u, &_not_finished); // The last worker signals to the coordinator that all work is completed. if (not_finished == 0) { _end_semaphore->signal(); } --- 151,172 ---- WorkData worker_wait_for_task() { // Wait for the coordinator to dispatch a task. _start_semaphore->wait(); ! uint num_started = Atomic::add(&_started, 1u); // Subtract one to get a zero-indexed worker id. uint worker_id = num_started - 1; return WorkData(_task, worker_id); } void worker_done_with_task() { // Mark that the worker is done with the task. // The worker is not allowed to read the state variables after this line. ! uint not_finished = Atomic::sub(&_not_finished, 1u); // The last worker signals to the coordinator that all work is completed. if (not_finished == 0) { _end_semaphore->signal(); }
*** 424,434 **** bool SubTasksDone::try_claim_task(uint t) { assert(t < _n_tasks, "bad task id."); uint old = _tasks[t]; if (old == 0) { ! old = Atomic::cmpxchg(1u, &_tasks[t], 0u); } bool res = old == 0; #ifdef ASSERT if (res) { assert(_claimed < _n_tasks, "Too many tasks claimed; missing clear?"); --- 424,434 ---- bool SubTasksDone::try_claim_task(uint t) { assert(t < _n_tasks, "bad task id."); uint old = _tasks[t]; if (old == 0) { ! old = Atomic::cmpxchg(&_tasks[t], 0u, 1u); } bool res = old == 0; #ifdef ASSERT if (res) { assert(_claimed < _n_tasks, "Too many tasks claimed; missing clear?");
*** 441,451 **** void SubTasksDone::all_tasks_completed(uint n_threads) { uint observed = _threads_completed; uint old; do { old = observed; ! observed = Atomic::cmpxchg(old+1, &_threads_completed, old); } while (observed != old); // If this was the last thread checking in, clear the tasks. uint adjusted_thread_count = (n_threads == 0 ? 1 : n_threads); if (observed + 1 == adjusted_thread_count) { clear(); --- 441,451 ---- void SubTasksDone::all_tasks_completed(uint n_threads) { uint observed = _threads_completed; uint old; do { old = observed; ! observed = Atomic::cmpxchg(&_threads_completed, old, old+1); } while (observed != old); // If this was the last thread checking in, clear the tasks. uint adjusted_thread_count = (n_threads == 0 ? 1 : n_threads); if (observed + 1 == adjusted_thread_count) { clear();
*** 469,479 **** } bool SequentialSubTasksDone::try_claim_task(uint& t) { t = _n_claimed; while (t < _n_tasks) { ! uint res = Atomic::cmpxchg(t+1, &_n_claimed, t); if (res == t) { return true; } t = res; } --- 469,479 ---- } bool SequentialSubTasksDone::try_claim_task(uint& t) { t = _n_claimed; while (t < _n_tasks) { ! uint res = Atomic::cmpxchg(&_n_claimed, t, t+1); if (res == t) { return true; } t = res; }
*** 481,491 **** } bool SequentialSubTasksDone::all_tasks_completed() { uint complete = _n_completed; while (true) { ! uint res = Atomic::cmpxchg(complete+1, &_n_completed, complete); if (res == complete) { break; } complete = res; } --- 481,491 ---- } bool SequentialSubTasksDone::all_tasks_completed() { uint complete = _n_completed; while (true) { ! uint res = Atomic::cmpxchg(&_n_completed, complete, complete+1); if (res == complete) { break; } complete = res; }
< prev index next >