phase 1 of somewhat major rearrangement of PERL_OBJECT stuff
[p5sagit/p5-mst-13.2.git] / ext / Thread / Thread.xs
index 34aee1b..208daf2 100644 (file)
@@ -23,15 +23,15 @@ static void
 remove_thread(struct perl_thread *t)
 {
 #ifdef USE_THREADS
-    DEBUG_L(WITH_THR(PerlIO_printf(PerlIO_stderr(),
+    DEBUG_S(WITH_THR(PerlIO_printf(PerlIO_stderr(),
                                   "%p: remove_thread %p\n", thr, t)));
-    MUTEX_LOCK(&threads_mutex);
+    MUTEX_LOCK(&PL_threads_mutex);
     MUTEX_DESTROY(&t->mutex);
-    nthreads--;
+    PL_nthreads--;
     t->prev->next = t->next;
     t->next->prev = t->prev;
-    COND_BROADCAST(&nthreads_cond);
-    MUTEX_UNLOCK(&threads_mutex);
+    COND_BROADCAST(&PL_nthreads_cond);
+    MUTEX_UNLOCK(&PL_threads_mutex);
 #endif
 }
 
@@ -43,12 +43,12 @@ threadstart(void *arg)
     Thread savethread = thr;
     LOGOP myop;
     dSP;
-    I32 oldscope = scopestack_ix;
+    I32 oldscope = PL_scopestack_ix;
     I32 retval;
     AV *av;
     int i;
 
-    DEBUG_L(PerlIO_printf(PerlIO_stderr(), "new thread %p starting at %s\n",
+    DEBUG_S(PerlIO_printf(PerlIO_stderr(), "new thread %p starting at %s\n",
                          thr, SvPEEK(TOPs)));
     thr = (Thread) arg;
     savemark = TOPMARK;
@@ -60,14 +60,14 @@ threadstart(void *arg)
     thr->private = 0;
 
     /* Now duplicate most of perl_call_sv but with a few twists */
-    op = (OP*)&myop;
-    Zero(op, 1, LOGOP);
+    PL_op = (OP*)&myop;
+    Zero(PL_op, 1, LOGOP);
     myop.op_flags = OPf_STACKED;
     myop.op_next = Nullop;
     myop.op_flags |= OPf_KNOW;
     myop.op_flags |= OPf_WANT_LIST;
-    op = pp_entersub(ARGS);
-    DEBUG_L(if (!op)
+    PL_op = pp_entersub(ARGS);
+    DEBUG_S(if (!PL_op)
            PerlIO_printf(PerlIO_stderr(), "thread starts at Nullop\n"));
     /*
      * When this thread is next scheduled, we start in the right
@@ -82,13 +82,13 @@ threadstart(void *arg)
     LOGOP myop;
     djSP;
     I32 oldmark = TOPMARK;
-    I32 oldscope = scopestack_ix;
+    I32 oldscope = PL_scopestack_ix;
     I32 retval;
     SV *sv;
     AV *av = newAV();
     int i, ret;
     dJMPENV;
-    DEBUG_L(PerlIO_printf(PerlIO_stderr(), "new thread %p waiting to start\n",
+    DEBUG_S(PerlIO_printf(PerlIO_stderr(), "new thread %p waiting to start\n",
                          thr));
 
     /* Don't call *anything* requiring dTHR until after SET_THR() */
@@ -110,31 +110,31 @@ threadstart(void *arg)
     SET_THR(thr);
 
     /* Only now can we use SvPEEK (which calls sv_newmortal which does dTHR) */
-    DEBUG_L(PerlIO_printf(PerlIO_stderr(), "new thread %p starting at %s\n",
+    DEBUG_S(PerlIO_printf(PerlIO_stderr(), "new thread %p starting at %s\n",
                          thr, SvPEEK(TOPs)));
 
     sv = POPs;
     PUTBACK;
     perl_call_sv(sv, G_ARRAY|G_EVAL);
     SPAGAIN;
-    retval = SP - (stack_base + oldmark);
-    SP = stack_base + oldmark + 1;
+    retval = SP - (PL_stack_base + oldmark);
+    SP = PL_stack_base + oldmark + 1;
     if (SvCUR(thr->errsv)) {
        MUTEX_LOCK(&thr->mutex);
        thr->flags |= THRf_DID_DIE;
        MUTEX_UNLOCK(&thr->mutex);
-       av_store(av, 0, &sv_no);
+       av_store(av, 0, &PL_sv_no);
        av_store(av, 1, newSVsv(thr->errsv));
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(), "%p died: %s\n",
-                             thr, SvPV(thr->errsv, na)));
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p died: %s\n",
+                             thr, SvPV(thr->errsv, PL_na)));
     } else {
-       DEBUG_L(STMT_START {
+       DEBUG_S(STMT_START {
            for (i = 1; i <= retval; i++) {
                PerlIO_printf(PerlIO_stderr(), "%p return[%d] = %s\n",
                                thr, i, SvPEEK(SP[i - 1]));
            }
        } STMT_END);
-       av_store(av, 0, &sv_yes);
+       av_store(av, 0, &PL_sv_yes);
        for (i = 1; i <= retval; i++, SP++)
            sv_setsv(*av_fetch(av, i, TRUE), SvREFCNT_inc(*SP));
     }
@@ -142,7 +142,7 @@ threadstart(void *arg)
   finishoff:
 #if 0    
     /* removed for debug */
-    SvREFCNT_dec(curstack);
+    SvREFCNT_dec(PL_curstack);
 #endif
     SvREFCNT_dec(thr->cvcache);
     SvREFCNT_dec(thr->threadsv);
@@ -151,54 +151,54 @@ threadstart(void *arg)
     SvREFCNT_dec(thr->errhv);
 
     /*Safefree(cxstack);*/
-    while (curstackinfo->si_next)
-       curstackinfo = curstackinfo->si_next;
-    while (curstackinfo) {
-       PERL_SI *p = curstackinfo->si_prev;
-       SvREFCNT_dec(curstackinfo->si_stack);
-       Safefree(curstackinfo->si_cxstack);
-       Safefree(curstackinfo);
-       curstackinfo = p;
+    while (PL_curstackinfo->si_next)
+       PL_curstackinfo = PL_curstackinfo->si_next;
+    while (PL_curstackinfo) {
+       PERL_SI *p = PL_curstackinfo->si_prev;
+       SvREFCNT_dec(PL_curstackinfo->si_stack);
+       Safefree(PL_curstackinfo->si_cxstack);
+       Safefree(PL_curstackinfo);
+       PL_curstackinfo = p;
     }    
-    Safefree(markstack);
-    Safefree(scopestack);
-    Safefree(savestack);
-    Safefree(retstack);
-    Safefree(tmps_stack);
-    Safefree(ofs);
-
-    SvREFCNT_dec(rs);
-    SvREFCNT_dec(nrs);
-    SvREFCNT_dec(statname);
-    Safefree(screamfirst);
-    Safefree(screamnext);
-    Safefree(reg_start_tmp);
-    SvREFCNT_dec(lastscream);
-    /*SvREFCNT_dec(defoutgv);*/
+    Safefree(PL_markstack);
+    Safefree(PL_scopestack);
+    Safefree(PL_savestack);
+    Safefree(PL_retstack);
+    Safefree(PL_tmps_stack);
+    Safefree(PL_ofs);
+
+    SvREFCNT_dec(PL_rs);
+    SvREFCNT_dec(PL_nrs);
+    SvREFCNT_dec(PL_statname);
+    Safefree(PL_screamfirst);
+    Safefree(PL_screamnext);
+    Safefree(PL_reg_start_tmp);
+    SvREFCNT_dec(PL_lastscream);
+    /*SvREFCNT_dec(PL_defoutgv);*/
 
     MUTEX_LOCK(&thr->mutex);
-    DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+    DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                          "%p: threadstart finishing: state is %u\n",
                          thr, ThrSTATE(thr)));
     switch (ThrSTATE(thr)) {
     case THRf_R_JOINABLE:
        ThrSETSTATE(thr, THRf_ZOMBIE);
        MUTEX_UNLOCK(&thr->mutex);
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                              "%p: R_JOINABLE thread finished\n", thr));
        break;
     case THRf_R_JOINED:
        ThrSETSTATE(thr, THRf_DEAD);
        MUTEX_UNLOCK(&thr->mutex);
        remove_thread(thr);
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                              "%p: R_JOINED thread finished\n", thr));
        break;
     case THRf_R_DETACHED:
        ThrSETSTATE(thr, THRf_DEAD);
        MUTEX_UNLOCK(&thr->mutex);
        SvREFCNT_dec(av);
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                              "%p: DETACHED thread finished\n", thr));
        remove_thread(thr);     /* This might trigger main thread to finish */
        break;
