in reply to cleanly exiting threads

As I understand things, open2 forks (duplicating all the threads) and calls _exit if there's an error calling exec (causing threads to be exited prematurely in the child). I think your problem is related to that.

And isn't the work directory a per-process state? If so, there's a race condition in your code.

thread 1: chdir thread 2: chdir thread 2: open thread 1: open OOPS, chdir isn't as expected

And another bug: You use open2 without waitpid, or do you set $SIG{PIPE} to handle that elsewhere?

Replies are listed 'Best First'.
Re^2: cleanly exiting threads
by JoeKamel (Acolyte) on Aug 13, 2008 at 18:20 UTC

    thanks for the pointer on the potential race condition. I haven't seen that as a problem yet, but i can see where it could be.

    I do have a waitpid, just lost it when copying. (i also have a lot of other things i've tried and commented out in that area).

    when open2 does fail, i actually a message stuck into $out (i assume this is because my $cmd has stderr redirected to stdout).

    this is what i am matching with:
    $err = 1 if (/^thread failed/);
    and in that case i exit from the loop and send myself the done message.

    I had suspected that this (the open getting stuck) was the problem which is why i also put in the extra kill just to make sure, but at this point, all of my tests are actually finishing successfully, (i.e. all output coming out, and no spurious tests left on any of the severs).

Re^2: cleanly exiting threads
by JoeKamel (Acolyte) on Aug 14, 2008 at 02:03 UTC
    thank you very much for this. the race condition was causing an infrequent, but mysterious tests refuse to start condition.