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