Commit af90c55a by Pascal Obry Committed by Arnaud Charlet

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
parent a3d4a22b
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment