pudding_kernel/
time.rs

1use crate::system::*;
2use crate::*;
3
4static mut SYSTEM_TIME: SystemTime = 0;
5
6pub fn supply_time_tick(tick: RelativeTime) {
7    let _sc = SystemCall::new();
8    task::supply_time_tick_for_timeout(tick);
9    unsafe {
10        SYSTEM_TIME = SYSTEM_TIME.wrapping_add(tick as SystemTime);
11    }
12}
13
14pub fn set_system_time(systime: SystemTime) {
15    let _sc = SystemCall::new();
16    unsafe {
17        SYSTEM_TIME = systime;
18    }
19}
20
21pub fn system_time() -> SystemTime {
22    let _sc = SystemCall::new();
23    unsafe { SYSTEM_TIME }
24}
25
26pub fn sleep(time: RelativeTime) {
27    if time > 0 {
28        let _sc = SystemCall::new();
29        let task = current_task().unwrap();
30        task.detach_from_queue(); // レディーキューから取り外す
31        task.attach_to_timeout(time); // タイムアウトキューに繋ぐ
32        set_dispatch_reserve_flag();
33    }
34}
35
36pub struct Rate {
37    next_time: SystemTime,
38    interval: RelativeTime,
39}
40
41impl Rate {
42    pub fn new(interval: RelativeTime) -> Self {
43        Rate {
44            next_time: system_time(),
45            interval: interval,
46        }
47    }
48
49    // もし set_system_time した場合は必ず呼ぶこと
50    pub fn reset(&mut self) {
51        self.next_time = system_time();
52    }
53
54    pub fn sleep(&mut self) {
55        let cur_time = system_time();
56        loop {
57            let sleep_time = self.next_time.wrapping_sub(cur_time);
58            self.next_time = self.next_time.wrapping_add(self.interval as SystemTime);
59            if sleep_time > 0 && sleep_time <= self.interval as SystemTime {
60                sleep(sleep_time as RelativeTime);
61                break;
62            }
63        }
64    }
65}