OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / boehm-gc / solaris_pthreads.c
index c28a052..90f6005 100644 (file)
 /*
  * Support code for Solaris threads.  Provides functionality we wish Sun
  * had provided.  Relies on some information we probably shouldn't rely on.
- * Modified Peter C. for Solaris Posix Threads.
+ * Modified by Peter C. for Solaris Posix Threads.
  */
-/* Boehm, September 14, 1994 4:44 pm PDT */
-/* $Id: solaris_pthreads.c,v 1.1 1999/04/07 14:56:06 tromey Exp $ */
 
-# if defined(_SOLARIS_PTHREADS)
-# include "gc_priv.h"
+#include "private/gc_priv.h"
+
+# if defined(GC_SOLARIS_PTHREADS)
 # include <pthread.h>
 # include <thread.h>
 # include <signal.h>
@@ -36,7 +35,7 @@
 # define _CLASSIC_XOPEN_TYPES
 # include <unistd.h>
 # include <errno.h>
-# include "solaris_threads.h"
+# include "private/solaris_threads.h"
 # include <stdio.h>
 
 #undef pthread_join
@@ -46,7 +45,7 @@ pthread_cond_t GC_prom_join_cv;               /* Broadcast when any thread terminates */
 pthread_cond_t GC_create_cv;           /* Signalled when a new undetached      */
                                /* thread starts.                       */
                                
-extern bool GC_multithreaded;
+extern GC_bool GC_multithreaded;
 
 /* We use the allocation lock to protect thread-related data structures. */
 
@@ -77,24 +76,30 @@ GC_pthread_create(pthread_t *new_thread,
     pthread_attr_t  attr;
     word my_flags = 0;
     int  flag;
-    void * stack;
-    size_t stack_size;
+    void * stack = 0;
+    size_t stack_size = 0;
     int    n;
     struct sched_param schedparam;
    
-    (void)pthread_attr_getstacksize(attr_in, &stack_size);
-    (void)pthread_attr_getstackaddr(attr_in, &stack);
     (void)pthread_attr_init(&attr);
+    if (attr_in != 0) {
+       (void)pthread_attr_getstacksize(attr_in, &stack_size);
+       (void)pthread_attr_getstackaddr(attr_in, &stack);
+    }
 
     LOCK();
-    if (!GC_thr_initialized) {
-           GC_thr_init();
+    if (!GC_is_initialized) {
+           GC_init_inner();
     }
     GC_multithreaded++;
            
     if (stack == 0) {
        if (stack_size == 0)
-               stack_size = GC_min_stack_sz;
+               stack_size = 1048576;
+                         /* ^-- 1 MB (this was GC_min_stack_sz, but that
+                          * violates the pthread_create documentation which
+                          * says the default value if none is supplied is
+                          * 1MB) */
        else
                stack_size += thr_min_stack();
 
@@ -110,20 +115,22 @@ GC_pthread_create(pthread_t *new_thread,
     }
     (void)pthread_attr_setstacksize(&attr, stack_size);
     (void)pthread_attr_setstackaddr(&attr, stack);
-    (void)pthread_attr_getscope(attr_in, &n);
-    (void)pthread_attr_setscope(&attr, n);
-    (void)pthread_attr_getschedparam(attr_in, &schedparam);
-    (void)pthread_attr_setschedparam(&attr, &schedparam);
-    (void)pthread_attr_getschedpolicy(attr_in, &n);
-    (void)pthread_attr_setschedpolicy(&attr, n);
-    (void)pthread_attr_getinheritsched(attr_in, &n);
-    (void)pthread_attr_setinheritsched(&attr, n);
-
-    (void)pthread_attr_getdetachstate(attr_in, &flag);
-    if (flag == PTHREAD_CREATE_DETACHED) {
-           my_flags |= DETACHED;
+    if (attr_in != 0) {
+       (void)pthread_attr_getscope(attr_in, &n);
+       (void)pthread_attr_setscope(&attr, n);
+       (void)pthread_attr_getschedparam(attr_in, &schedparam);
+       (void)pthread_attr_setschedparam(&attr, &schedparam);
+       (void)pthread_attr_getschedpolicy(attr_in, &n);
+       (void)pthread_attr_setschedpolicy(&attr, n);
+       (void)pthread_attr_getinheritsched(attr_in, &n);
+       (void)pthread_attr_setinheritsched(&attr, n);
+
+       (void)pthread_attr_getdetachstate(attr_in, &flag);
+       if (flag == PTHREAD_CREATE_DETACHED) {
+               my_flags |= DETACHED;
+       }
+       (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
     }
-    (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
     /*
      * thr_create can call malloc(), which if redirected will
      * attempt to acquire the allocation lock.
@@ -168,5 +175,5 @@ GC_pthread_create(pthread_t *new_thread,
   int GC_no_sunOS_pthreads;
 #endif
 
-# endif /* SOLARIS_THREADS */
+# endif /* GC_SOLARIS_PTHREADS */