Jacek Caban : rpcrt4: Reset assoc_group_id on associations with no active connection.
Module: wine Branch: master Commit: 3b4f3ff397c7a50deec0d94c58654bc576254478 URL: https://source.winehq.org/git/wine.git/?a=commit;h=3b4f3ff397c7a50deec0d94c5... Author: Jacek Caban <jacek(a)codeweavers.com> Date: Tue Oct 16 14:38:35 2018 +0200 rpcrt4: Reset assoc_group_id on associations with no active connection. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/rpcrt4/rpc_assoc.c | 11 +++++++++++ dlls/rpcrt4/rpc_assoc.h | 2 ++ dlls/rpcrt4/rpc_transport.c | 1 + 3 files changed, 14 insertions(+) diff --git a/dlls/rpcrt4/rpc_assoc.c b/dlls/rpcrt4/rpc_assoc.c index 339ac12..8a823f4 100644 --- a/dlls/rpcrt4/rpc_assoc.c +++ b/dlls/rpcrt4/rpc_assoc.c @@ -80,6 +80,7 @@ static RPC_STATUS RpcAssoc_Alloc(LPCSTR Protseq, LPCSTR NetworkAddr, assoc->Endpoint = RPCRT4_strdupA(Endpoint); assoc->NetworkOptions = NetworkOptions ? RPCRT4_strdupW(NetworkOptions) : NULL; assoc->assoc_group_id = 0; + assoc->connection_cnt = 0; UuidCreate(&assoc->http_uuid); list_init(&assoc->entry); *assoc_out = assoc; @@ -422,6 +423,7 @@ RPC_STATUS RpcAssoc_GetClientConnection(RpcAssoc *assoc, return status; } + InterlockedIncrement(&assoc->connection_cnt); *Connection = NewConnection; return RPC_S_OK; @@ -437,6 +439,15 @@ void RpcAssoc_ReleaseIdleConnection(RpcAssoc *assoc, RpcConnection *Connection) LeaveCriticalSection(&assoc->cs); } +void RpcAssoc_ConnectionReleased(RpcAssoc *assoc) +{ + if (InterlockedDecrement(&assoc->connection_cnt)) + return; + + TRACE("Last %p connection released\n", assoc); + assoc->assoc_group_id = 0; +} + RPC_STATUS RpcServerAssoc_AllocateContextHandle(RpcAssoc *assoc, void *CtxGuard, NDR_SCONTEXT *SContext) { diff --git a/dlls/rpcrt4/rpc_assoc.h b/dlls/rpcrt4/rpc_assoc.h index 3d9b612..f4c5f3a 100644 --- a/dlls/rpcrt4/rpc_assoc.h +++ b/dlls/rpcrt4/rpc_assoc.h @@ -41,6 +41,7 @@ typedef struct _RpcAssoc /* client-only */ /* connections available to be used (protected by cs) */ struct list free_connection_pool; + LONG connection_cnt; /* server-only */ struct list context_handle_list; /* protected by cs */ @@ -59,3 +60,4 @@ RPC_STATUS RpcServerAssoc_UpdateContextHandle(RpcAssoc *assoc, NDR_SCONTEXT SCon unsigned int RpcServerAssoc_ReleaseContextHandle(RpcAssoc *assoc, NDR_SCONTEXT SContext, BOOL release_lock) DECLSPEC_HIDDEN; void RpcContextHandle_GetUuid(NDR_SCONTEXT SContext, UUID *uuid) DECLSPEC_HIDDEN; BOOL RpcContextHandle_IsGuardCorrect(NDR_SCONTEXT SContext, void *CtxGuard) DECLSPEC_HIDDEN; +void RpcAssoc_ConnectionReleased(RpcAssoc *assoc) DECLSPEC_HIDDEN; diff --git a/dlls/rpcrt4/rpc_transport.c b/dlls/rpcrt4/rpc_transport.c index c374ba1..4fd091c 100644 --- a/dlls/rpcrt4/rpc_transport.c +++ b/dlls/rpcrt4/rpc_transport.c @@ -3419,6 +3419,7 @@ void RPCRT4_ReleaseConnection(RpcConnection *connection) /* server-only */ if (connection->server_binding) RPCRT4_ReleaseBinding(connection->server_binding); + else if (connection->assoc) RpcAssoc_ConnectionReleased(connection->assoc); if (connection->wait_release) SetEvent(connection->wait_release);
participants (1)
-
Alexandre Julliard