From: Pascal Obry Date: Fri, 22 Aug 2008 14:37:57 +0000 (+0200) Subject: initialize.c, adaint.c: Use Lock_Task and Unlock_Task for non-blocking spawn. X-Git-Tag: releases/gcc-4.4.0~2937 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=af90c55af0c744a660128a26cafee66b1408ca38;p=thirdparty%2Fgcc.git initialize.c, adaint.c: Use Lock_Task and Unlock_Task for non-blocking spawn. 2008-08-22 Pascal Obry * initialize.c, adaint.c: Use Lock_Task and Unlock_Task for non-blocking spawn. From-SVN: r139476 --- diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 0971a028b3a9..4a87a2b95b56 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -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]; diff --git a/gcc/ada/initialize.c b/gcc/ada/initialize.c index 4040a7b10608..dd7ba06ade31 100644 --- a/gcc/ada/initialize.c +++ b/gcc/ada/initialize.c @@ -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