On Sat, 15 Nov 2003 16:41:44 -0800, you wrote:
Rein Klazes rklazes@xs4all.nl writes:
I looked at many of these sequences. In all of them the subthread finished well before the main thread executed its Wait. I was looking for timing differences between the processing of the two threads, checking whether and when the WM_NULL message gets processed. Nothing seems to stand out.
Any suggestions how to debug this?
It's a bug in Agent, it is waiting on a handle that it has already closed. It works in most cases because the handle is simply invalid, but from time to time the handle has already been reused and the wait blocks.
Bugs in Agent are quite possible of course. I will send the makers bug reports but I start looking at these problems assuming at first they are Wine problems.
The maker seem to think that the handle must be closed both by sub-thread and main thread before it is removed. That is how I read the traces as well. So that is not true?
I guess if it never happens under Windows then it's probably because there's somewhere that we allocate a handle that Windows doesn't. You should look where the 0xcc handle got reallocated the last time.
It must be here :
| 0023:Call ntdll.RtlAllocateHeap(40340000,00000000,00000080) ret=4076cd9c | 0009:Call ntdll.RtlFreeHeap(40340000,00000000,403f0ca0) ret=40772536 | 0009: create_semaphore( initial=00000000, max=00000001, inherit=0, name=L"" ) | 0009: create_semaphore() = 0 { handle=0xcc } | trace:ntdll:NTDLL_wait_for_multiple_objects count 1 timeout 0x406cf928 | 0009: select( flags=12, cookie=0x406cf82c, timeout=1068729674.153190 (+4.999948), handles={0xcc} ) | 0009: select() = PENDING | 0023: release_semaphore( handle=0xcc, count=00000001 ) | 0009: *wakeup* signaled=0 cookie=0x406cf82c | 0023: release_semaphore() = 0 { prev_count=00000000 } | 0023:Ret ntdll.RtlAllocateHeap() retval=40400e78 ret=4076cd9c | 0023: get_window_children( parent=0x1002c, atom=0000, tid=0000 ) | 0023: get_window_children() = 0 { count=0, children={} } | 0023:Call ntdll.RtlFreeHeap(40340000,00000000,40400e78) ret=4076ce3b | trace:ntdll:NTDLL_wait_for_multiple_objects count 1 timeout 0x422ff0d0 | 0023: select( flags=12, cookie=0x422fefd4, timeout=1068729674.153927 (+4.999945), handles={0xcc} ) | 0023: select() = PENDING | 0009: release_semaphore( handle=0xcc, count=00000001 ) | 0023: *wakeup* signaled=0 cookie=0x422fefd4 | 0009: release_semaphore() = 0 { prev_count=00000000 } | 0009:Ret ntdll.RtlFreeHeap() retval=00000001 ret=40772536 [snip] | 0023:Ret ntdll.RtlFreeHeap() retval=00000001 ret=4076ce3b
Rein.