1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-30 00:00:15 +01:00

update timer after updating the timer list

- revise code, increase the readability
This commit is contained in:
Stefan Lankes 2018-04-29 23:50:02 +02:00
parent c745503102
commit 807c210111
2 changed files with 22 additions and 16 deletions

View file

@ -55,7 +55,7 @@ void check_ticks(void)
if (!cpu_freq) if (!cpu_freq)
return; return;
const uint64_t curr_rdtsc = has_rdtscp() ? rdtscp(NULL) : rdtsc(); const uint64_t curr_rdtsc = rdtsc();
rmb(); rmb();
const uint64_t diff_cycles = curr_rdtsc - per_core(last_rdtsc); const uint64_t diff_cycles = curr_rdtsc - per_core(last_rdtsc);
@ -65,7 +65,7 @@ void check_ticks(void)
if (diff_ticks > 0) { if (diff_ticks > 0) {
set_per_core(timer_ticks, per_core(timer_ticks) + diff_ticks); set_per_core(timer_ticks, per_core(timer_ticks) + diff_ticks);
set_per_core(last_rdtsc, curr_rdtsc); set_per_core(last_rdtsc, curr_rdtsc);
rmb(); mb();
} }
} }
#endif #endif
@ -99,8 +99,11 @@ static void timer_handler(struct state *s)
int timer_wait(unsigned int ticks) int timer_wait(unsigned int ticks)
{ {
uint64_t eticks = per_core(timer_ticks) + ticks; #ifdef DYNAMIC_TICKS
check_ticks();
#endif
uint64_t eticks = per_core(timer_ticks) + ticks;
task_t* curr_task = per_core(current_task); task_t* curr_task = per_core(current_task);
if (curr_task->status == TASK_IDLE) if (curr_task->status == TASK_IDLE)
@ -119,12 +122,8 @@ int timer_wait(unsigned int ticks)
PAUSE; PAUSE;
} }
} else if (per_core(timer_ticks) < eticks) { } else if (per_core(timer_ticks) < eticks) {
check_workqueues(); set_timer(eticks);
reschedule();
if (per_core(timer_ticks) < eticks) {
set_timer(eticks);
reschedule();
}
} }
return 0; return 0;

View file

@ -74,7 +74,7 @@ DEFINE_PER_CORE(uint32_t, __core_id, 0);
static void update_timer(task_t* first) static void update_timer(task_t* first)
{ {
if(first) { if (first) {
if(first->timeout > get_clock_tick()) { if(first->timeout > get_clock_tick()) {
timer_deadline((uint32_t) (first->timeout - get_clock_tick())); timer_deadline((uint32_t) (first->timeout - get_clock_tick()));
} else { } else {
@ -120,9 +120,9 @@ static void timer_queue_push(uint32_t core_id, task_t* task)
timer_queue->first = timer_queue->last = task; timer_queue->first = timer_queue->last = task;
task->next = task->prev = NULL; task->next = task->prev = NULL;
#ifdef DYNAMIC_TICKS #ifdef DYNAMIC_TICKS
update_timer(task); update_timer(task);
#endif #endif
} else { } else {
// lookup position where to insert task // lookup position where to insert task
task_t* tmp = first; task_t* tmp = first;
@ -148,9 +148,9 @@ static void timer_queue_push(uint32_t core_id, task_t* task)
if(timer_queue->first == tmp) { if(timer_queue->first == tmp) {
timer_queue->first = task; timer_queue->first = task;
#ifdef DYNAMIC_TICKS #ifdef DYNAMIC_TICKS
update_timer(task); update_timer(task);
#endif #endif
} }
} }
} }
@ -793,6 +793,13 @@ void check_timers(void)
wakeup_task(task->id); wakeup_task(task->id);
} }
#ifdef DYNAMIC_TICKS
task = readyqueue->timers.first;
if (task) {
update_timer(task);
}
#endif
spinlock_irqsave_unlock(&readyqueue->lock); spinlock_irqsave_unlock(&readyqueue->lock);
} }