aboutsummaryrefslogtreecommitdiff
path: root/sim/common/sim-events.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>1997-10-24 05:53:01 +0000
committerAndrew Cagney <cagney@redhat.com>1997-10-24 05:53:01 +0000
commit4a203fbae2c805f42fa2b0acb00a18b80056e2f1 (patch)
tree9257f4dbf20a1c3da43087eb6a942be43bf87f34 /sim/common/sim-events.c
parent1315b4cb60e55c983ca2dac72b239cd9bc72bf9d (diff)
downloadgdb-4a203fbae2c805f42fa2b0acb00a18b80056e2f1.zip
gdb-4a203fbae2c805f42fa2b0acb00a18b80056e2f1.tar.gz
gdb-4a203fbae2c805f42fa2b0acb00a18b80056e2f1.tar.bz2
Add function sim_events_slip()
Clear work_pending flag as part of processing any pending work.
Diffstat (limited to 'sim/common/sim-events.c')
-rw-r--r--sim/common/sim-events.c62
1 files changed, 46 insertions, 16 deletions
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];