summaryrefslogtreecommitdiff
path: root/ext/threads
diff options
context:
space:
mode:
authorAndy Bussey <andybussey@yahoo.co.uk>2002-01-03 00:46:58 +0000
committerAbhijit Menon-Sen <ams@wiw.org>2002-01-02 23:56:37 +0000
commitdab065ea9c8b629eb22b219d57901aa33df76f4f (patch)
treec6ac2ab90d31f9900568b1b23b14f881ca0c3a9f /ext/threads
parent94bdecf9800c3bee967274854f7adf2933ffd42b (diff)
downloadperl-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.pm13
-rw-r--r--ext/threads/shared/t/no_share.t47
-rwxr-xr-xext/threads/threads.pm12
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