Reverse integrate Malcolm's chanes into local
[p5sagit/p5-mst-13.2.git] / ext / Thread / Thread.xs
index e6714aa..3a204b2 100644 (file)
@@ -82,7 +82,7 @@ threadstart(void *arg)
 #else
     Thread thr = (Thread) arg;
     LOGOP myop;
-    dSP;
+    djSP;
     I32 oldmark = TOPMARK;
     I32 oldscope = scopestack_ix;
     I32 retval;
@@ -129,6 +129,8 @@ threadstart(void *arg)
        goto finishoff;
     }
 
+    CATCH_SET(TRUE);
+
     /* Now duplicate most of perl_call_sv but with a few twists */
     op = (OP*)&myop;
     Zero(op, 1, LOGOP);
@@ -156,13 +158,16 @@ threadstart(void *arg)
     /* removed for debug */
     SvREFCNT_dec(curstack);
 #endif
-    SvREFCNT_dec(cvcache);
+    SvREFCNT_dec(thr->cvcache);
+    SvREFCNT_dec(thr->magicals);
+    SvREFCNT_dec(thr->specific);
     Safefree(markstack);
     Safefree(scopestack);
     Safefree(savestack);
     Safefree(retstack);
     Safefree(cxstack);
     Safefree(tmps_stack);
+    Safefree(ofs);
 
     MUTEX_LOCK(&thr->mutex);
     DEBUG_L(PerlIO_printf(PerlIO_stderr(),
@@ -208,7 +213,6 @@ static SV *
 newthread (SV *startsv, AV *initargs, char *Class)
 {
 #ifdef USE_THREADS
-    dTHR;
     dSP;
     Thread savethread;
     int i;
@@ -220,7 +224,6 @@ newthread (SV *startsv, AV *initargs, char *Class)
     
     savethread = thr;
     thr = new_struct_thread(thr);
-    init_stacks(ARGS);
     SPAGAIN;
     DEBUG_L(PerlIO_printf(PerlIO_stderr(),
                          "%p: newthread, tid is %u, preparing stack\n",
@@ -249,7 +252,7 @@ newthread (SV *startsv, AV *initargs, char *Class)
 #endif
     if (err) {
        /* Thread creation failed--clean up */
-       SvREFCNT_dec(cvcache);
+       SvREFCNT_dec(thr->cvcache);
        remove_thread(thr);
        MUTEX_DESTROY(&thr->mutex);
        for (i = 0; i <= AvFILL(initargs); i++)
@@ -264,7 +267,7 @@ newthread (SV *startsv, AV *initargs, char *Class)
        croak("panic: sigprocmask");
 #endif
     sv = newSViv(thr->tid);
-    sv_magic(sv, oursv, '~', 0, 0);
+    sv_magic(sv, thr->oursv, '~', 0, 0);
     SvMAGIC(sv)->mg_private = Thread_MAGIC_SIGNATURE;
     return sv_bless(newRV_noinc(sv), gv_stashpv(Class, TRUE));
 #else
@@ -377,7 +380,7 @@ self(Class)
     PPCODE:        
 #ifdef USE_THREADS
        sv = newSViv(thr->tid);
-       sv_magic(sv, oursv, '~', 0, 0);
+       sv_magic(sv, thr->oursv, '~', 0, 0);
        SvMAGIC(sv)->mg_private = Thread_MAGIC_SIGNATURE;
        PUSHs(sv_2mortal(sv_bless(newRV_noinc(sv), gv_stashpv(Class, TRUE))));
 #endif
@@ -520,7 +523,7 @@ list(Class)
        do {
            SV *sv = (SV*)SvRV(*svp);
            sv_setiv(sv, t->tid);
-           SvMAGIC(sv)->mg_obj = SvREFCNT_inc(t->Toursv);
+           SvMAGIC(sv)->mg_obj = SvREFCNT_inc(t->oursv);
            SvMAGIC(sv)->mg_flags |= MGf_REFCOUNTED;
            SvMAGIC(sv)->mg_private = Thread_MAGIC_SIGNATURE;
            t = t->next;
@@ -570,3 +573,4 @@ await_signal()
        RETVAL = c ? psig_ptr[c] : &sv_no;
     OUTPUT:
        RETVAL
+