diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-08-22 14:37:57 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-08-22 14:37:57 +0000 |
commit | 51fa65dcc5ffea6696d9e98e51eb824f3e6ccb95 (patch) | |
tree | 21e6f84ee6fb8a709dff9706518d9529b51556c3 /gcc/ada | |
parent | 6be36710014a580db25d163b86e7dc4f76a49dd9 (diff) | |
download | ppe42-gcc-51fa65dcc5ffea6696d9e98e51eb824f3e6ccb95.tar.gz ppe42-gcc-51fa65dcc5ffea6696d9e98e51eb824f3e6ccb95.zip |
2008-08-22 Pascal Obry <obry@adacore.com>
* initialize.c, adaint.c: Use Lock_Task and Unlock_Task for non-blocking
spawn.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139476 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/adaint.c | 58 | ||||
-rw-r--r-- | gcc/ada/initialize.c | 6 |
2 files changed, 30 insertions, 34 deletions
diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index 0971a028b3a..4a87a2b95b5 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 4040a7b1060..dd7ba06ade3 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 |