mirror of
https://github.com/reactos/reactos.git
synced 2024-12-30 19:14:31 +00:00
Sync to Wine-20050524:
Alexandre Julliard <julliard@winehq.org> - Added rules for building import libraries in the individual dll makefiles, and added support for building a .def.a static import library too. Vincent Beron <vberon@mecano.gme.usherb.ca> - Provide minimal API documentation in advapi/eventlog.c to silence some winapi_check output. - Move around functions in riched20, richedit and rpcrt4 to achieve the same goal. Robert Shearman <rob@codeweavers.com> - Fix RpcServerListen so that it doesn't return RPC_S_ALREADY_LISTENING when the only interfaces it is listening on are auto listens. - Only synchronize with server thread when necessary and move this into RpcMgmtWaitServerListen. Francois Gouget <fgouget@free.fr> - Tweak the API documentation to silence winapi_check warnings. Hartmut Birr <hartmut.birr@gmx.de> - Clean up if named pipe is not available. (merge back from WineHQ) svn path=/trunk/; revision=15581
This commit is contained in:
parent
98b2118f6b
commit
020f1fc22b
5 changed files with 36 additions and 41 deletions
|
@ -4,6 +4,7 @@ TOPOBJDIR = ../..
|
|||
SRCDIR = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
MODULE = rpcrt4.dll
|
||||
IMPORTLIB = librpcrt4.$(IMPLIBEXT)
|
||||
IMPORTS = iphlpapi advapi32 kernel32 ntdll
|
||||
EXTRALIBS = -luuid
|
||||
|
||||
|
|
|
@ -41,7 +41,11 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||
|
||||
LONG_PTR /* CLIENT_CALL_RETURN */ RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, va_list args)
|
||||
/***********************************************************************
|
||||
* Note: this should return a CLIENT_CALL_RETURN, but calling convention for
|
||||
* returning structures/unions is different between Windows and gcc on i386.
|
||||
*/
|
||||
LONG_PTR RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDesc, PFORMAT_STRING pFormat, va_list args)
|
||||
{
|
||||
|
||||
RPC_CLIENT_INTERFACE *rpc_cli_if = (RPC_CLIENT_INTERFACE *)(pStubDesc->RpcInterfaceInformation);
|
||||
|
@ -83,8 +87,11 @@ LONG_PTR /* CLIENT_CALL_RETURN */ RPCRT4_NdrClientCall2(PMIDL_STUB_DESC pStubDes
|
|||
|
||||
/***********************************************************************
|
||||
* NdrClientCall2 [RPCRT4.@]
|
||||
*
|
||||
* Note: this should return a CLIENT_CALL_RETURN, but calling convention for
|
||||
* returning structures/unions is different between Windows and gcc on i386.
|
||||
*/
|
||||
LONG_PTR /* CLIENT_CALL_RETURN */ WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc,
|
||||
LONG_PTR WINAPIV NdrClientCall2(PMIDL_STUB_DESC pStubDesc,
|
||||
PFORMAT_STRING pFormat, ...)
|
||||
{
|
||||
LONG_PTR ret;
|
||||
|
|
|
@ -103,8 +103,6 @@ static HANDLE mgr_event;
|
|||
static HANDLE mgr_mutex;
|
||||
/* set when server thread has finished opening connections */
|
||||
static HANDLE server_ready_event;
|
||||
/* thread that waits for connections */
|
||||
static HANDLE server_thread;
|
||||
|
||||
static CRITICAL_SECTION spacket_cs;
|
||||
static CRITICAL_SECTION_DEBUG spacket_cs_debug =
|
||||
|
@ -587,14 +585,18 @@ static void RPCRT4_sync_with_server_thread(void)
|
|||
ReleaseMutex(mgr_mutex);
|
||||
}
|
||||
|
||||
static void RPCRT4_start_listen(BOOL auto_listen)
|
||||
static RPC_STATUS RPCRT4_start_listen(BOOL auto_listen)
|
||||
{
|
||||
RPC_STATUS status = RPC_S_ALREADY_LISTENING;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
EnterCriticalSection(&listen_cs);
|
||||
if (auto_listen || (manual_listen_count++ == 0))
|
||||
{
|
||||
status = RPC_S_OK;
|
||||
if (++listen_count == 1) {
|
||||
HANDLE server_thread;
|
||||
/* first listener creates server thread */
|
||||
if (!mgr_mutex) mgr_mutex = CreateMutexW(NULL, FALSE, NULL);
|
||||
if (!mgr_event) mgr_event = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||
|
@ -603,13 +605,12 @@ static void RPCRT4_start_listen(BOOL auto_listen)
|
|||
if (!worker_tls) worker_tls = TlsAlloc();
|
||||
std_listen = TRUE;
|
||||
server_thread = CreateThread(NULL, 0, RPCRT4_server_thread, NULL, 0, NULL);
|
||||
} else {
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
RPCRT4_sync_with_server_thread();
|
||||
return;
|
||||
CloseHandle(server_thread);
|
||||
}
|
||||
}
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static void RPCRT4_stop_listen(BOOL auto_listen)
|
||||
|
@ -977,23 +978,16 @@ RPC_STATUS WINAPI RpcServerRegisterAuthInfoW( LPWSTR ServerPrincName, unsigned l
|
|||
*/
|
||||
RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT DontWait )
|
||||
{
|
||||
RPC_STATUS status;
|
||||
|
||||
TRACE("(%u,%u,%u)\n", MinimumCallThreads, MaxCalls, DontWait);
|
||||
|
||||
if (!protseqs)
|
||||
return RPC_S_NO_PROTSEQS_REGISTERED;
|
||||
|
||||
EnterCriticalSection(&listen_cs);
|
||||
status = RPCRT4_start_listen(FALSE);
|
||||
|
||||
if (std_listen) {
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
return RPC_S_ALREADY_LISTENING;
|
||||
}
|
||||
|
||||
RPCRT4_start_listen(FALSE);
|
||||
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
|
||||
if (DontWait) return RPC_S_OK;
|
||||
if (DontWait || (status != RPC_S_OK)) return status;
|
||||
|
||||
return RpcMgmtWaitServerListen();
|
||||
}
|
||||
|
@ -1003,29 +997,20 @@ RPC_STATUS WINAPI RpcServerListen( UINT MinimumCallThreads, UINT MaxCalls, UINT
|
|||
*/
|
||||
RPC_STATUS WINAPI RpcMgmtWaitServerListen( void )
|
||||
{
|
||||
RPC_STATUS rslt = RPC_S_OK;
|
||||
|
||||
TRACE("\n");
|
||||
TRACE("()\n");
|
||||
|
||||
EnterCriticalSection(&listen_cs);
|
||||
|
||||
if (!std_listen)
|
||||
if ( (rslt = RpcServerListen(1, 0, TRUE)) != RPC_S_OK ) {
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
return rslt;
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
|
||||
while (std_listen) {
|
||||
WaitForSingleObject(mgr_event, INFINITE);
|
||||
if (!std_listen) {
|
||||
Sleep(100); /* don't spin violently */
|
||||
TRACE("spinning.\n");
|
||||
}
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
return RPC_S_NOT_LISTENING;
|
||||
}
|
||||
|
||||
return rslt;
|
||||
LeaveCriticalSection(&listen_cs);
|
||||
|
||||
RPCRT4_sync_with_server_thread();
|
||||
|
||||
return RPC_S_OK;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
|
|
@ -767,7 +767,10 @@ BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPC
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* DceErrorInqText
|
||||
#define MAX_RPC_ERROR_TEXT 256
|
||||
|
||||
/******************************************************************************
|
||||
* DceErrorInqTextW (rpcrt4.@)
|
||||
*
|
||||
* Notes
|
||||
* 1. On passing a NULL pointer the code does bomb out.
|
||||
|
@ -778,9 +781,6 @@ BOOL RPCRT4_RPCSSOnDemandCall(PRPCSS_NP_MESSAGE msg, char *vardata_payload, PRPC
|
|||
* 4. The MSDN documentation currently declares that the second argument is
|
||||
* unsigned char *, even for the W version. I don't believe it.
|
||||
*/
|
||||
|
||||
#define MAX_RPC_ERROR_TEXT 256
|
||||
|
||||
RPC_STATUS RPC_ENTRY DceErrorInqTextW (RPC_STATUS e, unsigned short *buffer)
|
||||
{
|
||||
DWORD count;
|
||||
|
@ -801,6 +801,9 @@ RPC_STATUS RPC_ENTRY DceErrorInqTextW (RPC_STATUS e, unsigned short *buffer)
|
|||
return RPC_S_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* DceErrorInqTextA (rpcrt4.@)
|
||||
*/
|
||||
RPC_STATUS RPC_ENTRY DceErrorInqTextA (RPC_STATUS e, unsigned char *buffer)
|
||||
{
|
||||
RPC_STATUS status;
|
||||
|
|
|
@ -84,7 +84,6 @@ HANDLE RPCRT4_RpcssNPConnect(void)
|
|||
if (! WaitNamedPipeA(NAME_RPCSS_NAMED_PIPE, MASTER_MUTEX_WAITNAMEDPIPE_TIMEOUT))
|
||||
{
|
||||
ERR("Named pipe unavailable after waiting. Something is probably wrong.\n");
|
||||
CloseHandle(the_pipe);
|
||||
the_pipe = NULL;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue