=begin the goal of this module is for us to have a way of keeping track of objects accross processes =cut #using ipcs command in linux to see shared memory segments and shared semaphores #ipcrm deletes those shared structures package ObjectMonitor; #monitors all instances of objects over multiple processes use strict; use warnings; use feature 'say'; use Data::Dumper; use IPC::ShareLite; use Storable qw/ freeze thaw /; my $newcall=0; sub new { my($class,$key_id) = @_; say 'call:'.++$newcall; my $shared=undef; my $just_created=0; my $self; my @data; eval { say "ALREADY"; $shared = IPC::ShareLite->new( -key => $key_id, -create => 'no', -destroy => 'no' ); @data = @{ thaw( $shared->fetch() ) }; push @data,{ id => $data[-1]->{id}+1, pid=> $$, }; $shared->store(freeze(\@data)); }; unless($shared) { say "NEW SHARED!"; $shared = IPC::ShareLite->new( -key => $key_id, -create => 'yes', -destroy => 'no' ); push @data,{ id => 0, pid=> $$, }; $shared->store(freeze(\@data)); $just_created=1; }; $self->{key_id}= $key_id; $self->{shared}= $shared; #say Dumper \@data; #$self->{cross_process_id}=$data[-1]; return bless($self , $class); } sub print_ids { my($self) = @_; my @data = @{ thaw($self->{shared}->fetch) }; #say Dumper \@data; } sub DESTROY { my ($self) = @_; return unless $self->{shared}; my $cross_id = $self->{cross_process_id}; my @data = @{ thaw( $self->{shared}->fetch ) }; say scalar @data; @data = grep{ $_->{id} != $self->{cross_process_id} } @data; $self->{shared}->store(freeze(\@data)); say scalar @data; say "DESTROYED !"; } 1;