summaryrefslogtreecommitdiffstats
path: root/gcc/ada
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2008-08-22 14:37:57 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2008-08-22 14:37:57 +0000
commit51fa65dcc5ffea6696d9e98e51eb824f3e6ccb95 (patch)
tree21e6f84ee6fb8a709dff9706518d9529b51556c3 /gcc/ada
parent6be36710014a580db25d163b86e7dc4f76a49dd9 (diff)
downloadppe42-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.c58
-rw-r--r--gcc/ada/initialize.c6
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
OpenPOWER on IntegriCloud