summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Sugalski <dan@sidhe.org>2000-10-25 09:36:35 -0400
committerJarkko Hietaniemi <jhi@iki.fi>2000-10-25 20:14:30 +0000
commit8dcd6f7b32c170bcf62c1187a3413da9a3cdf97a (patch)
tree8465bcaf8dd18dc7ab182f0ea73e93049e9c1910
parent2607bbb4b9732ac518aea01a4967f693eba5de58 (diff)
downloadperl-8dcd6f7b32c170bcf62c1187a3413da9a3cdf97a.tar.gz
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
-rw-r--r--ext/Thread/Thread.pm17
-rw-r--r--ext/Thread/Thread.xs9
-rw-r--r--global.sym2
-rw-r--r--perl.c1
-rw-r--r--thrdvar.h2
-rw-r--r--util.c1
6 files changed, 30 insertions, 2 deletions
diff --git a/ext/Thread/Thread.pm b/ext/Thread/Thread.pm
index c752e3d6dd..22ae4ef404 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<flags> 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<done> 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 17e5aefd04..27e2533f3e 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 0dea03efbe..2143319d85 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 3d874ca9bd..b65bdb91a8 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 e4cfacc06c..06cfe729a6 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 2122d4ea17..619c5aaa69 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;