in reply to Re^2: Resizing IPC::Msg queue size
in thread Resizing IPC::Msg queue size
Looking at the code near the line on which the error was reported, we find this set method in 5.6.1:
# IPC/Msg.pm lines 61-79 sub set { my $self = shift; my $ds; if(@_ == 1) { $ds = shift; } else { croak 'Bad arg count' if @_ % 2; my %arg = @_; my $ds = $self->stat or return undef; my($key,$val); $ds->$key($val) while(($key,$val) = each %arg); } msgctl($$self,IPC_SET,$ds->pack); }
There is a bug in this code: on line 11 (which is line 71 of the original file), my $ds creates a new $ds variable which goes out of scope at the end of the else block. That is why the final line has an undefined value for $ds when it tries to invoke $ds->pack.
Removing the redundant "my" will fix that problem by ensuring that (as intended) the outer $ds variable is the one used, and indeed in later perls you'll find that exactly this change has been made: replacing
withmy $ds = $self->stat
at line 71.$ds = $self->stat
If you don't have permission to make this fix to the code directly, and you can't convince the system administrator to apply the fix for you, there are a couple of ways you can get around it. One way is subclassing to replace the buggy routine:
{ package IPC::Msg::Bugfix; our @ISA = qw/ IPC::Msg /; sub set { # corrected version of set here ... } } # in your code my $msg = new IPC::Msg::Bugfix('24h', IPC_CREAT); # and continue as before
An alternative is to recode to avoid the path with the bug in it:
# avoiding buggy multiple-arg set() # $msg->set('qbytes' => 32768); my $ds = $msg->stat or die "stat: $!"; $ds->qbytes(32768); $msg->set($ds);
(Please note, I haven't tested any of this code.)
Hugo
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Resizing IPC::Msg queue size
by Jeppe (Monk) on Jul 08, 2004 at 13:15 UTC |