Simplify. Should also be more efficient.

(LwpSigCheck): New.
(lwpCatchAwaitedSig): Set it.
(lwpSigWait): Clear it.
(lwpSigWakeup): Test it.
(lwpSigWakeup): Unblock LwpSigWaiter without testing LwpSigCatched.
(lwpSigWait): Test LwpSigCatched after wakeup.
(LwpSigAwaited, LwpSigPtr): Remove.
This commit is contained in:
Markus Armbruster 2007-01-31 20:23:07 +00:00
parent 3788676530
commit fe2de3d743

View file

@ -28,7 +28,7 @@
* sig.c: Wait for signals * sig.c: Wait for signals
* *
* Known contributors to this file: * Known contributors to this file:
* Markus Armbruster, 2006 * Markus Armbruster, 2006-2007
*/ */
#include <config.h> #include <config.h>
@ -38,21 +38,20 @@
#include "lwp.h" #include "lwp.h"
#include "lwpint.h" #include "lwpint.h"
/* Signals awaited by lwpSigWait() */
static sigset_t *LwpSigAwaited;
/* /*
* Signals from LwpSigAwaited catched so far * Signals catched so far.
* Access only with signals blocked! * Access only with signals blocked!
*/ */
static sigset_t LwpSigCatched; static sigset_t LwpSigCatched;
/*
* LwpSigCatched changed since last
*/
static sig_atomic_t LwpSigCheck;
/* The thread waiting for signals in lwpSigWait() */ /* The thread waiting for signals in lwpSigWait() */
static struct lwpProc *LwpSigWaiter; static struct lwpProc *LwpSigWaiter;
/* Where to return the signal number to the thread in lwpSigWait() */
static int *LwpSigPtr;
static void lwpCatchAwaitedSig(int); static void lwpCatchAwaitedSig(int);
/* /*
@ -80,6 +79,7 @@ static void
lwpCatchAwaitedSig(int sig) lwpCatchAwaitedSig(int sig)
{ {
sigaddset(&LwpSigCatched, sig); sigaddset(&LwpSigCatched, sig);
LwpSigCheck = 1;
} }
/* /*
@ -119,14 +119,14 @@ lwpSigWait(sigset_t *set, int *sig)
if (CANT_HAPPEN(LwpSigWaiter)) if (CANT_HAPPEN(LwpSigWaiter))
return EBUSY; return EBUSY;
res = lwpGetSig(set); for (;;) {
if (res <= 0) { LwpSigCheck = 0;
res = lwpGetSig(set);
if (res > 0)
break;
lwpStatus(LwpCurrent, "Waiting for signals"); lwpStatus(LwpCurrent, "Waiting for signals");
LwpSigAwaited = set;
LwpSigPtr = sig;
LwpSigWaiter = LwpCurrent; LwpSigWaiter = LwpCurrent;
lwpReschedule(); lwpReschedule();
return 0;
} }
*sig = res; *sig = res;
return 0; return 0;
@ -139,13 +139,7 @@ lwpSigWait(sigset_t *set, int *sig)
void void
lwpSigWakeup(void) lwpSigWakeup(void)
{ {
int res; if (LwpSigWaiter && LwpSigCheck) {
if (!LwpSigWaiter)
return;
res = lwpGetSig(LwpSigAwaited);
if (res > 0) {
*LwpSigPtr = res;
lwpReady(LwpSigWaiter); lwpReady(LwpSigWaiter);
LwpSigWaiter = NULL; LwpSigWaiter = NULL;
} }