From 11deccdfb0749e274d81dc3118a38e6dbe267a82 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Wed, 28 Oct 2009 19:07:39 +0300 Subject: [PATCH] ole32: Do not wait for a thread (eterbug #41). --- dlls/ole32/rpc.c | 47 +++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/dlls/ole32/rpc.c b/dlls/ole32/rpc.c index 75b6b1f7ab..6d122015ad 100644 --- a/dlls/ole32/rpc.c +++ b/dlls/ole32/rpc.c @@ -1860,7 +1860,7 @@ struct local_server_params { CLSID clsid; IStream *stream; - HANDLE ready_event; + HANDLE pipe; HANDLE stop_event; HANDLE thread; BOOL multi_use; @@ -1870,7 +1870,7 @@ struct local_server_params static DWORD WINAPI local_server_thread(LPVOID param) { struct local_server_params * lsp = param; - HANDLE hPipe; + HANDLE hPipe = lsp->pipe; WCHAR pipefn[100]; HRESULT hres; IStream *pStm = lsp->stream; @@ -1888,19 +1888,6 @@ static DWORD WINAPI local_server_thread(LPVOID param) TRACE("Starting threader for %s.\n",debugstr_guid(&lsp->clsid)); memset(&ovl, 0, sizeof(ovl)); - get_localserver_pipe_name(pipefn, &lsp->clsid); - - hPipe = CreateNamedPipeW( pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, - PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, - 4096, 4096, 500 /* 0.5 second timeout */, NULL ); - - SetEvent(lsp->ready_event); - - if (hPipe == INVALID_HANDLE_VALUE) - { - FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), GetLastError()); - return 1; - } ovl.hEvent = pipe_event = CreateEventW(NULL, FALSE, FALSE, NULL); @@ -1962,6 +1949,7 @@ static DWORD WINAPI local_server_thread(LPVOID param) if (!multi_use) { + get_localserver_pipe_name(pipefn, &lsp->clsid); TRACE("single use object, shutting down pipe %s\n", debugstr_w(pipefn)); break; } @@ -1974,8 +1962,9 @@ static DWORD WINAPI local_server_thread(LPVOID param) /* starts listening for a local server */ HRESULT RPC_StartLocalServer(REFCLSID clsid, IStream *stream, BOOL multi_use, void **registration) { - DWORD tid; + DWORD tid, err; struct local_server_params *lsp; + WCHAR pipefn[100]; lsp = HeapAlloc(GetProcessHeap(), 0, sizeof(*lsp)); if (!lsp) @@ -1984,34 +1973,36 @@ HRESULT RPC_StartLocalServer(REFCLSID clsid, IStream *stream, BOOL multi_use, vo lsp->clsid = *clsid; lsp->stream = stream; IStream_AddRef(stream); - lsp->ready_event = CreateEventW(NULL, FALSE, FALSE, NULL); - if (!lsp->ready_event) - { - HeapFree(GetProcessHeap(), 0, lsp); - return HRESULT_FROM_WIN32(GetLastError()); - } lsp->stop_event = CreateEventW(NULL, FALSE, FALSE, NULL); if (!lsp->stop_event) { - CloseHandle(lsp->ready_event); HeapFree(GetProcessHeap(), 0, lsp); return HRESULT_FROM_WIN32(GetLastError()); } lsp->multi_use = multi_use; + get_localserver_pipe_name(pipefn, clsid); + lsp->pipe = CreateNamedPipeW(pipefn, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, + PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, + 4096, 4096, 500 /* 0.5 second timeout */, NULL); + if (lsp->pipe == INVALID_HANDLE_VALUE) + { + err = GetLastError(); + FIXME("pipe creation failed for %s, le is %u\n", debugstr_w(pipefn), err); + CloseHandle(lsp->stop_event); + HeapFree(GetProcessHeap(), 0, lsp); + return HRESULT_FROM_WIN32(err); + } + lsp->thread = CreateThread(NULL, 0, local_server_thread, lsp, 0, &tid); if (!lsp->thread) { - CloseHandle(lsp->ready_event); + CloseHandle(lsp->pipe); CloseHandle(lsp->stop_event); HeapFree(GetProcessHeap(), 0, lsp); return HRESULT_FROM_WIN32(GetLastError()); } - WaitForSingleObject(lsp->ready_event, INFINITE); - CloseHandle(lsp->ready_event); - lsp->ready_event = NULL; - *registration = lsp; return S_OK; } -- 2.33.8