threads::shared::queue and semaphore become Thread::Semaphore
[p5sagit/p5-mst-13.2.git] / lib / Thread / Semaphore.pm
CommitLineData
d21067e0 1package Thread::Semaphore;
3d1f1caf 2
83272a45 3use threads::shared;
9c6f8578 4
83272a45 5our $VERSION = '2.00';
9c6f8578 6
d516a115 7=head1 NAME
8
83272a45 9Thread::Semaphore - thread-safe semaphores
d516a115 10
11=head1 SYNOPSIS
12
13 use Thread::Semaphore;
14 my $s = new Thread::Semaphore;
15 $s->up; # Also known as the semaphore V -operation.
16 # The guarded section is here
17 $s->down; # Also known as the semaphore P -operation.
18
19 # The default semaphore value is 1.
20 my $s = new Thread::Semaphore($initial_value);
21 $s->up($up_value);
22 $s->down($up_value);
23
5d582a37 24=head1 DESCRIPTION
25
26Semaphores provide a mechanism to regulate access to resources. Semaphores,
27unlike locks, aren't tied to particular scalars, and so may be used to
28control access to anything you care to use them for.
29
30Semaphores don't limit their values to zero or one, so they can be used to
83272a45 31control access to some resource that there may be more than one of. (For
32example, filehandles). Increment and decrement amounts aren't fixed at one
5d582a37 33either, so threads can reserve or return multiple resources at once.
34
35=head1 FUNCTIONS AND METHODS
36
37=over 8
38
39=item new
40
41=item new NUMBER
42
43C<new> creates a new semaphore, and initializes its count to the passed
44number. If no number is passed, the semaphore's count is set to one.
45
46=item down
47
48=item down NUMBER
49
50The C<down> method decreases the semaphore's count by the specified number,
83272a45 51or by one if no number has been specified. If the semaphore's count would drop
5d582a37 52below zero, this method will block until such time that the semaphore's
53count is equal to or larger than the amount you're C<down>ing the
54semaphore's count by.
55
56=item up
57
58=item up NUMBER
59
60The C<up> method increases the semaphore's count by the number specified,
83272a45 61or by one if no number has been specified. This will unblock any thread blocked
5d582a37 62trying to C<down> the semaphore if the C<up> raises the semaphore count
83272a45 63above the amount that the C<down>s are trying to decrement it by.
5d582a37 64
65=back
66
d516a115 67=cut
68
83272a45 69sub new {
d21067e0 70 my $class = shift;
83272a45 71 my $val : shared = @_ ? shift : 1;
d21067e0 72 bless \$val, $class;
73}
74
83272a45 75sub down {
d21067e0 76 my $s = shift;
83272a45 77 lock($$s);
0a00ffdb 78 my $inc = @_ ? shift : 1;
83272a45 79 cond_wait $$s until $$s >= $inc;
0a00ffdb 80 $$s -= $inc;
d21067e0 81}
82
83272a45 83sub up {
d21067e0 84 my $s = shift;
83272a45 85 lock($$s);
0a00ffdb 86 my $inc = @_ ? shift : 1;
83272a45 87 ($$s += $inc) > 0 and cond_broadcast $$s;
d21067e0 88}
89
901;