* exceptions.cc (call_handler): Streamline to use only one call to

ResumeThread.
* sigproc.cc (sig_send): Use a muto around the ReleaseSemaphore.  Remove
priority setting since it didn't solve anything.
This commit is contained in:
Christopher Faylor 2000-03-05 06:34:55 +00:00
parent ed8e99bf37
commit 68997e887d
3 changed files with 37 additions and 12 deletions

View File

@ -1,3 +1,10 @@
Sun Mar 5 01:17:05 2000 Christopher Faylor <cgf@cygnus.com>
* exceptions.cc (call_handler): Streamline to use only one call to
ResumeThread.
* sigproc.cc (sig_send): Use a muto around the ReleaseSemaphore.
Remove priority setting since it didn't solve anything.
Tue Feb 29 00:46:09 2000 Christopher Faylor <cgf@cygnus.com> Tue Feb 29 00:46:09 2000 Christopher Faylor <cgf@cygnus.com>
* sigproc.cc (sig_send): Temporarily set priority to highest while * sigproc.cc (sig_send): Temporarily set priority to highest while

View File

@ -719,7 +719,7 @@ call_handler (int sig, struct sigaction& siga, void *handler)
SetEvent (signal_arrived); // For an EINTR case SetEvent (signal_arrived); // For an EINTR case
sigproc_printf ("armed signal_arrived"); sigproc_printf ("armed signal_arrived");
exec_exit = sig; // Maybe we'll exit with this value exec_exit = sig; // Maybe we'll exit with this value
goto out; goto out1;
} }
hth = myself->getthread2signal (); hth = myself->getthread2signal ();
@ -749,7 +749,7 @@ call_handler (int sig, struct sigaction& siga, void *handler)
Sleep (0); Sleep (0);
} }
sigproc_printf ("suspend said %d, %E", res); sigproc_printf ("SuspendThread returned %d", res);
if (sigsave.cx) if (sigsave.cx)
{ {
@ -764,7 +764,6 @@ call_handler (int sig, struct sigaction& siga, void *handler)
if (!GetThreadContext (hth, cx)) if (!GetThreadContext (hth, cx))
{ {
system_printf ("couldn't get context of main thread, %E"); system_printf ("couldn't get context of main thread, %E");
ResumeThread (hth);
goto out; goto out;
} }
} }
@ -787,9 +786,11 @@ call_handler (int sig, struct sigaction& siga, void *handler)
proc_subproc(PROC_CLEARWAIT, 1); proc_subproc(PROC_CLEARWAIT, 1);
} }
(void) ResumeThread (hth);
out: out:
res = ResumeThread (hth);
sigproc_printf ("ResumeThread returned %d", res);
out1:
sigproc_printf ("returning %d", interrupted); sigproc_printf ("returning %d", interrupted);
return interrupted; return interrupted;
} }
@ -1046,6 +1047,9 @@ events_init (void)
*end = '\0'; *end = '\0';
} }
windows_system_directory_length = end - windows_system_directory; windows_system_directory_length = end - windows_system_directory;
debug_printf ("windows_system_directory '%s', windows_system_directory_length %d",
windows_system_directory, windows_system_directory_length);
debug_printf ("cygwin_hmodule %p", cygwin_hmodule);
} }
void void

View File

