diff --git a/src/network/net_pcap.c b/src/network/net_pcap.c index fe41e6281..18878db79 100644 --- a/src/network/net_pcap.c +++ b/src/network/net_pcap.c @@ -78,7 +78,7 @@ poll_thread(void *arg) /* As long as the channel is open.. */ while (pcap != NULL) { - startnet(); + network_mutex_wait(1); network_wait_for_poll(); @@ -106,14 +106,12 @@ poll_thread(void *arg) if (data == NULL) thread_wait_event(evt, 10); - endnet(); + network_mutex_wait(0); } thread_destroy_event(evt); poll_tid = NULL; - network_mutex_close(); - pclog("PCAP: polling stopped.\n"); } @@ -273,8 +271,6 @@ network_pcap_close(void) ; #endif - network_mutex_close(); - /* OK, now shut down WinPcap itself. */ f_pcap_close(pc); pc = pcap = NULL; @@ -403,10 +399,10 @@ void network_pcap_in(uint8_t *bufp, int len) { if (pcap != NULL) { - network_busy_set(); + network_busy(1); f_pcap_sendpacket(pcap, bufp, len); - network_busy_clear(); + network_busy(0); } } diff --git a/src/network/net_slirp.c b/src/network/net_slirp.c index 01987c47d..a664eba81 100644 --- a/src/network/net_slirp.c +++ b/src/network/net_slirp.c @@ -80,7 +80,7 @@ poll_thread(void *arg) evt = thread_create_event(); while (slirpq != NULL) { - startnet(); + network_mutex_wait(1); network_wait_for_poll(); @@ -107,14 +107,12 @@ poll_thread(void *arg) /* Done with this one. */ free(qp); - endnet(); + network_mutex_wait(0); } thread_destroy_event(evt); evt = poll_tid = NULL; - network_mutex_close(); - pclog("SLiRP: polling stopped.\n"); } @@ -168,8 +166,6 @@ network_slirp_close(void) ; #endif - network_mutex_close(); - /* OK, now shut down SLiRP itself. */ QueueDestroy(sl); slirp_exit(0); @@ -201,11 +197,11 @@ void network_slirp_in(uint8_t *pkt, int pkt_len) { if (slirpq != NULL) { - network_busy_set(); + network_busy(1); slirp_input((const uint8_t *)pkt, pkt_len); - network_busy_clear(); + network_busy(0); } } diff --git a/src/network/network.c b/src/network/network.c index da68ec403..f74f20d16 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -54,31 +54,30 @@ int network_card; netdev_t network_devs[32]; char network_pcap[512]; int nic_do_log; -static mutex_t *netMutex; +static volatile +mutex_t *netMutex; static struct { - int busy; - int queue_in_use; + volatile int + busy, + queue_in_use; - event_t *wake_poll_thread; - event_t *poll_complete; - event_t *queue_not_in_use; + volatile event_t + *wake_poll_thread, + *poll_complete, + *queue_not_in_use; } poll_data; void -startnet(void) +network_mutex_wait(uint8_t wait) { - thread_wait_mutex(netMutex); -} - - -void -endnet(void) -{ - thread_release_mutex(netMutex); + if (wait) + thread_wait_mutex((mutex_t *) netMutex); + else + thread_release_mutex((mutex_t *) netMutex); } @@ -86,46 +85,24 @@ void network_wait_for_poll() { while (poll_data.busy) - thread_wait_event(poll_data.poll_complete, -1); - thread_reset_event(poll_data.poll_complete); + thread_wait_event((event_t *) poll_data.poll_complete, -1); + thread_reset_event((event_t *) poll_data.poll_complete); } void -network_mutex_init() +network_thread_init(void) { - netMutex = thread_create_mutex(L"86Box.NetMutex"); -} - - -void -network_mutex_close() -{ - thread_close_mutex(netMutex); -} - - -void -network_thread_init() -{ - network_mutex_init(); - poll_data.wake_poll_thread = thread_create_event(); poll_data.poll_complete = thread_create_event(); } void -network_busy_set() +network_busy(uint8_t set) { - poll_data.busy = 1; -} - - -void -network_busy_clear() -{ - poll_data.busy = 0; - thread_set_event(poll_data.poll_complete); + poll_data.busy = !!set; + if (!set) + thread_set_event((event_t *) poll_data.poll_complete); } @@ -184,6 +161,8 @@ network_attach(void *dev, uint8_t *mac, NETRXCB rx) net_cards[network_card].priv = dev; net_cards[network_card].rx = rx; + netMutex = thread_create_mutex(L"86Box.NetMutex"); + /* Start the platform module. */ switch(network_type) { case NET_TYPE_PCAP: @@ -216,6 +195,8 @@ network_close(void) network_slirp_close(); break; } + + thread_close_mutex((event_t *) netMutex); } diff --git a/src/network/network.h b/src/network/network.h index d6602f6b2..db95e72cd 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -56,14 +56,12 @@ extern char network_pcap[512]; /* Function prototypes. */ -extern void startnet(void); -extern void endnet(void); -extern void network_wait_for_poll(); -extern void network_mutex_init(); -extern void network_mutex_close(); -extern void network_thread_init(); -extern void network_busy_set(); -extern void network_busy_clear(); +extern void network_mutex_wait(uint8_t wait); +extern void network_wait_for_poll(void); +extern void network_mutex_init(void); +extern void network_mutex_close(void); +extern void network_thread_init(void); +extern void network_busy(uint8_t set); extern void network_init(void); extern int network_attach(void *, uint8_t *, NETRXCB); diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index cfa2d4942..3831d04dc 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -49,6 +49,7 @@ int scsi_card_current = 0; int scsi_card_last = 0; uint32_t SCSI_BufferLength; +static volatile mutex_t *scsiMutex; @@ -127,15 +128,12 @@ int scsi_card_get_from_internal_name(char *s) } -void scsi_mutex_init(void) +void scsi_mutex(uint8_t start) { - scsiMutex = thread_create_mutex(L"86Box.SCSIMutex"); -} - - -void scsi_mutex_close(void) -{ - thread_close_mutex(scsiMutex); + if (start) + scsiMutex = thread_create_mutex(L"86Box.SCSIMutex"); + else + thread_close_mutex((mutex_t *) scsiMutex); } @@ -209,14 +207,10 @@ void SCSIReset(uint8_t id, uint8_t lun) void -startscsi(void) +scsi_mutex_wait(uint8_t wait) { - thread_wait_mutex(scsiMutex); -} - - -void -endscsi(void) -{ - thread_release_mutex(scsiMutex); + if (wait) + thread_wait_mutex((mutex_t *) scsiMutex); + else + thread_release_mutex((mutex_t *) scsiMutex); } diff --git a/src/scsi/scsi.h b/src/scsi/scsi.h index 1f6bb1cde..092dd5650 100644 --- a/src/scsi/scsi.h +++ b/src/scsi/scsi.h @@ -294,8 +294,7 @@ extern device_t *scsi_card_getdevice(int card); extern int scsi_card_has_config(int card); extern char *scsi_card_get_internal_name(int card); extern int scsi_card_get_from_internal_name(char *s); -extern void scsi_mutex_init(void); -extern void scsi_mutex_close(void); +extern void scsi_mutex(uint8_t start); extern void scsi_card_init(void); extern void scsi_card_reset(void); @@ -354,5 +353,4 @@ typedef struct { #endif /*EMU_SCSI_H*/ -extern void startscsi(void); -extern void endscsi(void); +extern void scsi_mutex_wait(uint8_t wait); diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index d9e5cad3d..970dff1bb 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -265,11 +265,11 @@ aha_fast_cmds(void *p, uint8_t cmd) x54x_t *dev = (x54x_t *)p; if (cmd == CMD_BIOS_SCSI) { - x54x_busy_set(); + x54x_busy(1); dev->BIOSMailboxReq++; x54x_thread_start(dev); - x54x_busy_clear(); + x54x_busy(0); return 1; } @@ -361,7 +361,7 @@ aha_cmds(void *p) case CMD_BIOS_MBINIT: /* BIOS Mailbox Initialization */ /* Sent by CF BIOS. */ - x54x_busy_set(); + x54x_busy(1); dev->Mbx24bit = 1; mbi = (MailboxInit_t *)dev->CmdBuf; @@ -377,7 +377,7 @@ aha_cmds(void *p) dev->Status &= ~STAT_INIT; dev->DataReplyLeft = 0; - x54x_busy_clear(); + x54x_busy(0); break; case CMD_MEMORY_MAP_1: /* AHA memory mapper */ diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index 95b945ee1..8c7b22eb5 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -692,7 +692,7 @@ buslogic_cmds(void *p) dev->IrqEnabled = 1; return 1; case 0x81: - x54x_busy_set(); + x54x_busy(1); dev->Mbx24bit = 0; MailboxInitE = (MailboxInitExtended_t *)dev->CmdBuf; @@ -709,7 +709,7 @@ buslogic_cmds(void *p) dev->Status &= ~STAT_INIT; dev->DataReplyLeft = 0; - x54x_busy_clear(); + x54x_busy(0); break; case 0x83: if (dev->CmdParam == 12) { diff --git a/src/scsi/scsi_x54x.c b/src/scsi/scsi_x54x.c index 203fb3c44..adc646974 100644 --- a/src/scsi/scsi_x54x.c +++ b/src/scsi/scsi_x54x.c @@ -50,12 +50,16 @@ static void x54x_cmd_thread(void *priv); -static thread_t *poll_tid; -static int busy; +static volatile +thread_t *poll_tid; +static volatile +int busy; -static event_t *evt; +static volatile +event_t *evt; -static event_t *poll_complete; +static volatile +event_t *poll_complete; #ifdef ENABLE_X54X_LOG @@ -1053,7 +1057,7 @@ x54x_scsi_cmd(x54x_t *dev) x54x_log("SCSIStatus = %02X\n", SCSIStatus); if (temp_cdb[0] == 0x42) { - thread_wait_event(evt, 10); + thread_wait_event((event_t *) evt, 10); } } @@ -1287,10 +1291,10 @@ x54x_cmd_done(x54x_t *dev, int suppress); void x54x_wait_for_poll(void) { - if (x54x_busy()) { - thread_wait_event(poll_complete, -1); + if (x54x_is_busy()) { + thread_wait_event((event_t *) poll_complete, -1); } - thread_reset_event(poll_complete); + thread_reset_event((event_t *) poll_complete); } @@ -1305,11 +1309,11 @@ x54x_cmd_thread(void *priv) { if ((dev->Status & STAT_INIT) || (!dev->MailboxInit && !dev->BIOSMailboxInit) || (!dev->MailboxReq && !dev->BIOSMailboxReq)) { /* If we did not get anything, wait a while. */ - thread_wait_event(evt, 10); + thread_wait_event((event_t *) evt, 10); continue; } - startscsi(); + scsi_mutex_wait(1); if (!(dev->Status & STAT_INIT) && dev->MailboxInit && dev->MailboxReq) { @@ -1322,34 +1326,36 @@ x54x_cmd_thread(void *priv) dev->ven_thread(dev); } - endscsi(); + scsi_mutex_wait(0); } if (poll_tid) { - thread_kill(poll_tid); + thread_kill((thread_t *) poll_tid); poll_tid = NULL; } if (poll_complete) { - thread_destroy_event(poll_complete); + thread_destroy_event((event_t *) poll_complete); poll_complete = NULL; } if (evt) { - thread_destroy_event(evt); + thread_destroy_event((event_t *) evt); evt = NULL; } - scsi_mutex_close(); + scsi_mutex(0); x54x_log("%s: Callback: polling stopped.\n", dev->name); } void -x54x_busy_set(void) +x54x_busy(uint8_t set) { - busy = 1; + busy = !!set; + if (!set) + thread_set_event((event_t *) poll_complete); } @@ -1363,16 +1369,8 @@ x54x_thread_start(x54x_t *dev) } -void -x54x_busy_clear(void) -{ - busy = 0; - x54x_log("Thread set event - poll complete\n"); - thread_set_event(poll_complete); -} - uint8_t -x54x_busy(void) +x54x_is_busy(void) { return !!busy; } @@ -1525,32 +1523,32 @@ x54x_out(uint16_t port, uint8_t val, void *priv) switch (port & 3) { case 0: if ((val & CTRL_HRST) || (val & CTRL_SRST)) { - x54x_busy_set(); + x54x_busy(1); reset = (val & CTRL_HRST); x54x_log("Reset completed = %x\n", reset); x54x_reset_ctrl(dev, reset); x54x_log("Controller reset: "); - x54x_busy_clear(); + x54x_busy(0); break; } if (val & CTRL_IRST) { - x54x_busy_set(); + x54x_busy(1); clear_irq(dev); x54x_log("Interrupt reset: "); - x54x_busy_clear(); + x54x_busy(0); } break; case 1: /* Fast path for the mailbox execution command. */ if ((val == CMD_START_SCSI) && (dev->Command == 0xff)) { - x54x_busy_set(); + x54x_busy(1); dev->MailboxReq++; x54x_thread_start(dev); x54x_log("Start SCSI command: "); - x54x_busy_clear(); + x54x_busy(0); return; } if (dev->ven_fast_cmds) { @@ -1617,7 +1615,7 @@ x54x_out(uint16_t port, uint8_t val, void *priv) break; case CMD_MBINIT: /* mailbox initialization */ - x54x_busy_set(); + x54x_busy(1); dev->Mbx24bit = 1; mbi = (MailboxInit_t *)dev->CmdBuf; @@ -1636,7 +1634,7 @@ x54x_out(uint16_t port, uint8_t val, void *priv) dev->Status &= ~STAT_INIT; dev->DataReplyLeft = 0; x54x_log("Mailbox init: "); - x54x_busy_clear(); + x54x_busy(0); break; case CMD_BIOSCMD: /* execute BIOS */ @@ -1972,7 +1970,7 @@ x54x_init(device_t *info) timer_add(x54x_reset_poll, &dev->ResetCB, &dev->ResetCB, dev); - scsi_mutex_init(); + scsi_mutex(1); poll_complete = thread_create_event(); @@ -1998,21 +1996,21 @@ x54x_close(void *priv) free(dev->ven_data); if (poll_tid) { - thread_kill(poll_tid); + thread_kill((thread_t *) poll_tid); poll_tid = NULL; } if (poll_complete) { - thread_destroy_event(poll_complete); + thread_destroy_event((event_t *) poll_complete); poll_complete = NULL; } if (evt) { - thread_destroy_event(evt); + thread_destroy_event((event_t *) evt); evt = NULL; } - scsi_mutex_close(); + scsi_mutex(0); if (dev->nvr != NULL) free(dev->nvr); diff --git a/src/scsi/scsi_x54x.h b/src/scsi/scsi_x54x.h index f02c8e9e5..86b1ffde0 100644 --- a/src/scsi/scsi_x54x.h +++ b/src/scsi/scsi_x54x.h @@ -492,10 +492,9 @@ typedef struct extern void x54x_reset_ctrl(x54x_t *dev, uint8_t Reset); -extern void x54x_busy_set(void); +extern void x54x_busy(uint8_t set); extern void x54x_thread_start(x54x_t *dev); -extern void x54x_busy_clear(void); -extern uint8_t x54x_busy(void); +extern uint8_t x54x_is_busy(void); extern void x54x_buf_alloc(uint8_t id, uint8_t lun, int length); extern void x54x_buf_free(uint8_t id, uint8_t lun); extern uint8_t x54x_mbo_process(x54x_t *dev);