ole32: Do not wait for a thread (eterbug #41).
authorAlexander Morozov <amorozov@etersoft.ru>
Wed, 28 Oct 2009 16:07:39 +0000 (19:07 +0300)
committerAlexander Morozov <amorozov@etersoft.ru>
Fri, 24 Sep 2010 16:39:43 +0000 (20:39 +0400)
dlls/ole32/rpc.c

index 75b6b1f7ab3a24b140966b68f04830e3071aa3d0..6d122015ad0d5f585eb649e016e0e35b5db536b3 100644 (file)
@@ -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;
 }