Module: wine Branch: master Commit: fead72e8a7a1928c8195815d7ec9b33794f28115 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=fead72e8a7a1928c8195815d...
Author: Huw Davies huw@codeweavers.com Date: Wed Sep 27 16:23:42 2006 +0100
ole32: Don't return from CoRegisterClassObject until we have created the named pipe.
Also don't fail if the client connects to the pipe between CreateNamedPipe and ConnectNamedPipe.
---
dlls/ole32/rpc.c | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c index e7266dc..7646e1d 100644 --- a/dlls/ole32/rpc.c +++ b/dlls/ole32/rpc.c @@ -924,6 +924,7 @@ struct local_server_params { CLSID clsid; IStream *stream; + HANDLE ready_event; };
/* FIXME: should call to rpcss instead */ @@ -945,12 +946,14 @@ static DWORD WINAPI local_server_thread(
get_localserver_pipe_name(pipefn, &lsp->clsid);
- HeapFree(GetProcessHeap(), 0, lsp); - hPipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 4096, 4096, 500 /* 0.5 second timeout */, NULL ); - + + SetEvent(lsp->ready_event); + + HeapFree(GetProcessHeap(), 0, lsp); + if (hPipe == INVALID_HANDLE_VALUE) { FIXME("pipe creation failed for %s, le is %ld\n", debugstr_w(pipefn), GetLastError()); @@ -958,7 +961,7 @@ static DWORD WINAPI local_server_thread( }
while (1) { - if (!ConnectNamedPipe(hPipe,NULL)) { + if (!ConnectNamedPipe(hPipe,NULL) && GetLastError() != ERROR_PIPE_CONNECTED) { ERR("Failure during ConnectNamedPipe %ld, ABORT!\n",GetLastError()); break; } @@ -1002,14 +1005,18 @@ static DWORD WINAPI local_server_thread( void RPC_StartLocalServer(REFCLSID clsid, IStream *stream) { DWORD tid; - HANDLE thread; + HANDLE thread, ready_event; struct local_server_params *lsp = HeapAlloc(GetProcessHeap(), 0, sizeof(*lsp));
lsp->clsid = *clsid; lsp->stream = stream; IStream_AddRef(stream); + lsp->ready_event = ready_event = CreateEventW(NULL, FALSE, FALSE, NULL);
thread = CreateThread(NULL, 0, local_server_thread, lsp, 0, &tid); CloseHandle(thread); /* FIXME: failure handling */ + + WaitForSingleObject(ready_event, INFINITE); + CloseHandle(ready_event); }