void nile_sync (nile_Process_t *init) { int i; nile_Process_t *p; nile_Thread_t *liaison = nile_Process_deactivate (init, NULL); nile_Thread_t *worker = &liaison->threads[0]; nile_Thread_transfer_heaps (liaison, worker); for (i = 1; i < liaison->nthreads; i++) liaison->threads[i].sync = 1; if ((p = (nile_Process_t *) nile_Thread_steal_from_q (worker))) nile_Thread_work (worker, p); while (worker->status == NILE_STATUS_OK) { p = (nile_Process_t *) nile_Thread_steal (worker, nile_Thread_steal_from_q); if (p) nile_Thread_work (worker, p); else if (nile_Sleep_is_quiescent (worker->sleep)) break; else nile_Sleep_doze (1000); } for (i = 1; i < liaison->nthreads; i++) liaison->threads[i].sync = 0; nile_Thread_transfer_heaps (worker, liaison); nile_Process_activate (init, liaison); }
void nile_sync (nile_Process_t *init) { int i; nile_Process_t *p; nile_Thread_t *liaison = nile_Process_deactivate (init, NULL); nile_Thread_t *worker = &liaison->threads[0]; nile_Thread_transfer_heaps (liaison, worker); for (i = 1; i < liaison->nthreads; i++) liaison->threads[i].sync = 1; if ((p = nile_Thread_steal_from_q (worker))) nile_Thread_work (worker, p); while (worker->status == NILE_STATUS_OK && (p = nile_Thread_steal (worker, nile_Thread_steal_from_q))) nile_Thread_work (worker, p); nile_Sleep_wait_for_quiecent (liaison->sleep); for (i = 1; i < liaison->nthreads; i++) liaison->threads[i].sync = 0; nile_Thread_transfer_heaps (worker, liaison); nile_Process_activate (init, liaison); }