t/japh/abigail.t (was: FETCH for tied $" called an odd number of times.)
[p5sagit/p5-mst-13.2.git] / ext / threads / shared / shared.pm
1 package threads::shared;
2 use strict;
3 use warnings;
4 use Config;
5
6 require Exporter;
7 our @ISA = qw(Exporter);
8 our @EXPORT = qw(share cond_wait cond_broadcast cond_signal unlock);
9 our @EXPORT_OK = qw(_id _thrcnt _refcnt);
10 our $VERSION = '0.90';
11
12
13 if ($Config{'useithreads'}) {
14         *cond_wait = \&cond_wait_enabled;
15         *cond_signal = \&cond_signal_enabled;
16         *cond_broadcast = \&cond_broadcast_enabled;
17         *unlock = \&unlock_enabled;
18         require XSLoader;
19         XSLoader::load('threads::shared',$VERSION);
20 }
21 else {
22         *share = \&share_disabled;
23         *cond_wait = \&cond_wait_disabled;
24         *cond_signal = \&cond_signal_disabled;
25         *cond_broadcast = \&cond_broadcast_disabled;
26         *unlock = \&unlock_disabled;
27 }
28
29
30 sub cond_wait_disabled { return @_ };
31 sub cond_signal_disabled { return @_};
32 sub cond_broadcast_disabled { return @_};
33 sub unlock_disabled { 1 };
34 sub lock_disabled { 1 }
35 sub share_disabled { return @_}
36
37 $threads::shared::threads_shared = 1;
38
39 sub _thrcnt { 42 }
40
41 sub threads::shared::tie::SPLICE
42 {
43  die "Splice not implemented for shared arrays";
44 }
45
46
47 __END__
48
49 =head1 NAME
50
51 threads::shared - Perl extension for sharing data structures between threads
52
53 =head1 SYNOPSIS
54
55   use threads::shared;
56
57   my($foo, @foo, %foo);
58   share($foo);
59   share(@foo);
60   share(%hash);
61   my $bar = share([]);
62   $hash{bar} = share({});
63
64   lock(%hash);
65   unlock(%hash);
66   cond_wait($scalar);
67   cond_broadcast(@array);
68   cond_signal(%hash);
69
70 =head1 DESCRIPTION
71
72 This modules allows you to share() variables. These variables will
73 then be shared across different threads (and pseudoforks on
74 win32). They are used together with the threads module.
75
76 =head1 EXPORT
77
78 C<share>, C<lock>, C<unlock>, C<cond_wait>, C<cond_signal>, C<cond_broadcast>
79
80 =head1 FUNCTIONS
81
82 =over 4
83
84 =item share VARIABLE
85
86 C<share> takes a value and marks it as shared, you can share a scalar, array, hash
87 scalar ref, array ref and hash ref, C<share> will return the shared value.
88
89 C<share> will traverse up references exactly I<one> level.
90 C<share(\$a)> is equivalent to C<share($a)>, while C<share(\\$a)> is not.
91
92 =item lock VARIABLE
93
94 C<lock> places a lock on a variable until the lock goes out of scope.  If
95 the variable is locked by another thread, the C<lock> call will block until
96 it's available. C<lock> is recursive, so multiple calls to C<lock> are
97 safe--the variable will remain locked until the outermost lock on the
98 variable goes out of scope or C<unlock> is called enough times to match
99 the number of calls to <lock>.
100
101 If a container object, such as a hash or array, is locked, all the elements
102 of that container are not locked. For example, if a thread does a C<lock
103 @a>, any other thread doing a C<lock($a[12])> won't block.
104
105 C<lock> will traverse up references exactly I<one> level.
106 C<lock(\$a)> is equivalent to C<lock($a)>, while C<lock(\\$a)> is not.
107
108
109 =item unlock VARIABLE
110
111 C<unlock> takes a locked shared value and decrements the lock count.
112 If the lock count is zero the variable is unlocked. It is not necessary
113 to call C<unlock> but it can be usefull to reduce lock contention.
114
115 C<unlock> will traverse up references exactly I<one> level.
116 C<unlock(\$a)> is equivalent to C<unlock($a)>, while C<unlock(\\$a)> is not.
117
118 =item cond_wait VARIABLE
119
120 The C<cond_wait> function takes a B<locked> variable as a parameter,
121 unlocks the variable, and blocks until another thread does a C<cond_signal>
122 or C<cond_broadcast> for that same locked variable. The variable that
123 C<cond_wait> blocked on is relocked after the C<cond_wait> is satisfied.
124 If there are multiple threads C<cond_wait>ing on the same variable, all but
125 one will reblock waiting to reaquire the lock on the variable. (So if
126 you're only using C<cond_wait> for synchronization, give up the lock as
127 soon as possible)
128
129 It is important to note that the variable can be notified even if no
130 thread C<cond_signal> or C<cond_broadcast> on the variable. It is therefore
131 important to check the value of the variable and go back to waiting if the
132 requirment is not fullfilled.
133
134 =item cond_signal VARIABLE
135
136 The C<cond_signal> function takes a B<locked> variable as a parameter and
137 unblocks one thread that's C<cond_wait>ing on that variable. If more than
138 one thread is blocked in a C<cond_wait> on that variable, only one (and
139 which one is indeterminate) will be unblocked.
140
141 If there are no threads blocked in a C<cond_wait> on the variable, the
142 signal is discarded.
143
144 =item cond_broadcast VARIABLE
145
146 The C<cond_broadcast> function works similarly to C<cond_signal>.
147 C<cond_broadcast>, though, will unblock B<all> the threads that are blocked
148 in a C<cond_wait> on the locked variable, rather than only one.
149
150
151 =head1 NOTES
152
153 threads::shared is designed to disable itself silently if threads are
154 not available. If you want access to threads, you must C<use threads>
155 before you C<use threads::shared>.  threads will emit a warning if you
156 use it after threads::shared.
157
158 =head1 BUGS
159
160 C<bless> is not supported on shared references, in the current version
161 C<bless> will only bless the thread local reference and the blessing
162 will not propagate to the other threads, this is expected to be implmented
163 in the future.
164
165 Does not support splice on arrays!
166
167 =head1 AUTHOR
168
169 Arthur Bergman E<lt>arthur at contiller.seE<gt>
170
171 threads::shared is released under the same license as Perl
172
173 Documentation borrowed from Thread.pm
174
175 =head1 SEE ALSO
176
177 L<perl> L<threads>
178
179 =cut
180
181
182
183
184