Make empth_wakeup() and empth_terminate() wake up empth_sleep(), and

empth_sleep() return whether that happened:
[EMPTH_LWP] (lwpWakeupSleep): New, factored out of lwpSelect().
[EMPTH_LWP] (lwpSelect): Use it.
[EMPTH_LWP] (lwpWakeup): New.  Call lwpWakeupFd() if sleeping in
lwpSleepFd(), lwpWakeupSleep() if sleeping in lwpSleepUntil().
[EMPTH_LWP] (lwpTerminate, empth_wakeup): Use it rather than
lwpWakeupFd().
[EMPTH_LWP] (lwpWakeupFd): Internal linkage.
[EMPTH_LWP] (lwpSleepUntil): Reset member runtime, so that lwpWakeup()
can test it reliably.  Return how sleep woke up.
[EMPTH_LWP] (empth_sleep): Return value of lwpSleepUntil().
[EMPTH_POSIX] (EMPTH_INTR): New.
[EMPTH_POSIX] (empth_wakeup): Set state to it.
[EMPTH_POSIX] (empth_restorectx): Clear state.
[EMPTH_POSIX] (empth_sleep): Don't re-seleep when state is not clear,
i.e. thread was woken up prematurely.  Return how sleep woke up.
[EMPTH_W32] (empth_sleep): Implement by waiting on hThreadEvent with a
timeout rather than a straight Sleep().  Return how sleep woke up.
This commit is contained in:
Markus Armbruster 2007-02-08 11:26:43 +00:00
parent fe2de3d743
commit cea39829af
7 changed files with 80 additions and 45 deletions

View file

@ -599,21 +599,25 @@ empth_wakeup(empth_t *pThread)
*
* Put the given thread to sleep...
*/
void
int
empth_sleep(time_t until)
{
long lSec;
empth_t *pThread = TlsGetValue(dwTLSIndex);
int iReturn = 0;
loc_BlockThisThread();
if ((lSec = until - time(0)) > 0) {
loc_BlockThisThread();
loc_debug("going to sleep %ld sec", lSec);
while ((lSec = until - time(0)) > 0) {
loc_debug("going to sleep %ld sec", lSec);
Sleep(lSec * 1000L);
if (WaitForSingleObject(pThread->hThreadEvent, lSec * 1000L) !=
WAIT_TIMEOUT)
iReturn = -1;
loc_debug("sleep done. Waiting to run.");
loc_RunThisThread(NULL);
}
loc_debug("sleep done. Waiting to run.");
loc_RunThisThread(NULL);
return iReturn;
}
/************************