diff options
Diffstat (limited to 'ext/Thread')
-rw-r--r-- | ext/Thread/Makefile.PL | 6 | ||||
-rw-r--r-- | ext/Thread/Thread.pm | 4 | ||||
-rw-r--r-- | ext/Thread/Thread.xs | 31 |
3 files changed, 34 insertions, 7 deletions
diff --git a/ext/Thread/Makefile.PL b/ext/Thread/Makefile.PL index d699091cc1..bed0db43d7 100644 --- a/ext/Thread/Makefile.PL +++ b/ext/Thread/Makefile.PL @@ -1,2 +1,6 @@ use ExtUtils::MakeMaker; -WriteMakefile(NAME => "Thread"); +WriteMakefile( + NAME => 'Thread', + VERSION_FROM => 'Thread.pm' + ); + diff --git a/ext/Thread/Thread.pm b/ext/Thread/Thread.pm index 1936142e52..48ca3047b9 100644 --- a/ext/Thread/Thread.pm +++ b/ext/Thread/Thread.pm @@ -1,6 +1,10 @@ package Thread; require Exporter; require DynaLoader; +use vars qw($VERSION @ISA @EXPORT); + +$VERSION = "1.0"; + @ISA = qw(Exporter DynaLoader); @EXPORT_OK = qw(yield cond_signal cond_broadcast cond_wait async); diff --git a/ext/Thread/Thread.xs b/ext/Thread/Thread.xs index 0844312dd4..c0d551d612 100644 --- a/ext/Thread/Thread.xs +++ b/ext/Thread/Thread.xs @@ -16,13 +16,13 @@ static U32 threadnum = 0; static int sig_pipe[2]; #ifndef THREAD_RET_TYPE -typedef struct thread *Thread; +typedef struct perl_thread *Thread; #define THREAD_RET_TYPE void * #define THREAD_RET_CAST(x) ((THREAD_RET_TYPE) x) #endif static void -remove_thread(struct thread *t) +remove_thread(struct perl_thread *t) { #ifdef USE_THREADS DEBUG_L(WITH_THR(PerlIO_printf(PerlIO_stderr(), @@ -106,8 +106,8 @@ threadstart(void *arg) /* * It's safe to wait until now to set the thread-specific pointer - * from our pthread_t structure to our struct thread, since we're - * the only thread who can get at it anyway. + * from our pthread_t structure to our struct perl_thread, since + * we're the only thread who can get at it anyway. */ SET_THR(thr); @@ -128,12 +128,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); @@ -234,8 +234,27 @@ 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 = 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); + } +#endif /* Go */ MUTEX_UNLOCK(&thr->mutex); #endif |