Nicholas Clark wrote:
On Fri, Apr 17, 2009 at 09:24:01AM +0100, Matt Lawrence wrote:

I recently discovered that die() inside a signal handler causes a memory leak. I don't know if that would be a problem for you in this case.

Hmm, that's not good. Have you been able to nail it down sufficiently to make
a bug report?

I saw reference to it on the interweb, so assumed it was known about.

This is the closest thing I have to a proof:

#!/usr/bin/perl

while (1) {
   eval {
       local $SIG{USR1} = sub { die "USER 1!!" };
       kill USR1 => $$;
   };
}
__END__


When that's run in the background you'll see it grows fairly steadily and rapidly.


$ ./sig_test.pl &
[2] 15590
$ ps -Fp 15590
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
1001 15590 6142 99 6125 21432 1 10:50 pts/0 00:00:07 /usr/bin/perl ./
$ ps -Fp 15590
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
1001 15590 6142 99 9260 33964 1 10:50 pts/0 00:00:11 /usr/bin/perl ./


However, I just tried doing the same thing without the localised signal handler:

$SIG{USR1} = sub { die "USER 1!!" };
while (1) { eval { kill USR1 => $$ } }

and that's totally solid. I would assume that it's the handler subroutine not being cleaned up when we jump out of the eval.

I haven't had a chance to test any of this on the latest perl, 5.8.8 is the latest I've tried it with.

Matt

Reply via email to