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);
static THREAD_RET_TYPE
threadstart(void *arg)
{
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
#ifdef FAKE_THREADS
Thread savethread = thr;
LOGOP myop;
return 0;
#else
Thread thr = (Thread) arg;
- LOGOP myop;
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);
FREETMPS;
LEAVE;
- finishoff:
#if 0
/* removed for debug */
SvREFCNT_dec(PL_curstack);
SvREFCNT_dec(PL_ofs_sv);
SvREFCNT_dec(PL_rs);
- SvREFCNT_dec(PL_nrs);
SvREFCNT_dec(PL_statname);
SvREFCNT_dec(PL_errors);
Safefree(PL_screamfirst);
static SV *
newthread (pTHX_ SV *startsv, AV *initargs, char *classname)
{
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
dSP;
Thread savethread;
int i;
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
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);
}
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:
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:
flags(t)
Thread t
PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
PUSHs(sv_2mortal(newSViv(t->flags)));
#endif
done(t)
Thread t
PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
PUSHs(t->thr_done ? &PL_sv_yes : &PL_sv_no);
#endif
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;
tid(t)
Thread t
CODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
MUTEX_LOCK(&t->mutex);
RETVAL = t->tid;
MUTEX_UNLOCK(&t->mutex);
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
}
SV * sv
MAGIC * mg = NO_INIT
CODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
if (SvROK(sv))
sv = SvRV(sv);
SV * sv
MAGIC * mg = NO_INIT
CODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
if (SvROK(sv))
sv = SvRV(sv);
SV * sv
MAGIC * mg = NO_INIT
CODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
if (SvROK(sv))
sv = SvRV(sv);
SV ** svp;
int n = 0;
PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
av = newAV();
/*
* Iterate until we have enough dynamic storage for all threads.
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
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)));