aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/process/do_process.cpp12
-rw-r--r--src/process/timer.cpp4
-rw-r--r--src/process/work.cpp4
3 files changed, 20 insertions, 0 deletions
diff --git a/src/process/do_process.cpp b/src/process/do_process.cpp
index cb7c672..eaef7f1 100644
--- a/src/process/do_process.cpp
+++ b/src/process/do_process.cpp
@@ -490,6 +490,10 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time
}
pop_consumer(cpu);
t = timer->done(time, tmr);
+ if (t == ~0ULL) {
+ timer->fire(first_stamp, tmr);
+ t = timer->done(time, tmr);
+ }
consumer_child_time(cpu, t);
}
else if (strcmp(event->name, "hrtimer_expire_entry") == 0) {
@@ -532,6 +536,10 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time
pop_consumer(cpu);
t = timer->done(time, tmr);
+ if (t == ~0ULL) {
+ timer->fire(first_stamp, tmr);
+ t = timer->done(time, tmr);
+ }
consumer_child_time(cpu, t);
}
else if (strcmp(event->name, "workqueue_execute_start") == 0) {
@@ -575,6 +583,10 @@ void perf_process_bundle::handle_trace_point(void *trace, int cpu, uint64_t time
}
pop_consumer(cpu);
t = work->done(time, wk);
+ if (t == ~0ULL) {
+ work->fire(first_stamp, wk);
+ t = work->done(time, wk);
+ }
consumer_child_time(cpu, t);
}
else if (strcmp(event->name, "cpu_idle") == 0) {
diff --git a/src/process/timer.cpp b/src/process/timer.cpp
index 8917490..1ca8c25 100644
--- a/src/process/timer.cpp
+++ b/src/process/timer.cpp
@@ -79,6 +79,9 @@ uint64_t timer::done(uint64_t time, uint64_t timer_struct)
{
int64_t delta;
+ if (running_since.find(timer_struct) == running_since.end())
+ return ~0ULL;
+
if (running_since[timer_struct] > time)
return 0;
@@ -147,6 +150,7 @@ void clear_timers(void)
all_timers.erase(it);
it = all_timers.begin();
}
+ running_since.clear();
}
bool timer::is_deferred(void)
diff --git a/src/process/work.cpp b/src/process/work.cpp
index 82f13a2..e62e5d3 100644
--- a/src/process/work.cpp
+++ b/src/process/work.cpp
@@ -56,6 +56,9 @@ uint64_t work::done(uint64_t time, uint64_t work_struct)
{
int64_t delta;
+ if (running_since.find(work_struct) == running_since.end())
+ return ~0ULL;
+
if (running_since[work_struct] > time)
return 0;
@@ -102,6 +105,7 @@ void clear_work(void)
all_work.erase(it);
it = all_work.begin();
}
+ running_since.clear();
}