@@ -229,12 +229,13 @@ newthread (SV *startsv, AV *initargs, char *classname)
     static pthread_attr_t attr;
     static int attr_inited = 0;
     sigset_t fullmask, oldmask;
+    static int attr_joinable = ATTR_JOINABLE;
 #endif
-    
+
     savethread = thr;
     thr = new_struct_thread(thr);
     SPAGAIN;
-    DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+    DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                          "%p: newthread (%p), tid is %u, preparing stack\n",
                          savethread, thr, thr->tid));
     /* The following pushes the arg list and startsv onto the *new* stack */
@@ -257,16 +258,21 @@ newthread (SV *startsv, AV *initargs, char *classname)
     if (!attr_inited) {
        attr_inited = 1;
        err = pthread_attr_init(&attr);
+#  ifdef PTHREAD_ATTR_SETDETACHSTATE
        if (err == 0)
-           err = pthread_attr_setdetachstate(&attr, ATTR_JOINABLE);
+           err = PTHREAD_ATTR_SETDETACHSTATE(&attr, attr_joinable);
+
+#  else
+       croak("panic: can't pthread_attr_setdetachstate");
+#  endif
     }
     if (err == 0)
-       err = pthread_create(&thr->self, &attr, threadstart, (void*) thr);
+       err = PTHREAD_CREATE(&thr->self, attr, threadstart, (void*) thr);
     /* Go */
     MUTEX_UNLOCK(&thr->mutex);
 #endif
     if (err) {
-        DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+        DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                              "%p: create of %p failed %d\n",
                              savethread, thr, err));
        /* Thread creation failed--clean up */
