diff options
-rw-r--r-- | sim/common/ChangeLog | 10 | ||||
-rw-r--r-- | sim/common/sim-events.c | 62 |
2 files changed, 56 insertions, 16 deletions
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog index 8e7f462..2c9a699 100644 --- a/sim/common/ChangeLog +++ b/sim/common/ChangeLog @@ -1,3 +1,13 @@ +Fri Oct 24 11:33:07 1997 Andrew Cagney <cagney@b1.cygnus.com> + + * sim-events.c (sim_events_process): Clear events->work_pending. + (sim_events_tickn, sim_events_tick): Accumulate, instead of + setting, nr_ticks_to_process. + (sim_events_preprocess): Allow nr_ticks_to_process to be non-zero + when the event queue isn't next. + + * sim-events.h, sim-events.c (sim_events_slip): New function. + Wed Oct 22 14:18:38 1997 Andrew Cagney <cagney@b1.cygnus.com> * sim-hload.c (sim_load): Pass lma_p==0 and do_load=sim_load. diff --git a/sim/common/sim-events.c b/sim/common/sim-events.c index 564a99d..ffda5b3 100644 --- a/sim/common/sim-events.c +++ b/sim/common/sim-events.c @@ -129,11 +129,11 @@ struct _sim_event { #if !defined (SIM_EVENTS_POLL_RATE) -#define SIM_EVENTS_POLL_RATE 0x100000 +#define SIM_EVENTS_POLL_RATE 0x1000 #endif -#define _ETRACE sd +#define _ETRACE sd, NULL #undef ETRACE #define ETRACE(ARGS) \ @@ -145,8 +145,8 @@ do \ { \ const char *file; \ SIM_FILTER_PATH (file, __FILE__); \ - sim_io_printf (sd, "%s:%d: ", file, __LINE__); \ - sim_io_printf ARGS; \ + trace_printf (sd, NULL, "%s:%d: ", file, __LINE__); \ + trace_printf ARGS; \ } \ } \ } \ @@ -892,16 +892,16 @@ INLINE_SIM_EVENTS\ sim_events_tick (SIM_DESC sd) { sim_events *events = STATE_EVENTS (sd); + SIM_ASSERT (events->nr_ticks_to_process == 0); /* this should only be called after the previous ticks have been fully processed */ - SIM_ASSERT (events->nr_ticks_to_process == 0); /* Advance the time but *only* if there is nothing to process */ if (events->work_pending || events->time_from_event == 0) { - events->nr_ticks_to_process = 1; + events->nr_ticks_to_process += 1; return 1; } else { @@ -917,17 +917,16 @@ sim_events_tickn (SIM_DESC sd, int n) { sim_events *events = STATE_EVENTS (sd); + SIM_ASSERT (n > 0); /* this should only be called after the previous ticks have been fully processed */ - SIM_ASSERT (events->nr_ticks_to_process == 0); - SIM_ASSERT (n > 0); /* Advance the time but *only* if there is nothing to process */ if (events->work_pending || events->time_from_event < n) { - events->nr_ticks_to_process = n; + events->nr_ticks_to_process += n; return 1; } else { @@ -939,21 +938,47 @@ sim_events_tickn (SIM_DESC sd, INLINE_SIM_EVENTS\ (void) +sim_events_slip (SIM_DESC sd, + int slip) +{ + sim_events *events = STATE_EVENTS (sd); + SIM_ASSERT (slip > 0); + + /* Advance either TIME_FROM_EVENT or NR_TICKS_TO_PROCESS dependant + on which is closer for this SLIP. While previous slips may have + advanced a different counter is sitll valid as the accumulative + effect is still the same. */ + if (events->time_from_event < slip) + { + events->nr_ticks_to_process += slip; + events->work_pending = 1; + } + else + { + events->time_from_event -= slip; + } +} + + +INLINE_SIM_EVENTS\ +(void) sim_events_preprocess (SIM_DESC sd, int events_were_last, int events_were_next) { sim_events *events = STATE_EVENTS(sd); - if (events->nr_ticks_to_process != 0) + if (events_were_last) { - /* Halted midway through event processing */ - ASSERT (events_were_last && events_were_next); + /* Halted part way through event processing */ + ASSERT (events->nr_ticks_to_process != 0); + /* The external world can't tell if the event that stopped the + simulator was the last event to process. */ + ASSERT (events_were_next); sim_events_process (sd); } else if (events_were_next) { /* Halted by the last processor */ - ASSERT (events->nr_ticks_to_process == 0 && !events_were_last); if (sim_events_tick (sd)) sim_events_process (sd); } @@ -969,8 +994,13 @@ sim_events_process (SIM_DESC sd) ASSERT (events->nr_ticks_to_process != 0); - /* move any events that were queued by any signal handlers onto - the real event queue. */ + /* Clear work_pending before checking nr_held. Clearing + work_pending after nr_held (with out a lock could loose an + event). */ + events->work_pending = 0; + + /* move any events that were asynchronously queued by any signal + handlers onto the real event queue. */ if (events->nr_held > 0) { int i; @@ -982,7 +1012,7 @@ sim_events_process (SIM_DESC sd) sigfillset(&new_mask); sigprocmask(SIG_SETMASK, &new_mask, &old_mask); #endif - + for (i = 0; i < events->nr_held; i++) { sim_event *entry = &events->held [i]; |