[Bug 20390] chromium ipc_tests.exe hangs sometimes on IPCSyncChannelTest.*

wine-bugs at winehq.org wine-bugs at winehq.org
Wed Oct 28 19:27:05 CDT 2009


http://bugs.winehq.org/show_bug.cgi?id=20390


Dan Kegel <dank at kegel.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|chromium ipc_tests.exe      |chromium ipc_tests.exe
                   |hangs sometimes on          |hangs sometimes on
                   |IPCSyncChannelTest.Multiple |IPCSyncChannelTest.*




--- Comment #3 from Dan Kegel <dank at kegel.com>  2009-10-28 19:27:05 ---
I stared at this today for several hours. 
I'm kind of out of steam for today, here's a brain dump.

Running IPCSyncChannelTest.* will hang fairly reliably.
IPCSyncChannelTest.Simple hangs about half the time,
even if you comment out the second half of IPCSyncChannelTest.Simple.

Test shutdown is supposed to go like this:
  main thread: ~Worker posts call to OnListenerThreadShutdown1, waits
  listener thread: OnListenerThreadShutdown1 posts call to OnIPCThreadShutdown
  ipc thread: OnIPCThreadShutdown posts call to OnListenerThreadShutdown2
  main thread: wake up, finish.

Unfortunately, sometimes the task to call OnIPCThreadShutdown()
never gets run.  You can see the guts of the task queueing in

http://src.chromium.org/viewvc/chrome/trunk/src/base/message_pump_win.cc

The task queuer puts the task in the incoming queue, then calls

void MessagePumpForIO::ScheduleWork() {
  if (InterlockedExchange(&have_work_, 1))
    return;  // Someone else continued the pumping.

  // Make sure the MessagePump does some work for us.
  BOOL ret = PostQueuedCompletionStatus(port_, 0,
                                        reinterpret_cast<ULONG_PTR>(this),
                                        reinterpret_cast<OVERLAPPED*>(this));
  DCHECK(ret);
}

to wake up the consumer, who is sleeping in GetQueuedCompletionStatus().

With winedbg, I can get a good backtrace of the hang (yay pdb support):

  4 WaitForSingleObject+0x3c(handle=0x70, timeout=4294967295)
[wine-git/dlls/ker
nel32/sync.c:129] in kernel32
  5 base::WaitableEvent::Wait+0x3c() [src\base\waitable_event_win.cc:62] in
ipc_
tests
  6 `anonymous namespace'::Worker::~Worker+0xb0()
[src\ipc\ipc_sync_channel_unit
test.cc:79] in ipc_tests
  7 `anonymous namespace'::SimpleClient::~SimpleClient+0x16() in ipc_tests
  8 `anonymous namespace'::SimpleClient::`scalar deleting destructor'+0x16() in
ipc_tests
  9 STLDeleteContainerPointers<std::_Vector_iterator<`anonymous
namespace'::Work
er *,std::allocator<`anonymous namespace'::Worker *> > >+0x74(begin={}, end={})
[src\base\stl_util-inl.h:67] in ipc_tests
  10 `anonymous namespace'::RunTest+0x11c(workers={_Myfirst=0x9bbc70,
_Mylast=0x
9bbc78, _Myend=0x9bbc78}) [src\ipc\ipc_sync_channel_unittest.cc:248] in
ipc_test
s
  11 `anonymous namespace'::Simple+0xae(pump_during_send=false)
[src\ipc\ipc_syn
c_channel_unittest.cc:289] in ipc_tests
  12 IPCSyncChannelTest_Simple_Test::TestBody+0x15()
[src\ipc\ipc_sync_channel_u
nittest.cc:297] in ipc_tests

(though I don't *quite* trust the line numbers).

A +relay trace of the problem looks kind of like this (with a few extra
prints):
...
001f:Ret  KERNEL32.CreateEventW() retval=00000070 ret=00472b92
001f:Call KERNEL32.OutputDebugStringA("in ~Worker, created listener_done event
handle 0x70")
001f:Call KERNEL32.OutputDebugStringA("in ~Worker, created ipc_done event
handle 0x74")
0023:Call KERNEL32.OutputDebugStringA("in OnListenerThreadShutdown1, ipc_event
handle 0x74")
0023:Call KERNEL32.InterlockedExchange(009be830,00000001) ret=004bd24d
0023:Ret  KERNEL32.InterlockedExchange() retval=00000000 ret=004bd24d
0023:Call
KERNEL32.PostQueuedCompletionStatus(000000c0,00000000,009be800,009be80
0) ret=004bd27b
0023:Ret  KERNEL32.PostQueuedCompletionStatus() retval=00000001 ret=004bd27b
0044:Ret  KERNEL32.GetQueuedCompletionStatus() retval=00000001 ret=004bd899
0044:Call KERNEL32.InterlockedExchange(009be830,00000000) ret=004bda05
0044:Ret  KERNEL32.InterlockedExchange() retval=00000001 ret=004bda05
0044:Call
KERNEL32.GetQueuedCompletionStatus(000000c0,010be408,010be340,010be334
,ffffffff) ret=004bd899
001f:Call KERNEL32.OutputDebugStringA(009c0078 "in ~Worker, ipc_thread handle
0xBC id 68")
001f:Call KERNEL32.OutputDebugStringA(009bbed0 "in ~Worker, about to wait on
listener_done")
001f:Call KERNEL32.WaitForSingleObject(00000070,ffffffff) ret=00472ffc

It's a little hard to trace, since both the server and client side
of the test are running in the same process.  I tried adding print statements
in message_pump_win.cc and rebuilding the test; that worked to some
extent, but if I got too aggressive with prints, the hang would go away.

-- 
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.



More information about the wine-bugs mailing list