Module: wine Branch: master Commit: 8cc3adea52cfefe4b230cf50041b597405060447 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8cc3adea52cfefe4b230cf5004...
Author: Rob Shearman robertshearman@gmail.com Date: Fri Sep 12 12:58:19 2008 +0100
rpcrt4: Free the memory for a registered interface that is in use and when WaitForCallsToComplete is 0.
---
dlls/rpcrt4/rpc_server.c | 7 +++++-- dlls/rpcrt4/rpc_server.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/rpcrt4/rpc_server.c b/dlls/rpcrt4/rpc_server.c index f93d264..7a3a5f6 100644 --- a/dlls/rpcrt4/rpc_server.c +++ b/dlls/rpcrt4/rpc_server.c @@ -147,10 +147,11 @@ static RpcServerInterface* RPCRT4_find_interface(UUID* object, static void RPCRT4_release_server_interface(RpcServerInterface *sif) { if (!InterlockedDecrement(&sif->CurrentCalls) && - sif->CallsCompletedEvent) { + sif->Delete) { /* sif must have been removed from server_interfaces before * CallsCompletedEvent is set */ - SetEvent(sif->CallsCompletedEvent); + if (sif->CallsCompletedEvent) + SetEvent(sif->CallsCompletedEvent); HeapFree(GetProcessHeap(), 0, sif); } } @@ -888,8 +889,10 @@ RPC_STATUS WINAPI RpcServerUnregisterIf( RPC_IF_HANDLE IfSpec, UUID* MgrTypeUuid if ((!IfSpec || !memcmp(&If->InterfaceId, &cif->If->InterfaceId, sizeof(RPC_SYNTAX_IDENTIFIER))) && UuidEqual(MgrTypeUuid, &cif->MgrTypeUuid, &status)) { list_remove(&cif->entry); + TRACE("unregistering cif %p\n", cif); if (cif->CurrentCalls) { completed = FALSE; + cif->Delete = TRUE; if (WaitForCallsToComplete) cif->CallsCompletedEvent = event = CreateEventW(NULL, FALSE, FALSE, NULL); } diff --git a/dlls/rpcrt4/rpc_server.h b/dlls/rpcrt4/rpc_server.h index eb32be6..f1804d3 100644 --- a/dlls/rpcrt4/rpc_server.h +++ b/dlls/rpcrt4/rpc_server.h @@ -73,6 +73,7 @@ typedef struct _RpcServerInterface /* set when unregistering interface to let the caller of * RpcServerUnregisterIf* know that all calls have finished */ HANDLE CallsCompletedEvent; + BOOL Delete; /* delete when the last call finishes */ } RpcServerInterface;
void RPCRT4_new_client(RpcConnection* conn);