From 8dcd6f7b32c170bcf62c1187a3413da9a3cdf97a Mon Sep 17 00:00:00 2001 From: Dan Sugalski Date: Wed, 25 Oct 2000 09:36:35 -0400 Subject: [PATCH] Add non-blocking thread doneness checking Message-Id: <5.0.0.25.0.20001025133504.01ef1e20@24.8.96.48> plus regen global.sym. p4raw-id: //depot/perl@7442 --- ext/Thread/Thread.pm | 17 +++++++++++++++++ ext/Thread/Thread.xs | 9 +++++++++ global.sym | 2 +- perl.c | 1 + thrdvar.h | 2 +- util.c | 1 + 6 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ext/Thread/Thread.pm b/ext/Thread/Thread.pm index c752e3d..22ae4ef 100644 --- a/ext/Thread/Thread.pm +++ b/ext/Thread/Thread.pm @@ -21,6 +21,11 @@ Thread - manipulate threads in Perl (EXPERIMENTAL, subject to change) $result = $t->join; $result = $t->eval; $t->detach; + $flags = $t->flags; + + if ($t->done) { + $t->join; + } if($t->equal($another_thread)) { # ... @@ -29,6 +34,7 @@ Thread - manipulate threads in Perl (EXPERIMENTAL, subject to change) my $tid = Thread->self->tid; my $tlist = Thread->list; + lock($scalar); yield(); @@ -181,6 +187,17 @@ increasing integer assigned when a thread is created. The main thread of a program will have a tid of zero, while subsequent threads will have tids assigned starting with one. +=item flags + +The C method returns the flags for the thread. This is the +integer value corresponding to the internal flags for the thread, and +the value man not be all that meaningful to you. + +=item done + +The C method returns true if the thread you're checking has +finished, and false otherwise. + =back =head1 LIMITATIONS diff --git a/ext/Thread/Thread.xs b/ext/Thread/Thread.xs index 17e5aef..27e2533 100644 --- a/ext/Thread/Thread.xs +++ b/ext/Thread/Thread.xs @@ -189,6 +189,7 @@ threadstart(void *arg) SvREFCNT_dec(PL_lastscream); SvREFCNT_dec(PL_defoutgv); Safefree(PL_reg_poscache); + thr->thr_done = 1; MUTEX_LOCK(&thr->mutex); DEBUG_S(PerlIO_printf(Perl_debug_log, @@ -448,6 +449,14 @@ flags(t) #endif void +done(t) + Thread t + PPCODE: +#ifdef USE_THREADS + PUSHs(t->thr_done ? &PL_sv_yes : &PL_sv_no); +#endif + +void self(classname) char * classname PREINIT: diff --git a/global.sym b/global.sym index 0dea03e..2143319 100644 --- a/global.sym +++ b/global.sym @@ -465,8 +465,8 @@ Perl_utf8_distance Perl_utf8_hop Perl_utf8_to_bytes Perl_bytes_to_utf8 +Perl_utf8_to_uv_simple Perl_utf8_to_uv -Perl_utf8_to_uv_chk Perl_uv_to_utf8 Perl_warn Perl_vwarn diff --git a/perl.c b/perl.c index 3d874ca..b65bdb9 100644 --- a/perl.c +++ b/perl.c @@ -3637,6 +3637,7 @@ S_init_main_thread(pTHX) thr->tid = 0; thr->next = thr; thr->prev = thr; + thr->thr_done = 0; MUTEX_UNLOCK(&PL_threads_mutex); #ifdef HAVE_THREAD_INTERN diff --git a/thrdvar.h b/thrdvar.h index e4cfacc..06cfe72 100644 --- a/thrdvar.h +++ b/thrdvar.h @@ -236,5 +236,5 @@ PERLVAR(i, struct thread_intern) #endif PERLVAR(trailing_nul, char) /* For the sake of thrsv and oursv */ - +PERLVAR(thr_done, bool) /* True when the thread has finished */ #endif /* USE_THREADS */ diff --git a/util.c b/util.c index 2122d4e..619c5aa 100644 --- a/util.c +++ b/util.c @@ -3605,6 +3605,7 @@ Perl_new_struct_thread(pTHX_ struct perl_thread *t) thr->specific = newAV(); thr->errsv = newSVpvn("", 0); thr->flags = THRf_R_JOINABLE; + thr->thr_done = 0; MUTEX_INIT(&thr->mutex); JMPENV_BOOTSTRAP; -- 2.7.4