SCP: Accommodate negative sim_interval while processing event queue

As discussed in #886
This commit is contained in:
Mark Pizzolato 2020-06-15 02:29:05 -07:00
parent c062c7589d
commit 09ae6da2cc

11
scp.c
View file

@ -288,7 +288,7 @@
AIO_UNLOCK; \ AIO_UNLOCK; \
} \ } \
else \ else \
(void)0 \ (void)0
#define SZ_D(dp) (size_map[((dp)->dwidth + CHAR_BIT - 1) / CHAR_BIT]) #define SZ_D(dp) (size_map[((dp)->dwidth + CHAR_BIT - 1) / CHAR_BIT])
#define SZ_R(rp) \ #define SZ_R(rp) \
@ -11309,6 +11309,7 @@ do {
uptr = sim_clock_queue; /* get first */ uptr = sim_clock_queue; /* get first */
sim_clock_queue = uptr->next; /* remove first */ sim_clock_queue = uptr->next; /* remove first */
uptr->next = NULL; /* hygiene */ uptr->next = NULL; /* hygiene */
sim_interval -= uptr->time;
uptr->time = 0; uptr->time = 0;
if (sim_clock_queue != QUEUE_LIST_END) if (sim_clock_queue != QUEUE_LIST_END)
sim_interval += sim_clock_queue->time; sim_interval += sim_clock_queue->time;
@ -11515,9 +11516,9 @@ AIO_CANCEL(uptr);
AIO_UPDATE_QUEUE; AIO_UPDATE_QUEUE;
if (sim_clock_queue == QUEUE_LIST_END) if (sim_clock_queue == QUEUE_LIST_END)
return SCPE_OK; return SCPE_OK;
UPDATE_SIM_TIME; /* update sim time */
if (!sim_is_active (uptr)) if (!sim_is_active (uptr))
return SCPE_OK; return SCPE_OK;
UPDATE_SIM_TIME; /* update sim time */
sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Canceling Event for %s\n", sim_uname(uptr)); sim_debug (SIM_DBG_EVENT, &sim_scp_dev, "Canceling Event for %s\n", sim_uname(uptr));
nptr = QUEUE_LIST_END; nptr = QUEUE_LIST_END;
@ -12054,9 +12055,11 @@ if (sim_brk_summ & BRK_TYP_DYN_ALL)
btyp |= BRK_TYP_DYN_ALL; btyp |= BRK_TYP_DYN_ALL;
if ((bp = sim_brk_fnd_ex (loc, btyp, TRUE, spc))) { /* in table, and type match? */ if ((bp = sim_brk_fnd_ex (loc, btyp, TRUE, spc))) { /* in table, and type match? */
if (bp->time_fired[spc] == sim_time) /* already taken? */ double s_gtime = sim_gtime (); /* get time now */
if (bp->time_fired[spc] == s_gtime) /* already taken? */
return 0; return 0;
bp->time_fired[spc] = sim_time; /* remember match time */ bp->time_fired[spc] = s_gtime; /* remember match time */
if (--bp->cnt > 0) /* count > 0? */ if (--bp->cnt > 0) /* count > 0? */
return 0; return 0;
bp->cnt = 0; /* reset count */ bp->cnt = 0; /* reset count */