summaryrefslogtreecommitdiffstats
path: root/winsup/cygserver/process.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/process.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/process.cc')
-rw-r--r--winsup/cygserver/process.cc19
1 files changed, 15 insertions, 4 deletions
diff --git a/winsup/cygserver/process.cc b/winsup/cygserver/process.cc
index 1cad23887..8f1ff5776 100644
--- a/winsup/cygserver/process.cc
+++ b/winsup/cygserver/process.cc
@@ -40,10 +40,11 @@ process_cleanup::process ()
/*****************************************************************************/
-process::process (const pid_t cygpid, const DWORD winpid)
+process::process (const pid_t cygpid, const DWORD winpid, HANDLE signal_arrived)
: _cygpid (cygpid),
_winpid (winpid),
_hProcess (NULL),
+ _signal_arrived (INVALID_HANDLE_VALUE),
_cleaning_up (false),
_exit_status (STILL_ACTIVE),
_routines_head (NULL),
@@ -60,13 +61,22 @@ process::process (const pid_t cygpid, const DWORD winpid)
else
debug_printf ("got handle %p for new cache process %d(%lu)",
_hProcess, _cygpid, _winpid);
+ if (signal_arrived != INVALID_HANDLE_VALUE)
+ {
+ if (!DuplicateHandle (_hProcess, signal_arrived,
+ GetCurrentProcess (), &_signal_arrived,
+ 0, FALSE, DUPLICATE_SAME_ACCESS))
+ system_printf ("error getting signal_arrived to server (%lu)",
+ GetLastError ());
+ }
InitializeCriticalSection (&_access);
}
process::~process ()
{
DeleteCriticalSection (&_access);
- (void) CloseHandle (_hProcess);
+ CloseHandle (_signal_arrived);
+ CloseHandle (_hProcess);
}
/* No need to be thread-safe as this is only ever called by
@@ -221,7 +231,8 @@ process_cache::~process_cache ()
* have been deleted once it has been unlocked.
*/
class process *
-process_cache::process (const pid_t cygpid, const DWORD winpid)
+process_cache::process (const pid_t cygpid, const DWORD winpid,
+ HANDLE signal_arrived)
{
/* TODO: make this more granular, so a search doesn't involve the
* write lock.
@@ -243,7 +254,7 @@ process_cache::process (const pid_t cygpid, const DWORD winpid)
return NULL;
}
- entry = new class process (cygpid, winpid);
+ entry = new class process (cygpid, winpid, signal_arrived);
if (!entry->is_active ())
{
LeaveCriticalSection (&_cache_write_access);