* exceptions.cc (interruptible): Make a little more structured.

(call_handler): Allow signals to be sent even if signalled thread is stopped.
Change order of signal_arrived arming/waiting threads clearing to eliminate a
race.
(reset_signal_arrived): New helper function.
* malloc.cc (malloc_init): Use mutos so that signal handler can keep track of
who owns the lock.
(__malloc_lock): Ditto.
(__malloc_unlock): Ditto.
* sync.h (new_muto): Actually use a muto for the "buffer".
* Makefile.in: Fix a dependency.
This commit is contained in:
Christopher Faylor
2000-02-26 01:11:54 +00:00
parent 52aaab48f4
commit 8656ee07ef
11 changed files with 77 additions and 46 deletions

View File

@ -13,6 +13,7 @@ details. */
#include "winsup.h"
#include <stdlib.h>
#include "sync.h"
/* we provide these stubs to call into a user's
provided malloc if there is one - otherwise
@ -200,12 +201,12 @@ _strdup_r (struct _reent *, const char *s)
newlib will call __malloc_lock and __malloc_unlock at appropriate
times. */
static NO_COPY CRITICAL_SECTION malloc_critical_section;
static NO_COPY muto *mprotect = NULL;
void
malloc_init ()
{
InitializeCriticalSection (&malloc_critical_section);
mprotect = new_muto (FALSE, NULL);
/* Check if mallock is provided by application. If so, redirect all
calls to export_malloc/free/realloc to application provided. This may
happen if some other dll calls cygwin's malloc, but main code provides
@ -226,12 +227,12 @@ extern "C"
void
__malloc_lock (struct _reent *)
{
SetResourceLock(LOCK_MEMORY_LIST,WRITE_LOCK|READ_LOCK," __malloc_lock");
mprotect->acquire ();
}
extern "C"
void
__malloc_unlock (struct _reent *)
{
ReleaseResourceLock(LOCK_MEMORY_LIST,WRITE_LOCK|READ_LOCK," __malloc_unlock");
mprotect->release ();
}