Amit Kapila <amit.kapil...@gmail.com> writes: > IIUC, once the dispatch thread has queued the signal > (pg_queue_signal), the next CHECK_FOR_INTERRUPTS by the main thread > will execute the signal. So, if we move pg_queue_signal() before we > do WriteFile in pg_signal_dispatch_thread(), this race condition will > be closed. Now, we might not want to do this as that will add some > more time (even though very less) before notify on the other side can > finish or maybe there is some technical problem with this idea which I > am not able to see immediately.
Hmm. Certainly worth trying to see if it resolves the failure on Andrew's machines. It's not real hard to believe that TransactNamedPipe could be "optimized" so that it preferentially schedules the client thread once the handshake is done, not the server thread (based on some heuristic claim that the former is probably an interactive process and the latter less so). In that situation, we'd proceed on with the signal not really delivered, and there is nothing guaranteeing that it will be delivered anytime soon --- the rest of the test can make progress regardless of whether that thread ever gets scheduled again. So, as long as we've got this handshake mechanism, it seems like it'd be a good thing for the ack to indicate that the signal was *actually* delivered (by setting the recipient's flag bit) and not just that it'll probably get delivered eventually. I remain a bit unsure that we actually need the handshaking business at all --- I doubt that Unix signals provide any guarantee of synchronous delivery on most platforms. (If I'm reading the POSIX spec correctly, it only requires synchronous delivery when a thread signals itself.) But the existence of this unsynchronized thread in the Windows implementation sure seems like a dubious thing, now that you point it out. regards, tom lane