diff options
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 |
commit | 98c917e0a1d33e24cd2fd00f1ab1404f6452a271 (patch) | |
tree | d860d3b3c9484111773526bfb7a56fbd9563edce | |
parent | c9891545fd87ae37b8234c9bf6dff3ae6b334b22 (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.c | 7 | ||||
-rw-r--r-- | src/osd/osdnet.h | 1 | ||||
-rw-r--r-- | src/osd/sdl/netdev.c | 10 | ||||
-rw-r--r-- | src/osd/sdl/netdev.h | 1 | ||||
-rw-r--r-- | src/osd/sdl/netdev_pcap.c | 7 | ||||
-rw-r--r-- | src/osd/sdl/netdev_pcap.h | 1 | ||||
-rw-r--r-- | src/osd/sdl/netdev_tap.c | 7 | ||||
-rw-r--r-- | src/osd/sdl/netdev_tap.h | 2 | ||||
-rw-r--r-- | src/osd/sdl/sdl.mak | 2 | ||||
-rw-r--r-- | src/osd/sdl/sdlmain.c | 3 | ||||
-rw-r--r-- | src/osd/windows/netdev.c | 5 | ||||
-rw-r--r-- | src/osd/windows/netdev.h | 1 | ||||
-rw-r--r-- | src/osd/windows/netdev_pcap.c | 23 | ||||
-rw-r--r-- | src/osd/windows/netdev_pcap.h | 1 | ||||
-rw-r--r-- | src/osd/windows/winmain.c | 4 |
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) { |