@ -99,8 +99,8 @@ Static int nzombies = 0; // Number of deceased children
Static waitq waitq_head = {0, 0, 0, 0, 0, 0, 0};// Start of queue for wait'ing threads Static waitq waitq_head = {0, 0, 0, 0, 0, 0, 0};// Start of queue for wait'ing threads
Static waitq waitq_main; // Storage for main thread Static waitq waitq_main; // Storage for main thread
muto NO_COPY *sync_proc_subproc = NULL; // Control access to muto NO_COPY *sync_proc_subproc = NULL; // Control access to subproc stuff
// subproc stuff muto NO_COPY *sync_sig_send = NULL; // Control access to sig_send
DWORD NO_COPY maintid = 0; // ID of the main thread DWORD NO_COPY maintid = 0; // ID of the main thread
DWORD NO_COPY sigtid = 0; // ID of the signal thread DWORD NO_COPY sigtid = 0; // ID of the signal thread
@ -618,6 +618,7 @@ sigproc_init ()
* access to the children and zombie arrays. * access to the children and zombie arrays.
*/ */
sync_proc_subproc = new_muto (FALSE, NULL); sync_proc_subproc = new_muto (FALSE, NULL);
sync_sig_send = new_muto (FALSE, NULL);
/* Initialize waitq structure for main thread. A waitq structure is /* Initialize waitq structure for main thread. A waitq structure is
* allocated for each thread that executes a wait to allow multiple threads * allocated for each thread that executes a wait to allow multiple threads
@ -770,18 +771,25 @@ sig_send (pinfo *p, int sig)
if (sd == NULL) if (sd == NULL)
sd = signal_dispatch_storage.create (); sd = signal_dispatch_storage.create ();
#endif #endif
sync_sig_send->acquire ();
/* Increment the sigtodo array to signify which signal to assert. /* Increment the sigtodo array to signify which signal to assert.
*/ */
(void) InterlockedIncrement (p->getsigtodo(sig)); (void) InterlockedIncrement (p->getsigtodo(sig));
/* Notify the process that a signal has arrived. /* Notify the process that a signal has arrived.
*/ */
int prio;
SetLastError (0); SetLastError (0);
#if 0
int prio;
prio = GetThreadPriority (GetCurrentThread ()); prio = GetThreadPriority (GetCurrentThread ());
(void) SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL); (void) SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_TIME_CRITICAL);
#endif
if (!ReleaseSemaphore (thiscatch, 1, NULL) && (int) GetLastError () > 0) if (!ReleaseSemaphore (thiscatch, 1, NULL) && (int) GetLastError () > 0)
{ {
sigproc_printf ("ReleaseSemaphore failed, %E");
/* Couldn't signal the semaphore. This probably means that the /* Couldn't signal the semaphore. This probably means that the
* process is exiting. * process is exiting.
*/ */
@ -799,6 +807,7 @@ sig_send (pinfo *p, int sig)
} }
goto out; goto out;
} }
sigproc_printf ("ReleaseSemaphore succeeded");
/* No need to wait for signal completion unless this was a signal to /* No need to wait for signal completion unless this was a signal to
* this process. * this process.
@ -809,16 +818,19 @@ sig_send (pinfo *p, int sig)
*/ */
if (!wait_for_completion) if (!wait_for_completion)
{ {
rc = WAIT_OBJECT_0; rc = WAIT_OBJECT_0;
sip_printf ("Not waiting for sigcomplete. its_me %d sig %d", its_me, sig); sip_printf ("Not waiting for sigcomplete. its_me %d sig %d", its_me, sig);
if (!its_me) sync_sig_send->release ();
ForceCloseHandle (thiscatch); if (!its_me)
ForceCloseHandle (thiscatch);
} }
else else
{ {
sip_printf ("Waiting for thiscomplete %p", thiscomplete); sip_printf ("Waiting for thiscomplete %p", thiscomplete);
SetLastError (0); SetLastError (0);
sync_sig_send->release ();
Sleep (0);
rc = WaitForSingleObject (thiscomplete, WSSC); rc = WaitForSingleObject (thiscomplete, WSSC);
/* Check for strangeness due to this thread being redirected by the /* Check for strangeness due to this thread being redirected by the
signal handler. Sometimes a WAIT_TIMEOUT will occur when the signal handler. Sometimes a WAIT_TIMEOUT will occur when the
@ -829,7 +841,9 @@ sig_send (pinfo *p, int sig)
rc = WAIT_OBJECT_0; rc = WAIT_OBJECT_0;
} }
#if 0
SetThreadPriority (GetCurrentThread (), prio); SetThreadPriority (GetCurrentThread (), prio);
#endif
if (rc == WAIT_OBJECT_0) if (rc == WAIT_OBJECT_0)
rc = 0; // Successful exit rc = 0; // Successful exit