diff --git a/src/sbbs3/sbbsexec.c b/src/sbbs3/sbbsexec.c index e09f15fbb040f77c0bff9b37e763bb1f33979ef4..56b6711422f455b0466fa36342569aa357d70151 100644 --- a/src/sbbs3/sbbsexec.c +++ b/src/sbbs3/sbbsexec.c @@ -192,8 +192,17 @@ void set_interrupt_pending(BYTE intr, BOOL assert) void _cdecl interrupt_thread(void *arg) { + HANDLE handles[] = {interrupt_event, hungup_event}; while(1) { - if(WaitForSingleObject(interrupt_event,INFINITE)!=WAIT_OBJECT_0) + DWORD handle_count = (uart_msr_reg & UART_MSR_DCD) ? 2 : 1; + DWORD result = WaitForMultipleObjects(handle_count, handles, /* waitAll */FALSE, INFINITE); + if(result == WAIT_OBJECT_0 + 1) { + lprintf(LOG_DEBUG, "Hangup detected in " __FUNCTION__); + uart_msr_reg &=~ UART_MSR_DCD; + assert_interrupt(UART_IER_MODEM_STATUS); + continue; + } + if(result != WAIT_OBJECT_0) break; if((uart_ier_reg&pending_interrupts) != 0) { lprintf(LOG_DEBUG,"VDDSimulateInterrupt (pending: %02X) - IER: %02X"