diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2004-02-06 16:25:58 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2004-02-06 16:25:58 +0000 |
commit | 373a036f7bcdc9ef29f340752024c976b1695d34 (patch) | |
tree | 7fb89276c893d104046bfdb65005ae24a23d3c7d /winsup/cygserver/bsd_mutex.cc | |
parent | 2a566ac3ef08f056895433468390c116e22a5589 (diff) | |
download | cygnal-373a036f7bcdc9ef29f340752024c976b1695d34.tar.gz cygnal-373a036f7bcdc9ef29f340752024c976b1695d34.tar.bz2 cygnal-373a036f7bcdc9ef29f340752024c976b1695d34.zip |
* bsd_mutex.cc (_msleep): Handle PCATCH using signal_arrived event.
* client.cc: Include sigproc.h.
* msg.cc (client_request_msg::serve): Accomodate third parameter to
process::process.
* sem.cc (client_request_sem::serve): Ditto.
* shm.cc (client_request_shm::serve): Ditto.
* process.cc (process::process): Duplicate signal_arrived into
Cygserver process space.
(process::~process): Close _signal_arrived handle.
(process_cache::process): Add signal_arrived handling.
* process.h (process::process): Add signal_arrived parameter.
(process:signal_arrived): New read accessor.
(process:_signal_arrived): New member.
(process_cache::process): Add signal_arrived parameter.
Diffstat (limited to 'winsup/cygserver/bsd_mutex.cc')
-rw-r--r-- | winsup/cygserver/bsd_mutex.cc | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/winsup/cygserver/bsd_mutex.cc b/winsup/cygserver/bsd_mutex.cc index 9c7485b7f..af23f5668 100644 --- a/winsup/cygserver/bsd_mutex.cc +++ b/winsup/cygserver/bsd_mutex.cc @@ -188,9 +188,14 @@ _msleep (void *ident, struct mtx *mtx, int priority, if (mtx) mtx_unlock (mtx); int old_priority = set_priority (priority); - /* PCATCH can't be handled here. */ - HANDLE obj[3] = { evt, td->client->handle (), msleep_glob_evt }; - switch (WaitForMultipleObjects (3, obj, FALSE, timo ?: INFINITE)) + HANDLE obj[4] = { evt, td->client->handle (), msleep_glob_evt, td->client->signal_arrived () }; + /* PCATCH handling. If PCATCH is given and signal_arrived is a valid + handle, then it's used in the WaitFor call and EINTR is returned. */ + int obj_cnt = 3; + if ((priority & PCATCH) + && td->client->signal_arrived () != INVALID_HANDLE_VALUE) + obj_cnt = 4; + switch (WaitForMultipleObjects (obj_cnt, obj, FALSE, timo ?: INFINITE)) { case WAIT_OBJECT_0: /* wakeup() has been called. */ ret = 0; @@ -201,6 +206,9 @@ _msleep (void *ident, struct mtx *mtx, int priority, case WAIT_OBJECT_0 + 1: /* The dependent process has exited. */ ret = EIDRM; break; + case WAIT_OBJECT_0 + 3: /* Signal for calling process arrived. */ + ret = EINTR; + break; case WAIT_TIMEOUT: ret = EWOULDBLOCK; break; |