xref: /openbsd-src/gnu/usr.bin/perl/dist/threads-shared/lib/threads/shared.pm (revision 48950c12d106c85f315112191a0228d7b83b9510)
1package threads::shared;
2
3use 5.008;
4
5use strict;
6use warnings;
7
8use Scalar::Util qw(reftype refaddr blessed);
9
10our $VERSION = '1.40';
11my $XS_VERSION = $VERSION;
12$VERSION = eval $VERSION;
13
14# Declare that we have been loaded
15$threads::shared::threads_shared = 1;
16
17# Load the XS code, if applicable
18if ($threads::threads) {
19    require XSLoader;
20    XSLoader::load('threads::shared', $XS_VERSION);
21
22    *is_shared = \&_id;
23
24} else {
25    # String eval is generally evil, but we don't want these subs to
26    # exist at all if 'threads' is not loaded successfully.
27    # Vivifying them conditionally this way saves on average about 4K
28    # of memory per thread.
29    eval <<'_MARKER_';
30        sub share          (\[$@%])         { return $_[0] }
31        sub is_shared      (\[$@%])         { undef }
32        sub cond_wait      (\[$@%];\[$@%])  { undef }
33        sub cond_timedwait (\[$@%]$;\[$@%]) { undef }
34        sub cond_signal    (\[$@%])         { undef }
35        sub cond_broadcast (\[$@%])         { undef }
36_MARKER_
37}
38
39
40### Export ###
41
42sub import
43{
44    # Exported subroutines
45    my @EXPORT = qw(share is_shared cond_wait cond_timedwait
46                    cond_signal cond_broadcast shared_clone);
47    if ($threads::threads) {
48        push(@EXPORT, 'bless');
49    }
50
51    # Export subroutine names
52    my $caller = caller();
53    foreach my $sym (@EXPORT) {
54        no strict 'refs';
55        *{$caller.'::'.$sym} = \&{$sym};
56    }
57}
58
59
60# Predeclarations for internal functions
61my ($make_shared);
62
63
64### Methods, etc. ###
65
66sub threads::shared::tie::SPLICE
67{
68    require Carp;
69    Carp::croak('Splice not implemented for shared arrays');
70}
71
72
73# Create a thread-shared clone of a complex data structure or object
74sub shared_clone
75{
76    if (@_ != 1) {
77        require Carp;
78        Carp::croak('Usage: shared_clone(REF)');
79    }
80
81    return $make_shared->(shift, {});
82}
83
84
85### Internal Functions ###
86
87# Used by shared_clone() to recursively clone
88#   a complex data structure or object
89$make_shared = sub {
90    my ($item, $cloned) = @_;
91
92    # Just return the item if:
93    # 1. Not a ref;
94    # 2. Already shared; or
95    # 3. Not running 'threads'.
96    return $item if (! ref($item) || is_shared($item) || ! $threads::threads);
97
98    # Check for previously cloned references
99    #   (this takes care of circular refs as well)
100    my $addr = refaddr($item);
101    if (exists($cloned->{$addr})) {
102        # Return the already existing clone
103        return $cloned->{$addr};
104    }
105
106    # Make copies of array, hash and scalar refs and refs of refs
107    my $copy;
108    my $ref_type = reftype($item);
109
110    # Copy an array ref
111    if ($ref_type eq 'ARRAY') {
112        # Make empty shared array ref
113        $copy = &share([]);
114        # Add to clone checking hash
115        $cloned->{$addr} = $copy;
116        # Recursively copy and add contents
117        push(@$copy, map { $make_shared->($_, $cloned) } @$item);
118    }
119
120    # Copy a hash ref
121    elsif ($ref_type eq 'HASH') {
122        # Make empty shared hash ref
123        $copy = &share({});
124        # Add to clone checking hash
125        $cloned->{$addr} = $copy;
126        # Recursively copy and add contents
127        foreach my $key (keys(%{$item})) {
128            $copy->{$key} = $make_shared->($item->{$key}, $cloned);
129        }
130    }
131
132    # Copy a scalar ref
133    elsif ($ref_type eq 'SCALAR') {
134        $copy = \do{ my $scalar = $$item; };
135        share($copy);
136        # Add to clone checking hash
137        $cloned->{$addr} = $copy;
138    }
139
140    # Copy of a ref of a ref
141    elsif ($ref_type eq 'REF') {
142        # Special handling for $x = \$x
143        if ($addr == refaddr($$item)) {
144            $copy = \$copy;
145            share($copy);
146            $cloned->{$addr} = $copy;
147        } else {
148            my $tmp;
149            $copy = \$tmp;
150            share($copy);
151            # Add to clone checking hash
152            $cloned->{$addr} = $copy;
153            # Recursively copy and add contents
154            $tmp = $make_shared->($$item, $cloned);
155        }
156
157    } else {
158        require Carp;
159        Carp::croak("Unsupported ref type: ", $ref_type);
160    }
161
162    # If input item is an object, then bless the copy into the same class
163    if (my $class = blessed($item)) {
164        bless($copy, $class);
165    }
166
167    # Clone READONLY flag
168    if ($ref_type eq 'SCALAR') {
169        if (Internals::SvREADONLY($$item)) {
170            Internals::SvREADONLY($$copy, 1) if ($] >= 5.008003);
171        }
172    }
173    if (Internals::SvREADONLY($item)) {
174        Internals::SvREADONLY($copy, 1) if ($] >= 5.008003);
175    }
176
177    return $copy;
178};
179
1801;
181
182__END__
183
184=head1 NAME
185
186threads::shared - Perl extension for sharing data structures between threads
187
188=head1 VERSION
189
190This document describes threads::shared version 1.40
191
192=head1 SYNOPSIS
193
194  use threads;
195  use threads::shared;
196
197  my $var :shared;
198  my %hsh :shared;
199  my @ary :shared;
200
201  my ($scalar, @array, %hash);
202  share($scalar);
203  share(@array);
204  share(%hash);
205
206  $var = $scalar_value;
207  $var = $shared_ref_value;
208  $var = shared_clone($non_shared_ref_value);
209  $var = shared_clone({'foo' => [qw/foo bar baz/]});
210
211  $hsh{'foo'} = $scalar_value;
212  $hsh{'bar'} = $shared_ref_value;
213  $hsh{'baz'} = shared_clone($non_shared_ref_value);
214  $hsh{'quz'} = shared_clone([1..3]);
215
216  $ary[0] = $scalar_value;
217  $ary[1] = $shared_ref_value;
218  $ary[2] = shared_clone($non_shared_ref_value);
219  $ary[3] = shared_clone([ {}, [] ]);
220
221  { lock(%hash); ...  }
222
223  cond_wait($scalar);
224  cond_timedwait($scalar, time() + 30);
225  cond_broadcast(@array);
226  cond_signal(%hash);
227
228  my $lockvar :shared;
229  # condition var != lock var
230  cond_wait($var, $lockvar);
231  cond_timedwait($var, time()+30, $lockvar);
232
233=head1 DESCRIPTION
234
235By default, variables are private to each thread, and each newly created
236thread gets a private copy of each existing variable.  This module allows you
237to share variables across different threads (and pseudo-forks on Win32).  It
238is used together with the L<threads> module.
239
240This module supports the sharing of the following data types only:  scalars
241and scalar refs, arrays and array refs, and hashes and hash refs.
242
243=head1 EXPORT
244
245The following functions are exported by this module: C<share>,
246C<shared_clone>, C<is_shared>, C<cond_wait>, C<cond_timedwait>, C<cond_signal>
247and C<cond_broadcast>
248
249Note that if this module is imported when L<threads> has not yet been loaded,
250then these functions all become no-ops.  This makes it possible to write
251modules that will work in both threaded and non-threaded environments.
252
253=head1 FUNCTIONS
254
255=over 4
256
257=item share VARIABLE
258
259C<share> takes a variable and marks it as shared:
260
261  my ($scalar, @array, %hash);
262  share($scalar);
263  share(@array);
264  share(%hash);
265
266C<share> will return the shared rvalue, but always as a reference.
267
268Variables can also be marked as shared at compile time by using the
269C<:shared> attribute:
270
271  my ($var, %hash, @array) :shared;
272
273Shared variables can only store scalars, refs of shared variables, or
274refs of shared data (discussed in next section):
275
276  my ($var, %hash, @array) :shared;
277  my $bork;
278
279  # Storing scalars
280  $var = 1;
281  $hash{'foo'} = 'bar';
282  $array[0] = 1.5;
283
284  # Storing shared refs
285  $var = \%hash;
286  $hash{'ary'} = \@array;
287  $array[1] = \$var;
288
289  # The following are errors:
290  #   $var = \$bork;                    # ref of non-shared variable
291  #   $hash{'bork'} = [];               # non-shared array ref
292  #   push(@array, { 'x' => 1 });       # non-shared hash ref
293
294=item shared_clone REF
295
296C<shared_clone> takes a reference, and returns a shared version of its
297argument, performing a deep copy on any non-shared elements.  Any shared
298elements in the argument are used as is (i.e., they are not cloned).
299
300  my $cpy = shared_clone({'foo' => [qw/foo bar baz/]});
301
302Object status (i.e., the class an object is blessed into) is also cloned.
303
304  my $obj = {'foo' => [qw/foo bar baz/]};
305  bless($obj, 'Foo');
306  my $cpy = shared_clone($obj);
307  print(ref($cpy), "\n");         # Outputs 'Foo'
308
309For cloning empty array or hash refs, the following may also be used:
310
311  $var = &share([]);   # Same as $var = shared_clone([]);
312  $var = &share({});   # Same as $var = shared_clone({});
313
314=item is_shared VARIABLE
315
316C<is_shared> checks if the specified variable is shared or not.  If shared,
317returns the variable's internal ID (similar to
318L<refaddr()|Scalar::Util/"refaddr EXPR">).  Otherwise, returns C<undef>.
319
320  if (is_shared($var)) {
321      print("\$var is shared\n");
322  } else {
323      print("\$var is not shared\n");
324  }
325
326When used on an element of an array or hash, C<is_shared> checks if the
327specified element belongs to a shared array or hash.  (It does not check
328the contents of that element.)
329
330  my %hash :shared;
331  if (is_shared(%hash)) {
332      print("\%hash is shared\n");
333  }
334
335  $hash{'elem'} = 1;
336  if (is_shared($hash{'elem'})) {
337      print("\$hash{'elem'} is in a shared hash\n");
338  }
339
340=item lock VARIABLE
341
342C<lock> places a B<advisory> lock on a variable until the lock goes out of
343scope.  If the variable is locked by another thread, the C<lock> call will
344block until it's available.  Multiple calls to C<lock> by the same thread from
345within dynamically nested scopes are safe -- the variable will remain locked
346until the outermost lock on the variable goes out of scope.
347
348C<lock> follows references exactly I<one> level:
349
350  my %hash :shared;
351  my $ref = \%hash;
352  lock($ref);           # This is equivalent to lock(%hash)
353
354Note that you cannot explicitly unlock a variable; you can only wait for the
355lock to go out of scope.  This is most easily accomplished by locking the
356variable inside a block.
357
358  my $var :shared;
359  {
360      lock($var);
361      # $var is locked from here to the end of the block
362      ...
363  }
364  # $var is now unlocked
365
366As locks are advisory, they do not prevent data access or modification by
367another thread that does not itself attempt to obtain a lock on the variable.
368
369You cannot lock the individual elements of a container variable:
370
371  my %hash :shared;
372  $hash{'foo'} = 'bar';
373  #lock($hash{'foo'});          # Error
374  lock(%hash);                  # Works
375
376If you need more fine-grained control over shared variable access, see
377L<Thread::Semaphore>.
378
379=item cond_wait VARIABLE
380
381=item cond_wait CONDVAR, LOCKVAR
382
383The C<cond_wait> function takes a B<locked> variable as a parameter, unlocks
384the variable, and blocks until another thread does a C<cond_signal> or
385C<cond_broadcast> for that same locked variable.  The variable that
386C<cond_wait> blocked on is relocked after the C<cond_wait> is satisfied.  If
387there are multiple threads C<cond_wait>ing on the same variable, all but one
388will re-block waiting to reacquire the lock on the variable. (So if you're only
389using C<cond_wait> for synchronisation, give up the lock as soon as possible).
390The two actions of unlocking the variable and entering the blocked wait state
391are atomic, the two actions of exiting from the blocked wait state and
392re-locking the variable are not.
393
394In its second form, C<cond_wait> takes a shared, B<unlocked> variable followed
395by a shared, B<locked> variable.  The second variable is unlocked and thread
396execution suspended until another thread signals the first variable.
397
398It is important to note that the variable can be notified even if no thread
399C<cond_signal> or C<cond_broadcast> on the variable.  It is therefore
400important to check the value of the variable and go back to waiting if the
401requirement is not fulfilled.  For example, to pause until a shared counter
402drops to zero:
403
404  { lock($counter); cond_wait($counter) until $counter == 0; }
405
406=item cond_timedwait VARIABLE, ABS_TIMEOUT
407
408=item cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR
409
410In its two-argument form, C<cond_timedwait> takes a B<locked> variable and an
411absolute timeout as parameters, unlocks the variable, and blocks until the
412timeout is reached or another thread signals the variable.  A false value is
413returned if the timeout is reached, and a true value otherwise.  In either
414case, the variable is re-locked upon return.
415
416Like C<cond_wait>, this function may take a shared, B<locked> variable as an
417additional parameter; in this case the first parameter is an B<unlocked>
418condition variable protected by a distinct lock variable.
419
420Again like C<cond_wait>, waking up and reacquiring the lock are not atomic,
421and you should always check your desired condition after this function
422returns.  Since the timeout is an absolute value, however, it does not have to
423be recalculated with each pass:
424
425  lock($var);
426  my $abs = time() + 15;
427  until ($ok = desired_condition($var)) {
428      last if !cond_timedwait($var, $abs);
429  }
430  # we got it if $ok, otherwise we timed out!
431
432=item cond_signal VARIABLE
433
434The C<cond_signal> function takes a B<locked> variable as a parameter and
435unblocks one thread that's C<cond_wait>ing on that variable. If more than one
436thread is blocked in a C<cond_wait> on that variable, only one (and which one
437is indeterminate) will be unblocked.
438
439If there are no threads blocked in a C<cond_wait> on the variable, the signal
440is discarded. By always locking before signaling, you can (with care), avoid
441signaling before another thread has entered cond_wait().
442
443C<cond_signal> will normally generate a warning if you attempt to use it on an
444unlocked variable. On the rare occasions where doing this may be sensible, you
445can suppress the warning with:
446
447  { no warnings 'threads'; cond_signal($foo); }
448
449=item cond_broadcast VARIABLE
450
451The C<cond_broadcast> function works similarly to C<cond_signal>.
452C<cond_broadcast>, though, will unblock B<all> the threads that are blocked in
453a C<cond_wait> on the locked variable, rather than only one.
454
455=back
456
457=head1 OBJECTS
458
459L<threads::shared> exports a version of L<bless()|perlfunc/"bless REF"> that
460works on shared objects such that I<blessings> propagate across threads.
461
462  # Create a shared 'Foo' object
463  my $foo :shared = shared_clone({});
464  bless($foo, 'Foo');
465
466  # Create a shared 'Bar' object
467  my $bar :shared = shared_clone({});
468  bless($bar, 'Bar');
469
470  # Put 'bar' inside 'foo'
471  $foo->{'bar'} = $bar;
472
473  # Rebless the objects via a thread
474  threads->create(sub {
475      # Rebless the outer object
476      bless($foo, 'Yin');
477
478      # Cannot directly rebless the inner object
479      #bless($foo->{'bar'}, 'Yang');
480
481      # Retrieve and rebless the inner object
482      my $obj = $foo->{'bar'};
483      bless($obj, 'Yang');
484      $foo->{'bar'} = $obj;
485
486  })->join();
487
488  print(ref($foo),          "\n");    # Prints 'Yin'
489  print(ref($foo->{'bar'}), "\n");    # Prints 'Yang'
490  print(ref($bar),          "\n");    # Also prints 'Yang'
491
492=head1 NOTES
493
494L<threads::shared> is designed to disable itself silently if threads are not
495available.  This allows you to write modules and packages that can be used
496in both threaded and non-threaded applications.
497
498If you want access to threads, you must C<use threads> before you
499C<use threads::shared>.  L<threads> will emit a warning if you use it after
500L<threads::shared>.
501
502=head1 BUGS AND LIMITATIONS
503
504When C<share> is used on arrays, hashes, array refs or hash refs, any data
505they contain will be lost.
506
507  my @arr = qw(foo bar baz);
508  share(@arr);
509  # @arr is now empty (i.e., == ());
510
511  # Create a 'foo' object
512  my $foo = { 'data' => 99 };
513  bless($foo, 'foo');
514
515  # Share the object
516  share($foo);        # Contents are now wiped out
517  print("ERROR: \$foo is empty\n")
518      if (! exists($foo->{'data'}));
519
520Therefore, populate such variables B<after> declaring them as shared.  (Scalar
521and scalar refs are not affected by this problem.)
522
523It is often not wise to share an object unless the class itself has been
524written to support sharing.  For example, an object's destructor may get
525called multiple times, once for each thread's scope exit.  Another danger is
526that the contents of hash-based objects will be lost due to the above
527mentioned limitation.  See F<examples/class.pl> (in the CPAN distribution of
528this module) for how to create a class that supports object sharing.
529
530Destructors may not be called on objects if those objects still exist at
531global destruction time.  If the destructors must be called, make sure
532there are no circular references and that nothing is referencing the
533objects, before the program ends.
534
535Does not support C<splice> on arrays.  Does not support explicitly changing
536array lengths via $#array -- use C<push> and C<pop> instead.
537
538Taking references to the elements of shared arrays and hashes does not
539autovivify the elements, and neither does slicing a shared array/hash over
540non-existent indices/keys autovivify the elements.
541
542C<share()> allows you to C<< share($hashref->{key}) >> and
543C<< share($arrayref->[idx]) >> without giving any error message.  But the
544C<< $hashref->{key} >> or C<< $arrayref->[idx] >> is B<not> shared, causing
545the error "lock can only be used on shared values" to occur when you attempt
546to C<< lock($hasref->{key}) >> or C<< lock($arrayref->[idx]) >> in another
547thread.
548
549Using L<refaddr()|Scalar::Util/"refaddr EXPR">) is unreliable for testing
550whether or not two shared references are equivalent (e.g., when testing for
551circular references).  Use L<is_shared()|/"is_shared VARIABLE">, instead:
552
553    use threads;
554    use threads::shared;
555    use Scalar::Util qw(refaddr);
556
557    # If ref is shared, use threads::shared's internal ID.
558    # Otherwise, use refaddr().
559    my $addr1 = is_shared($ref1) || refaddr($ref1);
560    my $addr2 = is_shared($ref2) || refaddr($ref2);
561
562    if ($addr1 == $addr2) {
563        # The refs are equivalent
564    }
565
566L<each()|perlfunc/"each HASH"> does not work properly on shared references
567embedded in shared structures.  For example:
568
569    my %foo :shared;
570    $foo{'bar'} = shared_clone({'a'=>'x', 'b'=>'y', 'c'=>'z'});
571
572    while (my ($key, $val) = each(%{$foo{'bar'}})) {
573        ...
574    }
575
576Either of the following will work instead:
577
578    my $ref = $foo{'bar'};
579    while (my ($key, $val) = each(%{$ref})) {
580        ...
581    }
582
583    foreach my $key (keys(%{$foo{'bar'}})) {
584        my $val = $foo{'bar'}{$key};
585        ...
586    }
587
588View existing bug reports at, and submit any new bugs, problems, patches, etc.
589to: L<http://rt.cpan.org/Public/Dist/Display.html?Name=threads-shared>
590
591=head1 SEE ALSO
592
593L<threads::shared> Discussion Forum on CPAN:
594L<http://www.cpanforum.com/dist/threads-shared>
595
596L<threads>, L<perlthrtut>
597
598L<http://www.perl.com/pub/a/2002/06/11/threads.html> and
599L<http://www.perl.com/pub/a/2002/09/04/threads.html>
600
601Perl threads mailing list:
602L<http://lists.perl.org/list/ithreads.html>
603
604=head1 AUTHOR
605
606Artur Bergman E<lt>sky AT crucially DOT netE<gt>
607
608Documentation borrowed from the old Thread.pm.
609
610CPAN version produced by Jerry D. Hedden E<lt>jdhedden AT cpan DOT orgE<gt>.
611
612=head1 LICENSE
613
614threads::shared is released under the same license as Perl.
615
616=cut
617