mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-26 06:03:58 +08:00
initialize.c, adaint.c: Use Lock_Task and Unlock_Task for non-blocking spawn.
2008-08-22 Pascal Obry <obry@adacore.com> * initialize.c, adaint.c: Use Lock_Task and Unlock_Task for non-blocking spawn. From-SVN: r139476
This commit is contained in:
parent
a3d4a22b01
commit
af90c55af0
@ -2101,25 +2101,26 @@ __gnat_dup2 (int oldfd, int newfd)
|
||||
|
||||
/* Synchronization code, to be thread safe. */
|
||||
|
||||
static CRITICAL_SECTION plist_cs;
|
||||
#ifdef CERT
|
||||
|
||||
void
|
||||
__gnat_plist_init (void)
|
||||
{
|
||||
InitializeCriticalSection (&plist_cs);
|
||||
}
|
||||
/* For the Cert run times on native Windows we use dummy functions
|
||||
for locking and unlocking tasks since we do not support multiple
|
||||
threads on this configuration (Cert run time on native Windows). */
|
||||
|
||||
static void
|
||||
plist_enter (void)
|
||||
{
|
||||
EnterCriticalSection (&plist_cs);
|
||||
}
|
||||
void dummy (void) {}
|
||||
|
||||
static void
|
||||
plist_leave (void)
|
||||
{
|
||||
LeaveCriticalSection (&plist_cs);
|
||||
}
|
||||
void (*Lock_Task) () = &dummy;
|
||||
void (*Unlock_Task) () = &dummy;
|
||||
|
||||
#else
|
||||
|
||||
#define Lock_Task system__soft_links__lock_task
|
||||
extern void (*Lock_Task) (void);
|
||||
|
||||
#define Unlock_Task system__soft_links__unlock_task
|
||||
extern void (*Unlock_Task) (void);
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct _process_list
|
||||
{
|
||||
@ -2138,16 +2139,16 @@ add_handle (HANDLE h)
|
||||
|
||||
pl = (Process_List *) xmalloc (sizeof (Process_List));
|
||||
|
||||
plist_enter();
|
||||
|
||||
/* -------------------- critical section -------------------- */
|
||||
(*Lock_Task) ();
|
||||
|
||||
pl->h = h;
|
||||
pl->next = PLIST;
|
||||
PLIST = pl;
|
||||
++plist_length;
|
||||
/* -------------------- critical section -------------------- */
|
||||
|
||||
plist_leave();
|
||||
(*Unlock_Task) ();
|
||||
/* -------------------- critical section -------------------- */
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2156,9 +2157,9 @@ remove_handle (HANDLE h)
|
||||
Process_List *pl;
|
||||
Process_List *prev = NULL;
|
||||
|
||||
plist_enter();
|
||||
|
||||
/* -------------------- critical section -------------------- */
|
||||
(*Lock_Task) ();
|
||||
|
||||
pl = PLIST;
|
||||
while (pl)
|
||||
{
|
||||
@ -2179,9 +2180,9 @@ remove_handle (HANDLE h)
|
||||
}
|
||||
|
||||
--plist_length;
|
||||
/* -------------------- critical section -------------------- */
|
||||
|
||||
plist_leave();
|
||||
(*Unlock_Task) ();
|
||||
/* -------------------- critical section -------------------- */
|
||||
}
|
||||
|
||||
static int
|
||||
@ -2275,11 +2276,12 @@ win32_wait (int *status)
|
||||
}
|
||||
|
||||
k = 0;
|
||||
plist_enter();
|
||||
|
||||
/* -------------------- critical section -------------------- */
|
||||
(*Lock_Task) ();
|
||||
|
||||
hl_len = plist_length;
|
||||
|
||||
/* -------------------- critical section -------------------- */
|
||||
hl = (HANDLE *) xmalloc (sizeof (HANDLE) * hl_len);
|
||||
|
||||
pl = PLIST;
|
||||
@ -2288,9 +2290,9 @@ win32_wait (int *status)
|
||||
hl[k++] = pl->h;
|
||||
pl = pl->next;
|
||||
}
|
||||
/* -------------------- critical section -------------------- */
|
||||
|
||||
plist_leave();
|
||||
(*Unlock_Task) ();
|
||||
/* -------------------- critical section -------------------- */
|
||||
|
||||
res = WaitForMultipleObjects (hl_len, hl, FALSE, INFINITE);
|
||||
h = hl[res - WAIT_OBJECT_0];
|
||||
|
@ -76,12 +76,6 @@ __gnat_initialize (void *eh)
|
||||
given that we have set Max_Digits etc with this in mind */
|
||||
__gnat_init_float ();
|
||||
|
||||
#ifndef RTX
|
||||
/* Initialize a lock for a process handle list - see adaint.c for the
|
||||
implementation of __gnat_portable_no_block_spawn, __gnat_portable_wait */
|
||||
__gnat_plist_init();
|
||||
#endif
|
||||
|
||||
/* Note that we do not activate this for the compiler itself to avoid a
|
||||
bootstrap path problem. Older version of gnatbind will generate a call
|
||||
to __gnat_initialize() without argument. Therefore we cannot use eh in
|
||||
|
Loading…
Reference in New Issue
Block a user