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