Changeset 98ad146c9d9c3d428099a83049740040d32dc48a for lib
- Timestamp:
- 05/11/10 22:00:27 (3 years ago)
- git-parent:
- Files:
-
- lib/Resmon/Status.pm (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
lib/Resmon/Status.pm
r1ae7896 r98ad146 9 9 use Socket; 10 10 use Fcntl qw/:flock/; 11 use IPC::SysV qw /IPC_PRIVATE IPC_CREAT IPC_RMID S_IRWXU S_IRWXG S_IRWXO/;12 11 use Data::Dumper; 13 12 14 my $SEGSIZE = 1024*256;15 13 my $KEEPALIVE_TIMEOUT = 5; 16 14 my $REQUEST_TIMEOUT = 60; … … 18 16 my $class = shift; 19 17 my $file = shift; 18 my $fh = IO::File->new(".$file.state", "+>"); 19 # Delete the just opened file - it stays open, but doesn't show on disk 20 unlink ".$file.state"; 20 21 return bless { 21 file => $file 22 file => $file, 23 shared_state => $fh 22 24 }, $class; 23 25 } … … 25 27 sub get_shared_state { 26 28 my $self = shift; 27 my $blob; 28 my $len; 29 return unless(defined($self->{shared_state})); 30 # Lock shared segment 31 # Read in 32 shmread($self->{shared_state}, $len, 0, length(pack('i', 0))); 33 $len = unpack('i', $len); 34 shmread($self->{shared_state}, $blob, length(pack('i', 0)), $len); 35 # unlock 36 my $VAR1; 37 eval $blob; 38 die $@ if ($@); 39 $self->{store} = $VAR1; 29 my $fh = $self->{shared_state}; 30 if (defined $fh) { 31 my $VAR1; 32 $fh->seek(0, 0); 33 my $blob; 34 { 35 local $/ = undef; 36 $blob = <$fh>; 37 } 38 eval $blob; 39 die $@ if ($@); 40 $self->{store} = $VAR1; 41 } else { 42 die "Unable to read shared state"; 43 }; 40 44 return $self->{store}; 41 45 } … … 43 47 sub store_shared_state { 44 48 my $self = shift; 45 return unless(defined($self->{shared_state})); 46 my $blob = Dumper($self->{store}); 47 48 # Lock shared segment 49 # Write state and flush 50 shmwrite($self->{shared_state}, pack('i', length($blob)), 51 0, length(pack('i', 0))) || die "$!"; 52 shmwrite($self->{shared_state}, $blob, length(pack('i', 0)), 53 length($blob)) || die "$!"; 54 # unlock 49 my $fh = $self->{shared_state}; 50 if (defined($fh)) { 51 $fh->truncate(0); 52 $fh->seek(0,0); 53 print $fh Dumper($self->{store}); 54 $fh->flush(); 55 } else { 56 die "Unable to store shared state"; 57 }; 55 58 } 56 59 … … 468 471 chmod 0644, "$self->{file}.swap"; 469 472 470 unless(defined($self->{shared_state})) {471 $self->{shared_state} = shmget(IPC_PRIVATE, $SEGSIZE,472 IPC_CREAT|S_IRWXU|S_IRWXG|S_IRWXO);473 die "$0: $!" unless (defined $self->{shared_state});474 }475 473 return 1; 476 474 } … … 531 529 waitpid(-1,WNOHANG); 532 530 } 533 if(defined($self->{shared_state})) {534 shmctl($self->{shared_state}, IPC_RMID, 0);535 }536 531 } 537 532 1;
