1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use crate::system::*;
use crate::*;
static mut SYSTEM_TIME: SystemTime = 0;
pub fn supply_time_tick(tick: RelativeTime) {
let _sc = SystemCall::new();
task::supply_time_tick_for_timeout(tick);
unsafe {
SYSTEM_TIME = SYSTEM_TIME.wrapping_add(tick as SystemTime);
}
}
pub fn set_system_time(systime: SystemTime) {
let _sc = SystemCall::new();
unsafe {
SYSTEM_TIME = systime;
}
}
pub fn system_time() -> SystemTime {
let _sc = SystemCall::new();
unsafe { SYSTEM_TIME }
}
pub fn sleep(time: RelativeTime) {
if time > 0 {
let _sc = SystemCall::new();
let task = current_task().unwrap();
task.detach_from_queue(); task.attach_to_timeout(time); set_dispatch_reserve_flag();
}
}
pub struct Rate {
next_time: SystemTime,
interval: RelativeTime,
}
impl Rate {
pub fn new(interval: RelativeTime) -> Self {
Rate {
next_time: system_time(),
interval: interval,
}
}
pub fn reset(&mut self) {
self.next_time = system_time();
}
pub fn sleep(&mut self) {
let cur_time = system_time();
loop {
let sleep_time = self.next_time.wrapping_sub(cur_time);
self.next_time = self.next_time.wrapping_add(self.interval as SystemTime);
if sleep_time > 0 && sleep_time <= self.interval as SystemTime {
sleep(sleep_time as RelativeTime);
break;
}
}
}
}