Huw Davies : ole32: Don'
t return from CoRegisterClassObject until we have created the named
pipe.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Sep 28 05:26:50 CDT 2006
Module: wine
Branch: master
Commit: fead72e8a7a1928c8195815d7ec9b33794f28115
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=fead72e8a7a1928c8195815d7ec9b33794f28115
Author: Huw Davies <huw at 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);
}
More information about the wine-cvs
mailing list