More compiler tweaks.
[p5sagit/p5-mst-13.2.git] / ext / Thread / Thread.xs
index 17c724a..3b49dbe 100644 (file)
 #endif
 #include <fcntl.h>
                         
-static U32 threadnum = 0;
 static int sig_pipe[2];
             
 #ifndef THREAD_RET_TYPE
-typedef struct perl_thread *Thread;
 #define THREAD_RET_TYPE void *
 #define THREAD_RET_CAST(x) ((THREAD_RET_TYPE) x)
 #endif
@@ -128,12 +126,12 @@ threadstart(void *arg)
        av_store(av, 0, &sv_no);
        av_store(av, 1, newSVsv(thr->errsv));
        DEBUG_L(PerlIO_printf(PerlIO_stderr(), "%p died: %s\n",
-                             SvPV(thr->errsv, na));
+                             SvPV(thr->errsv, na)));
     } else {
        DEBUG_L(STMT_START {
            for (i = 1; i <= retval; i++) {
                PerlIO_printf(PerlIO_stderr(), "%p return[%d] = %s\n",
-                               thr, i, SvPEEK(sp[i - 1]));)
+                               thr, i, SvPEEK(sp[i - 1]));
            }
        } STMT_END);
        av_store(av, 0, &sv_yes);
@@ -209,6 +207,8 @@ newthread (SV *startsv, AV *initargs, char *classname)
     SV *sv;
     int err;
 #ifndef THREAD_CREATE
+    static pthread_attr_t attr;
+    static int attr_inited = 0;
     sigset_t fullmask, oldmask;
 #endif
     
@@ -234,33 +234,22 @@ newthread (SV *startsv, AV *initargs, char *classname)
     sigfillset(&fullmask);
     if (sigprocmask(SIG_SETMASK, &fullmask, &oldmask) == -1)
        croak("panic: sigprocmask");
-#ifdef PTHREADS_CREATED_JOINABLE
-    err = pthread_create(&thr->self, pthread_attr_default,
-                        threadstart, (void*) thr);
-#else
-    {
-       pthread_attr_t attr;
-
+    err = 0;
+    if (!attr_inited) {
+       attr_inited = 1;
        err = pthread_attr_init(&attr);
-       if (err == 0) {
-#ifdef PTHREAD_CREATE_UNDETACHED
-         err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_UNDETACHED);
-#else
-         croak("panic: pthread_attr_setdetachstate");
-#endif
-         if (err == 0) 
-           err = pthread_create(&thr->self, &attr,
-                                threadstart, (void*) thr);
-       }
-       pthread_attr_destroy(&attr);
+       if (err == 0)
+           err = pthread_attr_setdetachstate(&attr, ATTR_JOINABLE);
     }
-#endif
+    if (err == 0)
+       err = pthread_create(&thr->self, &attr, threadstart, (void*) thr);
     /* Go */
     MUTEX_UNLOCK(&thr->mutex);
 #endif
     if (err) {
         DEBUG_L(PerlIO_printf(PerlIO_stderr(),
-                         "%p: create of %p failed %d\n", savethread, thr, err));
+                             "%p: create of %p failed %d\n",
+                             savethread, thr, err));
        /* Thread creation failed--clean up */
        SvREFCNT_dec(thr->cvcache);
        remove_thread(thr);