Juan Lang : inetmib1: Free memory when DLL is unloaded.

Alexandre Julliard julliard at winehq.org
Mon Jun 30 08:26:51 CDT 2008


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

Author: Juan Lang <juan.lang at gmail.com>
Date:   Sat Jun 28 09:23:02 2008 -0700

inetmib1: Free memory when DLL is unloaded.

---

 dlls/inetmib1/main.c |   96 +++++++++++++++++++++++++++++++++++--------------
 1 files changed, 68 insertions(+), 28 deletions(-)

diff --git a/dlls/inetmib1/main.c b/dlls/inetmib1/main.c
index f14b78c..09b408c 100644
--- a/dlls/inetmib1/main.c
+++ b/dlls/inetmib1/main.c
@@ -29,24 +29,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(inetmib1);
 
-BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
-{
-	TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
-
-	switch (fdwReason)
-	{
-		case DLL_PROCESS_ATTACH:
-			DisableThreadLibraryCalls(hinstDLL);
-			break;
-		case DLL_PROCESS_DETACH:
-			break;
-		default:
-			break;
-	}
-
-	return TRUE;
-}
-
 /**
  * Utility functions
  */
@@ -113,6 +95,7 @@ struct mibImplementation
     AsnObjectIdentifier name;
     void              (*init)(void);
     varqueryfunc        query;
+    void              (*cleanup)(void);
 };
 
 static UINT mib2IfNumber[] = { 1,3,6,1,2,1,2,1 };
@@ -130,6 +113,11 @@ static void mib2IfNumberInit(void)
     }
 }
 
+static void mib2IfNumberCleanup(void)
+{
+    HeapFree(GetProcessHeap(), 0, ifTable);
+}
+
 static BOOL mib2IfNumberQuery(BYTE bPduType, SnmpVarBind *pVarBind,
     AsnInteger32 *pErrorStatus)
 {
@@ -651,6 +639,11 @@ static void mib2IpAddrInit(void)
     }
 }
 
+static void mib2IpAddrCleanup(void)
+{
+    HeapFree(GetProcessHeap(), 0, ipAddrTable);
+}
+
 static void oidToIpAddrRow(AsnObjectIdentifier *oid, void *dst)
 {
     MIB_IPADDRROW *row = dst;
@@ -734,6 +727,11 @@ static void mib2IpRouteInit(void)
     }
 }
 
+static void mib2IpRouteCleanup(void)
+{
+    HeapFree(GetProcessHeap(), 0, ipRouteTable);
+}
+
 static void oidToIpForwardRow(AsnObjectIdentifier *oid, void *dst)
 {
     MIB_IPFORWARDROW *row = dst;
@@ -809,6 +807,11 @@ static void mib2IpNetInit(void)
     }
 }
 
+static void mib2IpNetCleanup(void)
+{
+    HeapFree(GetProcessHeap(), 0, ipNetTable);
+}
+
 static BOOL mib2IpNetQuery(BYTE bPduType, SnmpVarBind *pVarBind,
     AsnInteger32 *pErrorStatus)
 {
@@ -1050,6 +1053,11 @@ static void mib2UdpEntryInit(void)
     }
 }
 
+static void mib2UdpEntryCleanup(void)
+{
+    HeapFree(GetProcessHeap(), 0, udpTable);
+}
+
 static struct structToAsnValue mib2UdpEntryMap[] = {
     { FIELD_OFFSET(MIB_UDPROW, dwLocalAddr), copyIpAddr },
     { FIELD_OFFSET(MIB_UDPROW, dwLocalPort), copyInt },
@@ -1129,16 +1137,20 @@ static BOOL mib2UdpEntryQuery(BYTE bPduType, SnmpVarBind *pVarBind,
 
 /* This list MUST BE lexicographically sorted */
 static struct mibImplementation supportedIDs[] = {
-    { DEFINE_OID(mib2IfNumber), mib2IfNumberInit, mib2IfNumberQuery },
-    { DEFINE_OID(mib2IfEntry), NULL, mib2IfEntryQuery },
-    { DEFINE_OID(mib2Ip), mib2IpStatsInit, mib2IpStatsQuery },
-    { DEFINE_OID(mib2IpAddr), mib2IpAddrInit, mib2IpAddrQuery },
-    { DEFINE_OID(mib2IpRoute), mib2IpRouteInit, mib2IpRouteQuery },
-    { DEFINE_OID(mib2IpNet), mib2IpNetInit, mib2IpNetQuery },
-    { DEFINE_OID(mib2Icmp), mib2IcmpInit, mib2IcmpQuery },
-    { DEFINE_OID(mib2Tcp), mib2TcpInit, mib2TcpQuery },
-    { DEFINE_OID(mib2Udp), mib2UdpInit, mib2UdpQuery },
-    { DEFINE_OID(mib2UdpEntry), mib2UdpEntryInit, mib2UdpEntryQuery },
+    { DEFINE_OID(mib2IfNumber), mib2IfNumberInit, mib2IfNumberQuery,
+      mib2IfNumberCleanup },
+    { DEFINE_OID(mib2IfEntry), NULL, mib2IfEntryQuery, NULL },
+    { DEFINE_OID(mib2Ip), mib2IpStatsInit, mib2IpStatsQuery, NULL },
+    { DEFINE_OID(mib2IpAddr), mib2IpAddrInit, mib2IpAddrQuery,
+      mib2IpAddrCleanup },
+    { DEFINE_OID(mib2IpRoute), mib2IpRouteInit, mib2IpRouteQuery,
+      mib2IpRouteCleanup },
+    { DEFINE_OID(mib2IpNet), mib2IpNetInit, mib2IpNetQuery, mib2IpNetCleanup },
+    { DEFINE_OID(mib2Icmp), mib2IcmpInit, mib2IcmpQuery, NULL },
+    { DEFINE_OID(mib2Tcp), mib2TcpInit, mib2TcpQuery, NULL },
+    { DEFINE_OID(mib2Udp), mib2UdpInit, mib2UdpQuery, NULL },
+    { DEFINE_OID(mib2UdpEntry), mib2UdpEntryInit, mib2UdpEntryQuery,
+      mib2UdpEntryCleanup },
 };
 static UINT minSupportedIDLength;
 
@@ -1164,6 +1176,15 @@ BOOL WINAPI SnmpExtensionInit(DWORD dwUptimeReference,
     return TRUE;
 }
 
+static void cleanup(void)
+{
+    UINT i;
+
+    for (i = 0; i < sizeof(supportedIDs) / sizeof(supportedIDs[0]); i++)
+        if (supportedIDs[i].cleanup)
+            supportedIDs[i].cleanup();
+}
+
 static struct mibImplementation *findSupportedQuery(UINT *ids, UINT idLength,
     UINT *matchingIndex)
 {
@@ -1260,3 +1281,22 @@ BOOL WINAPI SnmpExtensionQuery(BYTE bPduType, SnmpVarBindList *pVarBindList,
     *pErrorIndex = errorIndex;
     return TRUE;
 }
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+    TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
+
+    switch (fdwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hinstDLL);
+            break;
+        case DLL_PROCESS_DETACH:
+            cleanup();
+            break;
+        default:
+            break;
+    }
+
+    return TRUE;
+}




More information about the wine-cvs mailing list