summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2011-11-22 11:25:14 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2011-11-22 11:25:14 +0000
commit98c917e0a1d33e24cd2fd00f1ab1404f6452a271 (patch)
treed860d3b3c9484111773526bfb7a56fbd9563edce
parentc9891545fd87ae37b8234c9bf6dff3ae6b334b22 (diff)
Fixed memory leaks in networking, used core functions for allocating memory, fix sdl win32 building with network enabled (no whatsnew)
-rw-r--r--src/osd/osdnet.c7
-rw-r--r--src/osd/osdnet.h1
-rw-r--r--src/osd/sdl/netdev.c10
-rw-r--r--src/osd/sdl/netdev.h1
-rw-r--r--src/osd/sdl/netdev_pcap.c7
-rw-r--r--src/osd/sdl/netdev_pcap.h1
-rw-r--r--src/osd/sdl/netdev_tap.c7
-rw-r--r--src/osd/sdl/netdev_tap.h2
-rw-r--r--src/osd/sdl/sdl.mak2
-rw-r--r--src/osd/sdl/sdlmain.c3
-rw-r--r--src/osd/windows/netdev.c5
-rw-r--r--src/osd/windows/netdev.h1
-rw-r--r--src/osd/windows/netdev_pcap.c23
-rw-r--r--src/osd/windows/netdev_pcap.h1
-rw-r--r--src/osd/windows/winmain.c4
15 files changed, 66 insertions, 9 deletions
diff --git a/src/osd/osdnet.c b/src/osd/osdnet.c
index b91dea82722..2df27d6cde5 100644
--- a/src/osd/osdnet.c
+++ b/src/osd/osdnet.c
@@ -13,7 +13,7 @@ static class simple_list<netdev_entry_t> netdev_list;
void add_netdev(const char *name, create_netdev func)
{
- netdev_entry_t *entry = new netdev_entry_t;
+ netdev_entry_t *entry = global_alloc_clear(netdev_entry_t);
entry->id = netdev_list.count();
strncpy(entry->name, name, 255);
entry->name[255] = '\0';
@@ -21,6 +21,11 @@ void add_netdev(const char *name, create_netdev func)
netdev_list.append(*entry);
}
+void clear_netdev()
+{
+ netdev_list.reset();
+}
+
class netdev *open_netdev(int id, class device_network_interface *ifdev, int rate)
{
netdev_entry_t *entry = netdev_list.first();
diff --git a/src/osd/osdnet.h b/src/osd/osdnet.h
index 87d73bd1727..aca6f75b5e4 100644
--- a/src/osd/osdnet.h
+++ b/src/osd/osdnet.h
@@ -30,4 +30,5 @@ typedef class netdev *(*create_netdev)(const char *ifname, class device_network_
class netdev *open_netdev(int id, class device_network_interface *ifdev, int rate);
void add_netdev(const char *name, create_netdev func);
+void clear_netdev();
#endif
diff --git a/src/osd/sdl/netdev.c b/src/osd/sdl/netdev.c
index 78dff212701..27b2d4858ac 100644
--- a/src/osd/sdl/netdev.c
+++ b/src/osd/sdl/netdev.c
@@ -11,3 +11,13 @@ void sdlnetdev_init(running_machine &machine)
init_pcap();
#endif
}
+
+void sdlnetdev_deinit(running_machine &machine)
+{
+ #ifdef SDLMAME_NET_TAPTUN
+ deinit_tap();
+ #endif
+ #ifdef SDLMAME_NET_PCAP
+ deinit_pcap();
+ #endif
+}
diff --git a/src/osd/sdl/netdev.h b/src/osd/sdl/netdev.h
index 96a65fbb419..4a3ae6c8de2 100644
--- a/src/osd/sdl/netdev.h
+++ b/src/osd/sdl/netdev.h
@@ -2,5 +2,6 @@
#define __NETDEV_H__
void sdlnetdev_init(running_machine &machine);
+void sdlnetdev_deinit(running_machine &machine);
#endif
diff --git a/src/osd/sdl/netdev_pcap.c b/src/osd/sdl/netdev_pcap.c
index ce2b170559c..ef74a2e02c6 100644
--- a/src/osd/sdl/netdev_pcap.c
+++ b/src/osd/sdl/netdev_pcap.c
@@ -70,7 +70,7 @@ netdev_pcap::~netdev_pcap()
static CREATE_NETDEV(create_pcap)
{
- class netdev_pcap *dev = new netdev_pcap(ifname, ifdev, rate);
+ class netdev_pcap *dev = global_alloc(netdev_pcap(ifname, ifdev, rate));
return dynamic_cast<netdev *>(dev);
}
@@ -94,4 +94,9 @@ void init_pcap()
}
}
+void deinit_pcap()
+{
+ clear_netdev();
+}
+
#endif // SDLMAME_WIN32
diff --git a/src/osd/sdl/netdev_pcap.h b/src/osd/sdl/netdev_pcap.h
index 051540e96b7..ed136a42566 100644
--- a/src/osd/sdl/netdev_pcap.h
+++ b/src/osd/sdl/netdev_pcap.h
@@ -2,5 +2,6 @@
#define __NETDEV_PCAP_H__
void init_pcap();
+void deinit_pcap();
#endif
diff --git a/src/osd/sdl/netdev_tap.c b/src/osd/sdl/netdev_tap.c
index 74c5a515502..ee44bac44ca 100644
--- a/src/osd/sdl/netdev_tap.c
+++ b/src/osd/sdl/netdev_tap.c
@@ -88,7 +88,7 @@ int netdev_tap::recv_dev(UINT8 **buf)
static CREATE_NETDEV(create_tap)
{
- class netdev_tap *dev = new netdev_tap(ifname, ifdev, rate);
+ class netdev_tap *dev = global_alloc(netdev_tap(ifname, ifdev, rate));
return dynamic_cast<netdev *>(dev);
}
@@ -96,3 +96,8 @@ void init_tap()
{
add_netdev("tap", create_tap);
}
+
+void deinit_tap()
+{
+ clear_netdev();
+} \ No newline at end of file
diff --git a/src/osd/sdl/netdev_tap.h b/src/osd/sdl/netdev_tap.h
index fe68809e590..c6b8e165d62 100644
--- a/src/osd/sdl/netdev_tap.h
+++ b/src/osd/sdl/netdev_tap.h
@@ -2,5 +2,5 @@
#define __NETDEV_TAP_H__
void init_tap();
-
+void deinit_tap();
#endif
diff --git a/src/osd/sdl/sdl.mak b/src/osd/sdl/sdl.mak
index 247b831edcf..b4d6cb7a74e 100644
--- a/src/osd/sdl/sdl.mak
+++ b/src/osd/sdl/sdl.mak
@@ -518,9 +518,11 @@ OSDOBJS += \
$(SDLOBJ)/netdev_pcap.o
DEFS += -DSDLMAME_NETWORK -DSDLMAME_NET_PCAP
+ifneq ($(TARGETOS),win32)
LIBS += -lpcap
endif
endif
+endif
#-------------------------------------------------
# Dependencies
diff --git a/src/osd/sdl/sdlmain.c b/src/osd/sdl/sdlmain.c
index ac8d7969775..46cfe24b01a 100644
--- a/src/osd/sdl/sdlmain.c
+++ b/src/osd/sdl/sdlmain.c
@@ -409,6 +409,9 @@ sdl_osd_interface::~sdl_osd_interface()
void sdl_osd_interface::osd_exit(running_machine &machine)
{
+ #ifdef SDLMAME_NETWORK
+ sdlnetdev_deinit(machine);
+ #endif
if (!SDLMAME_INIT_IN_WORKER_THREAD)
SDL_Quit();
diff --git a/src/osd/windows/netdev.c b/src/osd/windows/netdev.c
index e3ea9e0dab5..29bb4a17696 100644
--- a/src/osd/windows/netdev.c
+++ b/src/osd/windows/netdev.c
@@ -5,3 +5,8 @@ void winnetdev_init(running_machine &machine)
{
init_pcap();
}
+
+void winnetdev_deinit(running_machine &machine)
+{
+ deinit_pcap();
+}
diff --git a/src/osd/windows/netdev.h b/src/osd/windows/netdev.h
index f0bc5a3dc04..3a05d4530c7 100644
--- a/src/osd/windows/netdev.h
+++ b/src/osd/windows/netdev.h
@@ -2,5 +2,6 @@
#define __NETDEV_H
void winnetdev_init(running_machine &machine);
+void winnetdev_deinit(running_machine &machine);
#endif
diff --git a/src/osd/windows/netdev_pcap.c b/src/osd/windows/netdev_pcap.c
index 07781ac5a73..241ba54af0a 100644
--- a/src/osd/windows/netdev_pcap.c
+++ b/src/osd/windows/netdev_pcap.c
@@ -78,15 +78,17 @@ netdev_pcap::~netdev_pcap()
static CREATE_NETDEV(create_pcap)
{
- class netdev_pcap *dev = new netdev_pcap(ifname, ifdev, rate);
+ class netdev_pcap *dev = global_alloc(netdev_pcap(ifname, ifdev, rate));
return dynamic_cast<netdev *>(dev);
}
+static HMODULE handle = NULL;
+
void init_pcap()
{
pcap_if_t *devs;
char errbuf[PCAP_ERRBUF_SIZE];
- HMODULE handle = NULL;
+ handle = NULL;
try
{
@@ -120,9 +122,20 @@ void init_pcap()
mame_printf_verbose("Unable to get network devices: %s\n", errbuf);
return;
}
- while(devs->next)
+
+ if (devs)
{
- add_netdev(devs->name, create_pcap);
- devs = devs->next;
+ while(devs->next)
+ {
+ add_netdev(devs->name, create_pcap);
+ devs = devs->next;
+ }
}
}
+
+void deinit_pcap()
+{
+ clear_netdev();
+ FreeLibrary(handle);
+}
+
diff --git a/src/osd/windows/netdev_pcap.h b/src/osd/windows/netdev_pcap.h
index 2aed43881e1..f4a3241d4e9 100644
--- a/src/osd/windows/netdev_pcap.h
+++ b/src/osd/windows/netdev_pcap.h
@@ -2,5 +2,6 @@
#define __NETDEV_H
void init_pcap();
+void deinit_pcap();
#endif
diff --git a/src/osd/windows/winmain.c b/src/osd/windows/winmain.c
index 24d13cea2a0..e0d96913061 100644
--- a/src/osd/windows/winmain.c
+++ b/src/osd/windows/winmain.c
@@ -709,6 +709,10 @@ void windows_osd_interface::osd_exit(running_machine &machine)
// cleanup sockets
win_cleanup_sockets();
+ #ifdef USE_NETWORK
+ winnetdev_deinit(machine);
+ #endif
+
// take down the watchdog thread if it exists
if (watchdog_thread != NULL)
{