I've started running some large Test::More programs (perl 5.8.4) under Windows and noticed that each ok() appears to consume 14 Windows semaphore handles. The test program below demonstrates.
use strict; use Test::More; my $niter = shift or die "usage: $0 number-of-iterations\n"; plan tests => $niter; ok(1) for 1 .. $niter; print "Look at handle count in Windows Task Manager\n"; print "Then press [RETURN] to exit...\n";<STDIN>;
For example, when I run this program for 10,000 iterations, Windows Task Manager reports there are 140,021 handles being used by the perl process. The sysinternals nthandle utility reports they are mainly semaphore handles.
I suspect the underlying reason for all these semaphore handles is the use of share() in Test::Builder. For example:
# Test to simulate semaphore growth in Test::Builder. # Grows by 4 semaphore handles per iteration. use strict; use threads; use threads::shared; my @Test_Results = (); share(@Test_Results); sub ok { my $result = {}; share($result); push(@Test_Results, $result); } my $niter = shift or die "usage: $0 number-of-iterations\n"; ok(1) for 1 .. $niter; print "Look at handle count in Windows Task Manager\n"; print "Then press [RETURN] to exit...\n";<STDIN>;
This is not a handle leak in that the handles are released when the variable goes out of scope.
I'm wondering if anyone has seen this issue before or can shed some more light on it. Since you should generally try to keep each test program quite small, it's unlikely to prove a practical limitation. However, it may prevent you from writing very large stress tests due to handle starvation.
In reply to Test::More and semaphore handles on Windows by eyepopslikeamosquito
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |