http://bugs.winehq.org/show_bug.cgi?id=20380
--- Comment #78 from Michael Builov mbuilov@gmail.com 2010-02-14 21:21:04 --- Created an attachment (id=26252) --> (http://bugs.winehq.org/attachment.cgi?id=26252) program to test signal handling
(In reply to comment #77) Ok, may be this is bug in linux kernel (at least in 2.6.32.6 x86_64)
Please try my test program. It emulates Homm3 behavior under wine: main thread (drawer) segfaults, other thread (timer) interrupts drawer. So main thread handles two signals: SIGSEGV and SIGUSR1. The test shows that sometimes we get "nested exception" - when SIGSEGV generated in SIGUSR1-handler (uc->uc_mcontext.gregs[REG_EIP] == &sigusr1_handler). But this can't be true because sigusr1_handler() does nothing (except "push %ebp" :)
I think in wine we have the same situation, setup_exception_record() in wine-1.1.38/dlls/ntdll:signal_i386.c detects this and kills Homm3.
to compile program "sig_test" type: gcc -m32 -g -o sig_test -lpthread sig_test2.c