Advertisement
Guest User

flock_anyevent_drvtiny

a guest
Oct 28th, 2016
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.69 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use 5.14.1;
  3. use strict;
  4. use warnings;
  5. use Fcntl qw(:flock);
  6. #use IPC::ShareLite;
  7. use AnyEvent;
  8. use Try::Tiny;
  9. #use Time::HiRes qw(time sleep);
  10.  
  11. my ($minInterval,$processingTime)=@ARGV;
  12. $minInterval||=5;
  13. $processingTime||=3;
  14.  
  15. my $pnum=0;
  16. sub psay {
  17.     printf "[\@%s][%d] $_[0]\n", time(), $pnum, @_[1..$#_];
  18. }
  19.  
  20. my $cv=AnyEvent->condvar;
  21. my @hndlSleep;
  22. my $fileName="/tmp/$$.lock";
  23. open my $fhLock,'>',$fileName;
  24. close $fhLock;
  25. $cv->begin;
  26. my $hndlDummyTasker=AnyEvent->timer(
  27.     'after'=>0,
  28.     'interval'=>1,
  29.     'cb'=>sub {
  30.         my $flLocked;
  31.         $pnum++;
  32.         open my $fhLock,'<',$fileName;     
  33.         try {
  34.             unless ($flLocked=flock($fhLock,LOCK_NB | LOCK_EX)) {
  35.                 psay 'Cant acquire lock, exiting';
  36.                 die;
  37.             }
  38.             psay 'Acquired lock succesfully';            
  39.             my ($prevTS)=do{ local $/; <$fhLock> }=~m/(\d+)/;
  40.             psay 'Previous timestamp: %s', $prevTS;
  41.             if ( $prevTS and (time() - $prevTS)<$minInterval) {
  42.                 psay 'I cant run more than 1 time in %d seconds', $minInterval;
  43.                 flock($fhLock,LOCK_UN);
  44.                 die;
  45.             }
  46.             open my $fhw,'>',$fileName;
  47.             print $fhw time(),"\n";
  48.             close $fhw;
  49.             psay 'Oh, yes! We are here. Lets doing something nasty...';
  50.             $cv->begin;
  51.             $hndlSleep[$pnum]=AnyEvent->timer('after'=>3,'cb'=>sub {
  52.                 psay 'OK, we did it, bye';
  53.                 flock($fhLock,LOCK_UN);
  54.                 $cv->end;
  55.             });
  56.         } catch {
  57.             flock($fhLock,LOCK_UN) if $flLocked;
  58.         };
  59.     }
  60. );
  61.  
  62. $cv->recv();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement