/** * Wakeup a task from within another task - this internal function * is called in _LpelTaskUnblock() * TODO: wakeup from without a task, i.e. from kernel by an asynchronous * interrupt for a completed request? * -> by == NULL, at least there is no valid by->worker_context */ void LpelWorkerTaskWakeup( lpel_task_t *by, lpel_task_t *whom) { /* worker context of the task to be woken up */ workerctx_t *wc = whom->worker_context; if (wc->wid < 0) { SendWakeup( wc, whom); } else { if ( !by || (by->worker_context != whom->worker_context)) { SendWakeup( wc, whom); } else { assert(whom->state != TASK_READY); whom->state = TASK_READY; LpelSchedMakeReady( wc->sched, whom); } } }
bool TestRPCRacesParent::AnswerStackFrame() { if (!SendWakeup()) fail("can't wake up the child"); if (!CallRace(&mChildHasReply)) fail("can't set up race condition"); mHasReply = true; if (!mChildHasReply) fail("child should have got a reply already"); return true; }