@@ -290,7 +296,7 @@ newthread (SV *startsv, AV *initargs, char *classname)
     return sv_bless(newRV_noinc(sv), gv_stashpv(classname, TRUE));
 #else
     croak("No threads in this perl");
-    return &sv_undef;
+    return &PL_sv_undef;
 #endif
 }
 
@@ -305,7 +311,7 @@ handle_thread_signal(int sig)
      * so don't be surprised if this isn't robust while debugging
      * with -DL.
      */
-    DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+    DEBUG_S(PerlIO_printf(PerlIO_stderr(),
            "handle_thread_signal: got signal %d\n", sig););
     write(sig_pipe[1], &c, 1);
 }
@@ -328,7 +334,7 @@ join(t)
        int     i = NO_INIT
     PPCODE:
 #ifdef USE_THREADS
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(), "%p: joining %p (state %u)\n",
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: joining %p (state %u)\n",
                              thr, t, ThrSTATE(t)););
        MUTEX_LOCK(&t->mutex);
        switch (ThrSTATE(t)) {
@@ -354,8 +360,8 @@ join(t)
            for (i = 1; i <= AvFILL(av); i++)
                XPUSHs(sv_2mortal(*av_fetch(av, i, FALSE)));
        } else {
-           char *mess = SvPV(*av_fetch(av, 1, FALSE), na);
-           DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+           char *mess = SvPV(*av_fetch(av, 1, FALSE), PL_na);
+           DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                                  "%p: join propagating die message: %s\n",
                                  thr, mess));
            croak(mess);
@@ -367,7 +373,7 @@ detach(t)
        Thread  t
     CODE:
 #ifdef USE_THREADS
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(), "%p: detaching %p (state %u)\n",
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: detaching %p (state %u)\n",
                              thr, t, ThrSTATE(t)););
        MUTEX_LOCK(&t->mutex);
        switch (ThrSTATE(t)) {
@@ -396,7 +402,7 @@ equal(t1, t2)
        Thread  t1
        Thread  t2
     PPCODE:
-       PUSHs((t1 == t2) ? &sv_yes : &sv_no);
+       PUSHs((t1 == t2) ? &PL_sv_yes : &PL_sv_no);
 
 void
 flags(t)
@@ -438,7 +444,7 @@ void
 DESTROY(t)
        SV *    t
     PPCODE:
-       PUSHs(&sv_yes);
+       PUSHs(&PL_sv_yes);
 
 void
 yield()
@@ -459,13 +465,14 @@ CODE:
            sv = SvRV(sv);
 
        mg = condpair_magic(sv);
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(), "%p: cond_wait %p\n", thr, sv));
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: cond_wait %p\n", thr, sv));
        MUTEX_LOCK(MgMUTEXP(mg));
        if (MgOWNER(mg) != thr) {
            MUTEX_UNLOCK(MgMUTEXP(mg));
            croak("cond_wait for lock that we don't own\n");
        }
        MgOWNER(mg) = 0;
