Update Changes.
[p5sagit/p5-mst-13.2.git] / ext / Thread / Thread.xs
index c117c60..b76c0be 100644 (file)
@@ -23,7 +23,7 @@ static int sig_pipe[2];
 static void
 remove_thread(pTHX_ Thread t)
 {
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
     DEBUG_S(WITH_THR(PerlIO_printf(Perl_debug_log,
                                   "%p: remove_thread %p\n", thr, t)));
     MUTEX_LOCK(&PL_threads_mutex);
@@ -40,7 +40,7 @@ remove_thread(pTHX_ Thread t)
 static THREAD_RET_TYPE
 threadstart(void *arg)
 {
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
 #ifdef FAKE_THREADS
     Thread savethread = thr;
     LOGOP myop;
@@ -81,15 +81,12 @@ threadstart(void *arg)
     return 0;
 #else
     Thread thr = (Thread) arg;
-    LOGOP myop;
-    djSP;
+    dSP;
     I32 oldmark = TOPMARK;
-    I32 oldscope = PL_scopestack_ix;
     I32 retval;
     SV *sv;
     AV *av;
-    int i, ret;
-    dJMPENV;
+    int i;
 
 #if defined(MULTIPLICITY)
     PERL_SET_INTERP(thr->interp);
@@ -150,7 +147,6 @@ threadstart(void *arg)
     FREETMPS;
     LEAVE;
 
-  finishoff:
 #if 0    
     /* removed for debug */
     SvREFCNT_dec(PL_curstack);
@@ -178,7 +174,6 @@ threadstart(void *arg)
     SvREFCNT_dec(PL_ofs_sv);
 
     SvREFCNT_dec(PL_rs);
-    SvREFCNT_dec(PL_nrs);
     SvREFCNT_dec(PL_statname);
     SvREFCNT_dec(PL_errors);
     Safefree(PL_screamfirst);
@@ -232,7 +227,7 @@ threadstart(void *arg)
 static SV *
 newthread (pTHX_ SV *startsv, AV *initargs, char *classname)
 {
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
     dSP;
     Thread savethread;
     int i;
@@ -279,10 +274,17 @@ newthread (pTHX_ SV *startsv, AV *initargs, char *classname)
     if (!attr_inited) {
        attr_inited = 1;
        err = pthread_attr_init(&attr);
+#  ifdef THREAD_CREATE_NEEDS_STACK
+       if (err == 0)
+            err = pthread_attr_setstacksize(&attr, THREAD_CREATE_NEEDS_STACK);
+       if (err)
+           croak("panic: pthread_attr_setstacksize failed");
+#  endif
 #  ifdef PTHREAD_ATTR_SETDETACHSTATE
        if (err == 0)
            err = PTHREAD_ATTR_SETDETACHSTATE(&attr, attr_joinable);
-
+       if (err)
+           croak("panic: pthread_attr_setdetachstate failed");
 #  else
        croak("panic: can't pthread_attr_setdetachstate");
 #  endif
@@ -322,7 +324,13 @@ newthread (pTHX_ SV *startsv, AV *initargs, char *classname)
 
     return sv;
 #else
-    croak("No threads in this perl");
+#  ifdef USE_ITHREADS
+    croak("This perl was built for \"ithreads\", which currently does not support Thread.pm.\n"
+         "Run \"perldoc Thread\" for more information");
+#  else
+    croak("This perl was not built with support for 5.005-style threads.\n"
+         "Run \"perldoc Thread\" for more information");
+#  endif
     return &PL_sv_undef;
 #endif
 }
@@ -332,15 +340,15 @@ static Signal_t handle_thread_signal (int sig);
 static Signal_t
 handle_thread_signal(int sig)
 {
-    dTHXo;
     unsigned char c = (unsigned char) sig;
+    dTHX;
     /*
      * We're not really allowed to call fprintf in a signal handler
      * so don't be surprised if this isn't robust while debugging
      * with -DL.
      */
     DEBUG_S(PerlIO_printf(Perl_debug_log,
-           "handle_thread_signal: got signal %d\n", sig););
+           "handle_thread_signal: got signal %d\n", sig));
     write(sig_pipe[1], &c, 1);
 }
 
@@ -361,11 +369,11 @@ join(t)
        AV *    av = NO_INIT
        int     i = NO_INIT
     PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        if (t == thr)
            croak("Attempt to join self");
        DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: joining %p (state %u)\n",
-                             thr, t, ThrSTATE(t)););
+                             thr, t, ThrSTATE(t)));
        MUTEX_LOCK(&t->mutex);
        switch (ThrSTATE(t)) {
        case THRf_R_JOINABLE:
@@ -406,9 +414,9 @@ void
 detach(t)
        Thread  t
     CODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        DEBUG_S(PerlIO_printf(Perl_debug_log, "%p: detaching %p (state %u)\n",
-                             thr, t, ThrSTATE(t)););
+                             thr, t, ThrSTATE(t)));
        MUTEX_LOCK(&t->mutex);
        switch (ThrSTATE(t)) {
        case THRf_R_JOINABLE:
@@ -442,7 +450,7 @@ void
 flags(t)
        Thread  t
     PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        PUSHs(sv_2mortal(newSViv(t->flags)));
 #endif
 
@@ -450,7 +458,7 @@ void
 done(t)
        Thread  t
     PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        PUSHs(t->thr_done ? &PL_sv_yes : &PL_sv_no);
 #endif
 
@@ -460,7 +468,7 @@ self(classname)
     PREINIT:
        SV *sv;
     PPCODE:        
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        sv = newSViv(thr->tid);
        sv_magic(sv, thr->oursv, '~', 0, 0);
        SvMAGIC(sv)->mg_private = Thread_MAGIC_SIGNATURE;
@@ -472,7 +480,7 @@ U32
 tid(t)
        Thread  t
     CODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        MUTEX_LOCK(&t->mutex);
        RETVAL = t->tid;
        MUTEX_UNLOCK(&t->mutex);
@@ -486,13 +494,13 @@ void
 DESTROY(t)
        SV *    t
     PPCODE:
-       PUSHs(&PL_sv_yes);
+       PUSHs(t ? &PL_sv_yes : &PL_sv_no);
 
 void
 yield()
     CODE:
 {
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        YIELD;
 #endif
 }
@@ -502,7 +510,7 @@ cond_wait(sv)
        SV *    sv
        MAGIC * mg = NO_INIT
 CODE:                       
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        if (SvROK(sv))
            sv = SvRV(sv);
 
@@ -527,7 +535,7 @@ cond_signal(sv)
        SV *    sv
        MAGIC * mg = NO_INIT
 CODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        if (SvROK(sv))
            sv = SvRV(sv);
 
@@ -547,7 +555,7 @@ cond_broadcast(sv)
        SV *    sv
        MAGIC * mg = NO_INIT
 CODE: 
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        if (SvROK(sv))
            sv = SvRV(sv);
 
@@ -572,7 +580,7 @@ list(classname)
        SV **   svp;
        int     n = 0;
     PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        av = newAV();
        /*
         * Iterate until we have enough dynamic storage for all threads.
@@ -656,7 +664,7 @@ await_signal()
        if (ret)
            sv_setsv(ST(0), c ? PL_psig_ptr[c] : &PL_sv_no);
        DEBUG_S(PerlIO_printf(Perl_debug_log,
-                             "await_signal returning %s\n", SvPEEK(ST(0))););
+                             "await_signal returning %s\n", SvPEEK(ST(0))));
 
 MODULE = Thread                PACKAGE = Thread::Specific
 
@@ -664,7 +672,7 @@ void
 data(classname = "Thread::Specific")
        char *  classname
     PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        if (AvFILL(thr->specific) == -1) {
            GV *gv = gv_fetchpv("Thread::Specific::FIELDS", TRUE, SVt_PVHV);
            av_store(thr->specific, 0, newRV((SV*)GvHV(gv)));