Tolerate race condition which results in spurious timer thread wakeups which were causing the timer thread to exit. (SIM_ASYNCH_CLOCKS)

This commit is contained in:
Mark Pizzolato 2013-05-07 11:40:07 -07:00
parent 6cf54e8341
commit 6c6d641034
2 changed files with 4 additions and 7 deletions

View file

@ -541,6 +541,7 @@ for (i=(was_stepping ? sim_rem_step_line : 0);
c = c & ~TMXR_VALID; c = c & ~TMXR_VALID;
if (c != sim_int_char) if (c != sim_int_char)
continue; /* ^E (the interrupt character) must start console interaction */ continue; /* ^E (the interrupt character) must start console interaction */
sim_is_running = 0;
sim_stop_timer_services (); sim_stop_timer_services ();
for (j=0; j < sim_rem_con_tmxr.lines; j++) { for (j=0; j < sim_rem_con_tmxr.lines; j++) {
lp = &sim_rem_con_tmxr.ldsc[j]; lp = &sim_rem_con_tmxr.ldsc[j];
@ -728,6 +729,7 @@ for (i=(was_stepping ? sim_rem_step_line : 0);
tmxr_linemsg (lp, "Simulator Running..."); tmxr_linemsg (lp, "Simulator Running...");
tmxr_send_buffered_data (lp); tmxr_send_buffered_data (lp);
} }
sim_is_running = 1;
sim_start_timer_services (); sim_start_timer_services ();
break; break;
} }

View file

@ -1250,16 +1250,11 @@ while (sim_asynch_enabled && sim_asynch_timer && sim_is_running) {
} }
else else
sim_activate (uptr, inst_delay); sim_activate (uptr, inst_delay);
continue;
} }
else /* Something wants to adjust the queue since the wait condition was signaled */ else {/* Something wants to adjust the queue since the wait condition was signaled */
if (sim_timer_event_canceled) if (sim_timer_event_canceled)
sim_timer_event_canceled = FALSE; /* reset flag and continue */ sim_timer_event_canceled = FALSE; /* reset flag and continue */
else }
if (sim_wallclock_entry == NULL) { /* nothing to insert? */
sim_debug (DBG_TIM, &sim_timer_dev, "_timer_thread() - condition wakeup without new entry\n");
break; /* stop processing entries */
}
} }
pthread_mutex_unlock (&sim_timer_lock); pthread_mutex_unlock (&sim_timer_lock);