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(); task.attach_to_timeout(time); 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 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}