This turned out to be that annoying bug that haunted my DCOM work for so long... Anyway, now that we've finally gotten it to work, I plan to submit my DCOM work to Wine piecewise over the next days or weeks, but how long it'll take will probably depend on how much effort I should spend on cleaning up some of the improperly implemented things and try to reimplement them properly, or just submit all the hacks I used as they are without fixing them up, and also how much attention I should give to conflicts with Marcus's stuff. I wonder what you guys feel about that? Log: Ove Kaaven <ovek@transgaming.com> Fixed a race condition on RPC worker thread creation, and a typo. Index: dlls/rpcrt4/rpc_server.c =================================================================== RCS file: /cvsroot/rewind/rewind/dlls/rpcrt4/rpc_server.c,v retrieving revision 1.12 diff -u -r1.12 rpc_server.c --- dlls/rpcrt4/rpc_server.c 18 Apr 2003 02:04:17 -0000 1.12 +++ dlls/rpcrt4/rpc_server.c 18 Apr 2003 02:16:51 -0000 @@ -285,11 +286,18 @@ static void RPCRT4_new_client(RpcConnection* conn) { - conn->thread = CreateThread(NULL, 0, RPCRT4_io_thread, conn, 0, NULL); - if (!conn->thread) { + HANDLE thread = CreateThread(NULL, 0, RPCRT4_io_thread, conn, 0, NULL); + if (!thread) { DWORD err = GetLastError(); ERR("failed to create thread, error=%08lx\n", err); + RPCRT4_DestroyConnection(conn); } + /* we could set conn->thread, but then we'd have to make the io_thread wait + * for that, otherwise the thread might finish, destroy the connection, and + * free the memory we'd write to before we did, causing crashes and stuff - + * so let's implement that later, when we really need conn->thread */ + + CloseHandle( thread ); } static DWORD CALLBACK RPCRT4_server_thread(LPVOID the_arg) @@ -315,7 +323,7 @@ } cps = cps->Next; } - /* make array of connings */ + /* make array of connections */ objs = HeapReAlloc(GetProcessHeap(), 0, objs, count*sizeof(HANDLE)); objs[0] = m_event; count = 1;