OSDN Git Service

Fix problem that caused compiled java code to trigger an internal gdb error.
[pf3gnuchains/gcc-fork.git] / boehm-gc / solaris_pthreads.c
index 91a0f01..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 */
 
-# 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>
@@ -35,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
@@ -76,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();
 
@@ -109,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.
@@ -167,5 +175,5 @@ GC_pthread_create(pthread_t *new_thread,
   int GC_no_sunOS_pthreads;
 #endif
 
-# endif /* SOLARIS_THREADS */
+# endif /* GC_SOLARIS_PTHREADS */