netdev: fix race condition/crash when using the OSD to choose pcap devices. [Rob Braun]

This commit is contained in:
arbee 2015-04-01 21:57:10 -04:00
parent 793271786e
commit 140163dcc7
3 changed files with 22 additions and 4 deletions

View File

@ -189,7 +189,14 @@ void netdev_pcap::set_mac(const char *mac)
int netdev_pcap::send(UINT8 *buf, int len) int netdev_pcap::send(UINT8 *buf, int len)
{ {
if(!m_p) return 0; int ret;
if(!m_p) {
printf("send invoked, but no pcap context\n");
return 0;
}
ret = pcap_sendpacket_dl(m_p, buf, len);
printf("sent packet length %d, returned %d\n", len, ret);
return ret ? len : 0;
return (!pcap_sendpacket_dl(m_p, buf, len))?len:0; return (!pcap_sendpacket_dl(m_p, buf, len))?len:0;
} }
@ -219,6 +226,7 @@ int netdev_pcap::recv_dev(UINT8 **buf)
netdev_pcap::~netdev_pcap() netdev_pcap::~netdev_pcap()
{ {
if(m_p) pcap_close_dl(m_p); if(m_p) pcap_close_dl(m_p);
m_p = NULL;
} }
static CREATE_NETDEV(create_pcap) static CREATE_NETDEV(create_pcap)
@ -279,7 +287,11 @@ int pcap_module::init()
while(devs) while(devs)
{ {
add_netdev(devs->name, devs->description, create_pcap); if(devs->description) {
add_netdev(devs->name, devs->description, create_pcap);
} else {
add_netdev(devs->name, devs->name, create_pcap);
}
devs = devs->next; devs = devs->next;
} }
return 0; return 0;

View File

@ -39,11 +39,15 @@ class osd_netdev *open_netdev(int id, class device_network_interface *ifdev, int
osd_netdev::osd_netdev(class device_network_interface *ifdev, int rate) osd_netdev::osd_netdev(class device_network_interface *ifdev, int rate)
{ {
m_dev = ifdev; m_dev = ifdev;
ifdev->device().machine().scheduler().timer_pulse(attotime::from_hz(rate), timer_expired_delegate(FUNC(osd_netdev::recv), this)); m_stop = false;
m_timer = ifdev->device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(osd_netdev::recv), this));
m_timer->adjust(attotime::from_hz(rate), 0, attotime::from_hz(rate));
} }
osd_netdev::~osd_netdev() osd_netdev::~osd_netdev()
{ {
m_stop = true;
m_timer->reset();
} }
int osd_netdev::send(UINT8 *buf, int len) int osd_netdev::send(UINT8 *buf, int len)
@ -56,7 +60,7 @@ void osd_netdev::recv(void *ptr, int param)
UINT8 *buf; UINT8 *buf;
int len; int len;
//const char atalkmac[] = { 0x09, 0x00, 0x07, 0xff, 0xff, 0xff }; //const char atalkmac[] = { 0x09, 0x00, 0x07, 0xff, 0xff, 0xff };
while((len = recv_dev(&buf))) while((!m_stop) && (len = recv_dev(&buf)))
{ {
#if 0 #if 0
if(buf[0] & 1) if(buf[0] & 1)

View File

@ -36,6 +36,8 @@ private:
void recv(void *ptr, int param); void recv(void *ptr, int param);
class device_network_interface *m_dev; class device_network_interface *m_dev;
emu_timer *m_timer;
bool m_stop;
}; };
class osd_netdev *open_netdev(int id, class device_network_interface *ifdev, int rate); class osd_netdev *open_netdev(int id, class device_network_interface *ifdev, int rate);