summaryrefslogtreecommitdiffstats
path: root/winsup/cygserver/bsd_mutex.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2004-02-06 16:25:58 +0000
committerCorinna Vinschen <corinna@vinschen.de>2004-02-06 16:25:58 +0000
commit373a036f7bcdc9ef29f340752024c976b1695d34 (patch)
tree7fb89276c893d104046bfdb65005ae24a23d3c7d /winsup/cygserver/bsd_mutex.cc
parent2a566ac3ef08f056895433468390c116e22a5589 (diff)
downloadcygnal-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.cc14
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;