]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
initialize.c, adaint.c: Use Lock_Task and Unlock_Task for non-blocking spawn.
authorPascal Obry <obry@adacore.com>
Fri, 22 Aug 2008 14:37:57 +0000 (16:37 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 22 Aug 2008 14:37:57 +0000 (16:37 +0200)
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

gcc/ada/adaint.c
gcc/ada/initialize.c

index 0971a028b3a974a5d93d52bd5b1863729487ade7..4a87a2b95b563851995e84f284c47f93f94fa63f 100644 (file)
@@ -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];
index 4040a7b10608de5d4a7d897691da0b2be701de18..dd7ba06ade31e815992d8f8cf43f3d2c7e79c8f3 100644 (file)
@@ -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