diff --git a/sim_timer.c b/sim_timer.c index bff008b7..1e5afff7 100644 --- a/sim_timer.c +++ b/sim_timer.c @@ -1452,14 +1452,19 @@ return inst_per_sec; t_stat sim_timer_activate_after (UNIT *uptr, int32 usec_delay) { -int32 inst_delay; -double inst_per_sec; +int inst_delay; +double inst_delay_d, inst_per_sec; AIO_VALIDATE; if (sim_is_active (uptr)) /* already active? */ return SCPE_OK; inst_per_sec = sim_timer_inst_per_sec (); -inst_delay = (int32)((inst_per_sec*usec_delay)/1000000.0); +inst_delay_d = ((inst_per_sec*usec_delay)/1000000.0); +/* Bound delay to avoid overflow. */ +/* Long delays are usually canceled before they expire */ +if (inst_delay_d > (double)0x7fffffff) + inst_delay_d = (double)0x7fffffff; +inst_delay = (int32)inst_delay_d; #if defined(SIM_ASYNCH_IO) && defined(SIM_ASYNCH_CLOCKS) if ((sim_calb_tmr == -1) || /* if No timer initialized */ (inst_delay < rtc_currd[sim_calb_tmr]) || /* or sooner than next clock tick? */