Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Re: Semaphores leaks with IPC::Shareable

by zentara (Archbishop)
on Oct 22, 2014 at 15:43 UTC ( #1104697=note: print w/replies, xml ) Need Help??

in reply to Semaphores leaks with IPC::Shareable

Here is a full example which I play with. It works. Notice the line
I run the script, then afterwards run "ipcs -a" to list ALL, and everything is cleaned up. I did run into one weirdness however, and it may be a bug. If you remove the last 2 cleanup lines
# $parent_share->remove; # $parent_share->clean_up_all;
the script will leave behind some shmem segments that cannot be removed, even by root. Only killing the X server seems to remove it. So it seems like a zombie situation of sorts. If the running script dosn't do the cleanup, junk gets left behind. There are alot of post on google on removing shared mem segments and semaphores, and you may need to resort to using some kind of clean-up script after you run your program. See man ipcs, and man ipcrm
#!/usr/bin/perl use strict; use Parallel::ForkManager; use IPC::Shareable; my $glue = $$; my %options = ( create => 1, exclusive => 0, mode => 0644, destroy => 1, ); my %final_parent_hash; my $parent_share = tie %final_parent_hash, 'IPC::Shareable', $glue, { +%options } or die "parent : tie failed\n"; my $fork_manager = new Parallel::ForkManager(5); foreach my $child ( 1 .. 10 ) { my $pid = $fork_manager->start($child) and next; my %options = ( create => 0, exclusive => 0, mode => 0644, destroy => 0, ); my %child_hash; my $child_share = tie %child_hash, 'IPC::Shareable', $glue, { %opt +ions } or die "client: tie failed\n"; for my $id (1 .. 20) { my $key = $child . '-' . $id; $child_share->shlock; $final_parent_hash{$key} = qq{|Kid $child pushed $id}; $child_share->shunlock; } $fork_manager->finish($child); } print "Waiting for Children...\n"; $fork_manager->wait_all_children; my $sleep_ctr = 10; while ($sleep_ctr) { if ((keys %final_parent_hash) == 200) { last; } sleep 1; $sleep_ctr--; } foreach my $child ( 1 .. 10 ) { for my $id (1 .. 20) { my $key = $child . '-' . $id; if (! exists $final_parent_hash{$key} ) { print "Missing data for Kid $child , data $id\n"; } else { print "$key = $final_parent_hash{$key}\n"; } } } $parent_share->remove; $parent_share->clean_up_all;

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

Replies are listed 'Best First'.
Re^2: Semaphores leaks with IPC::Shareable
by losgrandes (Initiate) on Oct 23, 2014 at 08:50 UTC
    Ok, I've resolved the riddle. I've removed Destroy option and it was the same. Tried many solutions, including yours with 2nd tie for children, but nothing worked. Finally, I've changed tied variable from $h to %h, it worked and all semaphores were removed. Looks like it had problem with nested data/references. Thanks for help!

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1104697]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (4)
As of 2022-11-30 04:22 GMT
Find Nodes?
    Voting Booth?