When running /t/harness on Windows, no matter how many test jobs I select in the env var, never more than 2 of the left most % progress things change, the others % things never get updated and remain as "0/?" always. Also my CPU on my 8 core never goes above 10%. I think this has to do with TAP::Parser::Multiplexer. Usually the harness perl process has 1 child process open in Process Explorer, but sometimes when there is rapid process turn (where the .t took less than 1 sec to run) it might be parallel.

I've tried stepping through _aggregate_parallel in TAP::Harness and TAP::Parser::Multiplexer and Multiplexer uses select() somehow on *nix but I dont understand how to implement a Windows specific fix to allow parallel testing to work, or the overall OOP heavy API design of TAP. I'd like to try to get parallel testing working on Windows, but I need help understanding how TAP the module's API works.

I did some hacking in Multiplexer with
____________________________________________________
=head2 Instance Methods

=head3 C<add>

 $mux->add( $parser, $stash );

Add a TAP::Parser to the multiplexer. C<$stash> is an optional opaque
reference that will be returned from C<next> along with the parser and
the next result.

=cut

sub add {
   my ( $self, $parser, $stash ) = @_;

   my @handles = $parser->get_select_handles;
       use Devel::Peek;
       Dump($handles[0]);
       use Win32API::File;
       use Win32::API;
Win32::API::More->Import('kernel32.dll', 'BOOL WINAPI GetNamedPipeInfo(HANDLE hNamedPipe,
LPDWORD lpFlags,
LPDWORD lpOutBufferSize,
LPDWORD lpInBufferSize,
LPDWORD lpMaxInstances
)');
       my %h;
(        $h{Flags},
       $h{OutBufferSize},
       $h{InBufferSize},
       $h{MaxInstances}) = (0,0,0,0);
       $h{ret} = GetNamedPipeInfo(Win32API::File::GetOsFHandle($handles[0])
       $h{Flags},
       $h{OutBufferSize},
       $h{InBufferSize},
       $h{MaxInstances}
                                  );
       use Data::Dumper;
       print Dumper(\%h);
print Win32API::File::GetFileType(Win32API::File::GetOsFHandle($handles[0]));
______________________________________________________

and $handles[0] was a Win32 Named Pipe, so in theory a non-blocking or asynchronous (read() returns control back to you immediately, but keeps the memory buffer around until the read transaction is done, you find out another way when the transaction is done with the buffer) or polling ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa365779%28v=vs.85%29.aspx ) IO is available.

Another idea is to open() multiple child perl test procs, and <> the oldest child perl test proc in TAP::Parser::Iterator::Process in FILO. With this idea it will sometimes and erratically be parallel, but it is better than 100% serial.

3 related commits to the problem, https://github.com/Perl-Toolchain-Gang/Test-Harness/commit/6d27f808824c3592e7089e7438f1ca18c860d307 https://github.com/Perl-Toolchain-Gang/Test-Harness/commit/0da860a22df5ca50b9702a70d81fd960604755bd https://github.com/Perl-Toolchain-Gang/Test-Harness/commit/ccffd0283e1820165ec307ffbbc4d3ee16fca6b3 by AndyA

Reply via email to