Esempio n. 1
0
File: nile.c Progetto: NV/nile
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);
}
Esempio n. 2
0
File: nile.c Progetto: nhemsley/nile
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);
}