On Sep 8 01:13, Qian Hong wrote: > Hi Corinna, > > Thanks again for the quick reply. > > On Mon, Sep 7, 2015 at 8:28 PM, Corinna Vinschen wrote: > > The terminate_thread_frees_stack flag is set to false for XP/2003 and to > > true for any newer OS. I guess this is a double-free because Wine's > > TerminateThread already freed the stack and Cygwin got the info it's > > supposedly running under XP/2003, so it tries to workaround the fact > > that TerminateThread on these systems didn't free the stack by themselves. > > > > Wine emulates Windows XP here, I double checked Wine source code and I > can confirm Wine doesn't free the stack: > NtTerminateThread() -> abort_thread() -> terminate_thread() > https://github.com/wine-compholio/wine-patched/blob/8b3a785e97a7e28ff58731b58d19237a59239acc/dlls/ntdll/thread.c#L369 > > Cygwin reports wincap as wincap_xpsp2 which is also correct here. Ok. > > we need to know what address ret=61005767 is refering to. addr2line would help. > > As you point out, ret=61005767 is the call to VirtualFree() inside > cygthread::terminate_thread () > https://sourceware.org/git/?p=newlib-cygwin.git;a=blob;f=winsup/cygwin/cygthread.cc;h=e48a73e545e7ca90884fc891f1b188e0ab3bf863;hb=HEAD#l324 > > After combine the information we have so far, I think the problem is > clear now. It's not Cygwin's fault, it's Wine's fault. Wine's > WaitForSingleObject() needs to wait long enough after the > TerminateThread() call, so the target thread has enough time to finish > the system cleanup and return correct exit_code before Cygwin call > VirtualFree to free the stack. But in our current implementation > Wine's WaitForSingleObject returns too early, it shouldn't return > before the system thread cleanup done, as a result there is a race > here. We are thinking of a solution in Wine. Thanks again for the > great help! No worries. I'm glad if we can help each other. Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Maintainer cygwin AT cygwin DOT com Red Hat