+       COND_SIGNAL(MgOWNERCONDP(mg));
        COND_WAIT(MgCONDP(mg), MgMUTEXP(mg));
        while (MgOWNER(mg))
            COND_WAIT(MgOWNERCONDP(mg), MgMUTEXP(mg));
@@ -483,7 +490,7 @@ CODE:
            sv = SvRV(sv);
 
        mg = condpair_magic(sv);
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(), "%p: cond_signal %p\n",thr,sv));
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: cond_signal %p\n",thr,sv));
        MUTEX_LOCK(MgMUTEXP(mg));
        if (MgOWNER(mg) != thr) {
            MUTEX_UNLOCK(MgMUTEXP(mg));
@@ -503,7 +510,7 @@ CODE:
            sv = SvRV(sv);
 
        mg = condpair_magic(sv);
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(), "%p: cond_broadcast %p\n",
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(), "%p: cond_broadcast %p\n",
                              thr, sv));
        MUTEX_LOCK(MgMUTEXP(mg));
        if (MgOWNER(mg) != thr) {
@@ -529,10 +536,10 @@ list(classname)
         * Iterate until we have enough dynamic storage for all threads.
         * We mustn't do any allocation while holding threads_mutex though.
         */
-       MUTEX_LOCK(&threads_mutex);
+       MUTEX_LOCK(&PL_threads_mutex);
        do {
-           n = nthreads;
-           MUTEX_UNLOCK(&threads_mutex);
+           n = PL_nthreads;
+           MUTEX_UNLOCK(&PL_threads_mutex);
            if (AvFILL(av) < n - 1) {
                int i = AvFILL(av);
                for (i = AvFILL(av); i < n - 1; i++) {
@@ -543,9 +550,9 @@ list(classname)
        
                }
            }
-           MUTEX_LOCK(&threads_mutex);
-       } while (n < nthreads);
-       n = nthreads;   /* Get the final correct value */
+           MUTEX_LOCK(&PL_threads_mutex);
+       } while (n < PL_nthreads);
+       n = PL_nthreads;        /* Get the final correct value */
 
        /*
         * At this point, there's enough room to fill in av.
@@ -565,7 +572,7 @@ list(classname)
            svp++;
        } while (t != thr);
        /*  */
-       MUTEX_UNLOCK(&threads_mutex);
+       MUTEX_UNLOCK(&PL_threads_mutex);
        /* Truncate any unneeded slots in av */
        av_fill(av, n - 1);
        /* Finally, push all the new objects onto the stack and drop av */
@@ -582,15 +589,15 @@ void
 kill_sighandler_thread()
     PPCODE:
        write(sig_pipe[1], "\0", 1);
-       PUSHs(&sv_yes);
+       PUSHs(&PL_sv_yes);
 
 void
 init_thread_signals()
     PPCODE:
-       sighandlerp = handle_thread_signal;
+       PL_sighandlerp = handle_thread_signal;
        if (pipe(sig_pipe) == -1)
            XSRETURN_UNDEF;
-       PUSHs(&sv_yes);
+       PUSHs(&PL_sv_yes);
 
 void
 await_signal()
@@ -605,8 +612,8 @@ await_signal()
            croak("panic: await_signal");
        ST(0) = sv_newmortal();
        if (ret)
-           sv_setsv(ST(0), c ? psig_ptr[c] : &sv_no);
-       DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+           sv_setsv(ST(0), c ? PL_psig_ptr[c] : &PL_sv_no);
+       DEBUG_S(PerlIO_printf(PerlIO_stderr(),
                              "await_signal returning %s\n", SvPEEK(ST(0))););
 
 MODULE = Thread                PACKAGE = Thread::Specific