Changes in kernel/generic/src/time/clock.c [eda43238:6f7071b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/time/clock.c
reda43238 r6f7071b 1 1 /* 2 2 * Copyright (c) 2001-2004 Jakub Jermar 3 * Copyright (c) 2022 Jiří Zárevúcky4 3 * All rights reserved. 5 4 * … … 66 65 static parea_t clock_parea; 67 66 67 /** Fragment of second 68 * 69 * For updating seconds correctly. 70 * 71 */ 72 static sysarg_t secfrag = 0; 73 68 74 /** Initialize realtime clock counter 69 75 * … … 103 109 * 104 110 * Update it only on first processor 105 */ 106 static void clock_update_counters(uint64_t current_tick) 111 * TODO: Do we really need so many write barriers? 112 * 113 */ 114 static void clock_update_counters(void) 107 115 { 108 116 if (CPU->id == 0) { 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;117 secfrag += 1000000 / HZ; 118 if (secfrag >= 1000000) { 119 secfrag -= 1000000; 120 uptime->seconds1++; 121 write_barrier(); 122 uptime->useconds = secfrag; 123 write_barrier(); 124 uptime->seconds2 = uptime->seconds1; 125 } else 126 uptime->useconds += 1000000 / HZ; 119 127 } 120 128 } … … 139 147 { 140 148 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);146 149 147 150 /* Account CPU usage */ … … 153 156 * 154 157 */ 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; 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(); 163 164 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); 164 188 } 165 189 166 list_remove(cur);167 timeout_handler_t handler = timeout->handler;168 void *arg = timeout->arg;169 170 190 irq_spinlock_unlock(&CPU->timeoutlock, false); 171 172 handler(arg);173 174 irq_spinlock_lock(&CPU->timeoutlock, false);175 191 } 176 177 irq_spinlock_unlock(&CPU->timeoutlock, false); 192 CPU->missed_clock_ticks = 0; 178 193 179 194 /*
Note:
See TracChangeset
for help on using the changeset viewer.