0393a1602f
Believe or not, `CreateProcess()` is racy if several threads create child processes: [0], [1], [2]. This caused some tests show crash dialogs during `make check-stage#-rpass`. More explanation: On Windows, `SetErrorMode()` controls display of error dialogs: it accepts new error mode and returns old error mode. The error mode is process-global and automatically inherited to child process when created. MSYS2 bash shell internally sets it to not show error dialogs, therefore `make check-stage#-rpass` should not show them either. However, [1] says that `CreateProcess()` internally invokes `SetErrorMode()` twice: at first it sets mode `0x8001` and saves original mode, and at second it restores original mode. So if two threads simultaneously call `CreateProcess()`, the first thread sets error mode to `0x8001` then the second thread recognizes that current error mode is `0x8001`. Therefore, The second thread will create process with wrong error mode. This really occurs inside `compiletest`: it creates several processes on each thread, so some `run-pass` tests are invoked with wrong error mode therefore show crash dialog. This commit adds `StaticMutex` for `CreateProcess()` call. This seems to fix the "dialog annoyance" issue. [0]: http://support.microsoft.com/kb/315939 [1]: https://code.google.com/p/nativeclient/issues/detail?id=2968 [2]: https://ghc.haskell.org/trac/ghc/ticket/2650 |
||
---|---|---|
.. | ||
collections | ||
ffi | ||
io | ||
num | ||
path | ||
prelude | ||
rand | ||
rt | ||
sync | ||
sys | ||
thread_local | ||
time | ||
ascii.rs | ||
bitflags.rs | ||
bool.rs | ||
dynamic_lib.rs | ||
error.rs | ||
failure.rs | ||
fmt.rs | ||
hash.rs | ||
lib.rs | ||
macros.rs | ||
os.rs | ||
rtdeps.rs | ||
thread.rs | ||
thunk.rs | ||
tuple.rs | ||
unit.rs |