diff options
author | Andy Bussey <andybussey@yahoo.co.uk> | 2002-01-03 00:46:58 +0000 |
---|---|---|
committer | Abhijit Menon-Sen <ams@wiw.org> | 2002-01-02 23:56:37 +0000 |
commit | dab065ea9c8b629eb22b219d57901aa33df76f4f (patch) | |
tree | c6ac2ab90d31f9900568b1b23b14f881ca0c3a9f /ext/threads | |
parent | 94bdecf9800c3bee967274854f7adf2933ffd42b (diff) | |
download | perl-dab065ea9c8b629eb22b219d57901aa33df76f4f.tar.gz |
threads::shared disabling
Message-Id: <20020103004658.97969.qmail@web21006.mail.yahoo.com>
p4raw-link: @14015 on //depot/perl: 38b0d3dc02713f3c8313d8d82d06f680810942d4
p4raw-id: //depot/perl@14030
Diffstat (limited to 'ext/threads')
-rw-r--r-- | ext/threads/shared/shared.pm | 13 | ||||
-rw-r--r-- | ext/threads/shared/t/no_share.t | 47 | ||||
-rwxr-xr-x | ext/threads/threads.pm | 12 |
3 files changed, 70 insertions, 2 deletions
diff --git a/ext/threads/shared/shared.pm b/ext/threads/shared/shared.pm index f8d04e22ff..1f2ad9d99c 100644 --- a/ext/threads/shared/shared.pm +++ b/ext/threads/shared/shared.pm @@ -17,7 +17,7 @@ BEGIN { *share = \&share_disabled; *cond_wait = \&cond_wait_disabled; *cond_signal = \&cond_signal_disabled; - *cond_broadcast = \&cond_broadcast_dosabled; + *cond_broadcast = \&cond_broadcast_disabled; *unlock = \&unlock_disabled; } } @@ -100,6 +100,9 @@ sub TIEHASH { } package threads::shared; + +$threads::shared::threads_shared = 1; + bootstrap threads::shared $VERSION; __END__ @@ -205,6 +208,14 @@ The C<cond_broadcast> function works similarly to C<cond_signal>. C<cond_broadcast>, though, will unblock B<all> the threads that are blocked in a C<cond_wait> on the locked variable, rather than only one. + +=head1 NOTES + +threads::shared is designed is disable itself silently if threads are +not available. If you want access to threads, you must C<use threads> +before you C<use threads::shared>. threads will emit a warning if you +use it before threads::shared. + =head1 BUGS C<bless> is not supported on shared references, in the current version diff --git a/ext/threads/shared/t/no_share.t b/ext/threads/shared/t/no_share.t new file mode 100644 index 0000000000..519d9cb532 --- /dev/null +++ b/ext/threads/shared/t/no_share.t @@ -0,0 +1,47 @@ + + + + +BEGIN { +# chdir 't' if -d 't'; +# push @INC ,'../lib'; + require Config; import Config; + unless ($Config{'useithreads'}) { + print "1..0 # Skip: no useithreads\n"; + exit 0; + } + $SIG{__WARN__} = sub { $warnmsg = shift; }; +} + + +sub ok { + my ($id, $ok, $name) = @_; + + # You have to do it this way or VMS will get confused. + print $ok ? "ok $id - $name\n" : "not ok $id - $name\n"; + + printf "# Failed test at line %d\n", (caller)[2] unless $ok; + + return $ok; +} + +our $warnmsg; +use ExtUtils::testlib; +use strict; +BEGIN { print "1..5\n" }; +use threads::shared; +use threads; +ok(1,1,"loaded"); +ok(2,$warnmsg =~ /Warning, threads::shared has already been loaded/, + "threads has warned us"); +my $test = "bar"; +share($test); +ok(3,$test eq "bar","Test disabled share not interfering"); +threads->create( + sub { + ok(4,$test eq "bar","Test disabled share after thread"); + $test = "baz"; + })->join(); +ok(5,$test eq "bar","Test that value hasn't changed in another thread"); + + diff --git a/ext/threads/threads.pm b/ext/threads/threads.pm index e92f1c9411..444ec5b67c 100755 --- a/ext/threads/threads.pm +++ b/ext/threads/threads.pm @@ -10,6 +10,13 @@ use overload #use threads::Shared; +BEGIN { + warn "Warning, threads::shared has already been loaded. ". + "To enable shared variables for these modules 'use threads' ". + "must be called before any of those modules are loaded\n" + if($threads::shared::threads_shared); +} + require Exporter; require DynaLoader; @@ -83,7 +90,10 @@ must use threads::shared. It is also important to note that you preferably enable threads by doing C<use threads> as early as possible and that it is not possible -to enable threading inside an eval ""; +to enable threading inside an eval ""; In particular, if you are +intending to share variables with threads::shared, you must +C<use threads> before you C<use threads::shared> and threads will emit +a warning if you do it the other way around. =over |