package Thread::CriticalSection; use warnings; use strict; use Thread::Semaphore; our $VERSION = '0.02'; sub new { my $class = shift; return bless { sem => Thread::Semaphore->new, }, $class; } sub execute { my ($self, $sub) = @_; my $sem = $self->{sem}; my $wantarray = wantarray; my @result; $sem->down; eval { if ($wantarray) { @result = $sub->() } else { $result[0] = $sub->() } }; my $e = $@; $sem->up; die $e if $e; return @result if $wantarray; return $result[0]; } 42; # End of Thread::CriticalSection =head1 NAME Thread::CriticalSection - Run a coderef inside a critical section =head1 VERSION Version 0.02 =head1 SYNOPSIS use threads; use Thread::CriticalSection; my $cs = Thread::CriticalSection->new; $cs->execute(sub { # your code is protected by $cs }); # you can also return stuff my $result = $cs->execute(sub { # do work in a cosy critical section return $result; }); # and you can even use wantarray my @victims = $cs->execute(sub { # do work in a cosy critical section return wantarray? @result : \@result; }); =head1 STATUS As of 2008/06/18, this module is considered beta quality. The interface should not suffer any changes but its a young module with very little use. You'll still see "Scalars leaked" in the test suite, and I would like to get rid of them before declaring the code as stable. The abnormal thread terminations I get when running the test suite are in the unsafe tests, so I think I'm getting into perl threads issues, not bugs in this module. Prof of the opposite (in the form of failing tests) are most welcome. =head1 DESCRIPTION The Thread::CriticalSection module allows you to run a coderef inside a critical section. All the details of entering and leaving the critical section are taken care of by the C method. You can have several critical sections simultaneously inside your program. The usual care and feeding regarding deadlocks should be taken when calling C recursively. =head1 METHODS =over 4 =item * $cs = new() Creates and returns a new critical section. Requires no parameters. =item * [$return|@return] = $cs->execute(sub {}|$coderef) Executes the given $coderef inside the critical section. The $coderef can use wantarray to inspect the context of the call and react accordingly. =back =head1 AUTHOR Pedro Melo, C<< >> =head1 DEVELOPMENT You can find the source for this module at L. =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc Thread::CriticalSection You can also look for information at: =over 4 =item * RT: CPAN's request tracker L =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * Search CPAN L =back =head1 COPYRIGHT & LICENSE Copyright 2008 Pedro Melo, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut