Changes in kernel/generic/src/time/clock.c [6f7071b:eda43238] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/time/clock.c
r6f7071b reda43238 1 1 /* 2 2 * Copyright (c) 2001-2004 Jakub Jermar 3 * Copyright (c) 2022 Jiří Zárevúcky 3 4 * All rights reserved. 4 5 * … … 65 66 static parea_t clock_parea; 66 67 67 /** Fragment of second68 *69 * For updating seconds correctly.70 *71 */72 static sysarg_t secfrag = 0;73 74 68 /** Initialize realtime clock counter 75 69 * … … 109 103 * 110 104 * Update it only on first processor 111 * TODO: Do we really need so many write barriers? 112 * 113 */ 114 static void clock_update_counters(void) 105 */ 106 static void clock_update_counters(uint64_t current_tick) 115 107 { 116 108 if (CPU->id == 0) { 117 secfrag += 1000000 / HZ;118 if (secfrag >= 1000000) { 119 secfrag -=1000000;120 uptime->seconds1++;121 write_barrier(); 122 uptime->useconds = secfrag;123 124 uptime->seconds2 = uptime->seconds1;125 } else126 uptime->useconds += 1000000 / HZ;109 uint64_t usec = (1000000 / HZ) * current_tick; 110 111 sysarg_t secs = usec / 1000000; 112 sysarg_t usecs = usec % 1000000; 113 114 uptime->seconds1 = secs; 115 write_barrier(); 116 uptime->useconds = usecs; 117 write_barrier(); 118 uptime->seconds2 = secs; 127 119 } 128 120 } … … 147 139 { 148 140 size_t missed_clock_ticks = CPU->missed_clock_ticks; 141 CPU->missed_clock_ticks = 0; 142 143 CPU->current_clock_tick += missed_clock_ticks + 1; 144 uint64_t current_clock_tick = CPU->current_clock_tick; 145 clock_update_counters(current_clock_tick); 149 146 150 147 /* Account CPU usage */ … … 156 153 * 157 154 */ 158 size_t i; 159 for (i = 0; i <= missed_clock_ticks; i++) { 160 /* Update counters and accounting */ 161 clock_update_counters(); 162 cpu_update_accounting(); 155 156 irq_spinlock_lock(&CPU->timeoutlock, false); 157 158 link_t *cur; 159 while ((cur = list_first(&CPU->timeout_active_list)) != NULL) { 160 timeout_t *timeout = list_get_instance(cur, timeout_t, link); 161 162 if (current_clock_tick <= timeout->deadline) { 163 break; 164 } 165 166 list_remove(cur); 167 timeout_handler_t handler = timeout->handler; 168 void *arg = timeout->arg; 169 170 irq_spinlock_unlock(&CPU->timeoutlock, false); 171 172 handler(arg); 163 173 164 174 irq_spinlock_lock(&CPU->timeoutlock, false); 165 166 link_t *cur;167 while ((cur = list_first(&CPU->timeout_active_list)) != NULL) {168 timeout_t *timeout = list_get_instance(cur, timeout_t,169 link);170 171 irq_spinlock_lock(&timeout->lock, false);172 if (timeout->ticks-- != 0) {173 irq_spinlock_unlock(&timeout->lock, false);174 break;175 }176 177 list_remove(cur);178 timeout_handler_t handler = timeout->handler;179 void *arg = timeout->arg;180 timeout_reinitialize(timeout);181 182 irq_spinlock_unlock(&timeout->lock, false);183 irq_spinlock_unlock(&CPU->timeoutlock, false);184 185 handler(arg);186 187 irq_spinlock_lock(&CPU->timeoutlock, false);188 }189 190 irq_spinlock_unlock(&CPU->timeoutlock, false);191 175 } 192 CPU->missed_clock_ticks = 0; 176 177 irq_spinlock_unlock(&CPU->timeoutlock, false); 193 178 194 179 /*
Note:
See TracChangeset
for help on using the changeset viewer.