\r
WINE_DEFAULT_DEBUG_CHANNEL(ole);\r
\r
-LONG_PTR /* CLIENT_CALL_RETURN */ RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, va_list args)\r
+/***********************************************************************\r
+ * Note: this should return a CLIENT_CALL_RETURN, but calling convention for\r
+ * returning structures/unions is different between Windows and gcc on i386.\r
+ */\r
+LONG_PTR RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, va_list args)\r
{\r
\r
RPC_CLIENT_INTERFACE *rpc_cli_if = (RPC_CLIENT_INTERFACE *)(pStubDesc->RpcInterfaceInformation);\r
\r
/***********************************************************************\r
* NdrClientCall2 [RPCRT4.@]\r
+ *\r
+ * Note: this should return a CLIENT_CALL_RETURN, but calling convention for\r
+ * returning structures/unions is different between Windows and gcc on i386.\r
*/\r
-LONG_PTR /* CLIENT_CALL_RETURN */ WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc,\r
+LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc,\r
PFORMAT_STRING pFormat, ...)\r
{\r
LONG_PTR ret;\r
static HANDLE mgr_mutex;\r
/* set when server thread has finished opening connections */\r
static HANDLE server_ready_event;\r
-/* thread that waits for connections */\r
-static HANDLE server_thread;\r
\r
static CRITICAL_SECTION spacket_cs;\r
static CRITICAL_SECTION_DEBUG spacket_cs_debug =\r
ReleaseMutex(mgr_mutex);\r
}\r
\r
-static void RPCRT4_start_listen(BOOL auto_listen)\r
+static RPC_STATUS RPCRT4_start_listen(BOOL auto_listen)\r
{\r
+ RPC_STATUS status = RPC_S_ALREADY_LISTENING;\r
+\r
TRACE("\n");\r
\r
EnterCriticalSection(&listen_cs);\r
if (auto_listen || (manual_listen_count++ == 0))\r
{\r
+ status = RPC_S_OK;\r
if (++listen_count == 1) {\r
+ HANDLE server_thread;\r
/* first listener creates server thread */\r
if (!mgr_mutex) mgr_mutex = CreateMutexW(NULL, FALSE, NULL);\r
if (!mgr_event) mgr_event = CreateEventW(NULL, FALSE, FALSE, NULL);\r
if (!worker_tls) worker_tls = TlsAlloc();\r
std_listen = TRUE;\r
server_thread = CreateThread(NULL, 0, RPCRT4_server_thread, NULL, 0, NULL);\r
- } else {\r
- LeaveCriticalSection(&listen_cs);\r
- RPCRT4_sync_with_server_thread();\r
- return;\r
+ CloseHandle(server_thread);\r
}\r
}\r
LeaveCriticalSection(&listen_cs);\r
+\r
+ return status;\r
}\r
\r
static void RPCRT4_stop_listen(BOOL auto_listen)\r
*/\r
RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait )\r
{\r
+ RPC_STATUS status;\r
+\r
TRACE("(%u,%u,%u)\n", MinimumCallThreads, MaxCalls, DontWait);\r
\r
if (!protseqs)\r
return RPC_S_NO_PROTSEQS_REGISTERED;\r
\r
- EnterCriticalSection(&listen_cs);\r
-\r
- if (std_listen) {\r
- LeaveCriticalSection(&listen_cs);\r
- return RPC_S_ALREADY_LISTENING;\r
- }\r
-\r
- RPCRT4_start_listen(FALSE);\r
-\r
- LeaveCriticalSection(&listen_cs);\r
+ status = RPCRT4_start_listen(FALSE);\r
\r
- if (DontWait) return RPC_S_OK;\r
+ if (DontWait || (status != RPC_S_OK)) return status;\r
\r
return RpcMgmtWaitServerListen();\r
}\r
*/\r
RPC_STATUS WINAPI RpcMgmtWaitServerListen( void )\r
{\r
- RPC_STATUS rslt = RPC_S_OK;\r
-\r
- TRACE("\n");\r
+ TRACE("()\n");\r
\r
EnterCriticalSection(&listen_cs);\r
\r
- if (!std_listen)\r
- if ( (rslt = RpcServerListen(1, 0, TRUE)) != RPC_S_OK ) {\r
- LeaveCriticalSection(&listen_cs);\r
- return rslt;\r
- }\r
+ if (!std_listen) {\r
+ LeaveCriticalSection(&listen_cs);\r
+ return RPC_S_NOT_LISTENING;\r
+ }\r
\r
LeaveCriticalSection(&listen_cs);\r
\r
- while (std_listen) {\r
- WaitForSingleObject(mgr_event, INFINITE);\r
- if (!std_listen) {\r
- Sleep(100); /* don't spin violently */\r
- TRACE("spinning.\n");\r
- }\r
- }\r
+ RPCRT4_sync_with_server_thread();\r
\r
- return rslt;\r
+ return RPC_S_OK;\r
}\r
\r
/***********************************************************************\r
return TRUE;\r
}\r
\r
-/* DceErrorInqText\r
+#define MAX_RPC_ERROR_TEXT 256\r
+\r
+/******************************************************************************\r
+ * DceErrorInqTextW (rpcrt4.@)\r
*\r
* Notes\r
* 1. On passing a NULL pointer the code does bomb out.\r
* 4. The MSDN documentation currently declares that the second argument is\r
* unsigned char *, even for the W version. I don't believe it.\r
*/\r
-\r
-#define MAX_RPC_ERROR_TEXT 256\r
-\r
RPC_STATUS RPC_ENTRY DceErrorInqTextW (RPC_STATUS e, unsigned short *buffer)\r
{\r
DWORD count;\r
return RPC_S_OK;\r
}\r
\r
+/******************************************************************************\r
+ * DceErrorInqTextA (rpcrt4.@)\r
+ */\r
RPC_STATUS RPC_ENTRY DceErrorInqTextA (RPC_STATUS e, unsigned char *buffer)\r
{\r
RPC_STATUS status;\r