PR_IMPLEMENT(PRStatus) PRP_NakedWait( PRCondVar *cvar, PRLock *lock, PRIntervalTime timeout) { PRThread *me = _PR_MD_CURRENT_THREAD(); PR_ASSERT(_PR_NAKED_CV_LOCK == cvar->lock); return _PR_WaitCondVar(me, cvar, lock, timeout); } /* PRP_NakedWait */
PR_IMPLEMENT(PRStatus) PR_WaitCondVar(PRCondVar *cvar, PRIntervalTime timeout) { PRThread *me = _PR_MD_CURRENT_THREAD(); PR_ASSERT(cvar->lock->owner == me); PR_ASSERT(me != suspendAllThread); if (cvar->lock->owner != me) return PR_FAILURE; return _PR_WaitCondVar(me, cvar, cvar->lock, timeout); }
/* ** Wait for a notify on the condition variable. Sleep for "ticks" amount ** of time (if "tick" is 0 then the sleep is indefinite). While ** the thread is waiting it exits the monitors lock (as if it called ** PR_ExitMonitor as many times as it had called PR_EnterMonitor). When ** the wait has finished the thread regains control of the monitors lock ** with the same entry count as before the wait began. ** ** The thread waiting on the monitor will be resumed when the monitor is ** notified (assuming the thread is the next in line to receive the ** notify) or when the "ticks" elapses. ** ** Returns PR_FAILURE if the caller has not locked the lock associated ** with the condition variable. ** This routine can return PR_PENDING_INTERRUPT if the waiting thread ** has been interrupted. */ PR_IMPLEMENT(PRStatus) PR_Wait(PRMonitor *mon, PRIntervalTime ticks) { PRUintn entryCount; PRStatus status; PRThread *me = _PR_MD_CURRENT_THREAD(); if (mon->cvar->lock->owner != me) return PR_FAILURE; entryCount = mon->entryCount; mon->entryCount = 0; status = _PR_WaitCondVar(me, mon->cvar, mon->cvar->lock, ticks); mon->entryCount = entryCount; return status; }