Rob Shearman : rpcrt4: Free the memory for a registered interface that is in use and when WaitForCallsToComplete is 0 .

Alexandre Julliard julliard at winehq.org
Mon Sep 15 06:54:00 CDT 2008


Module: wine
Branch: master
Commit: 8cc3adea52cfefe4b230cf50041b597405060447
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8cc3adea52cfefe4b230cf50041b597405060447

Author: Rob Shearman <robertshearman at 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);




More information about the wine-cvs mailing list