aboutsummaryrefslogtreecommitdiff
path: root/embassy-std
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-09-02 14:32:53 +0200
committerDario Nieuwenhuis <[email protected]>2021-09-02 14:32:53 +0200
commitead62394359787fd0aa6af7be4315c27735cb293 (patch)
treeafadd90c9afdb8f12fe3af5915e6a8c67ed3c9d6 /embassy-std
parentd0c87493996cd5a80ad02533a888eef47fb94ba3 (diff)
Remove embassy-std crate.
All std features are in the core `embassy` crate.
Diffstat (limited to 'embassy-std')
-rw-r--r--embassy-std/Cargo.toml10
-rw-r--r--embassy-std/src/lib.rs121
2 files changed, 0 insertions, 131 deletions
diff --git a/embassy-std/Cargo.toml b/embassy-std/Cargo.toml
deleted file mode 100644
index 2633f1232..000000000
--- a/embassy-std/Cargo.toml
+++ /dev/null
@@ -1,10 +0,0 @@
1[package]
2name = "embassy-std"
3version = "0.1.0"
4authors = ["Dario Nieuwenhuis <[email protected]>"]
5edition = "2018"
6
7[dependencies]
8embassy = { version = "0.1.0", path = "../embassy", features = ["std", "time-tick-32768hz"] }
9embassy-macros = { version = "0.1.0", path = "../embassy-macros", features = ["std"]}
10lazy_static = "1.4.0"
diff --git a/embassy-std/src/lib.rs b/embassy-std/src/lib.rs
deleted file mode 100644
index d85137e9a..000000000
--- a/embassy-std/src/lib.rs
+++ /dev/null
@@ -1,121 +0,0 @@
1use embassy::executor::{raw, Spawner};
2use embassy::time::driver::{AlarmHandle, Driver};
3use embassy::time::TICKS_PER_SECOND;
4use std::marker::PhantomData;
5use std::mem::MaybeUninit;
6use std::ptr;
7use std::sync::{Condvar, Mutex};
8use std::time::{Duration as StdDuration, Instant as StdInstant};
9
10static mut CLOCK_ZERO: MaybeUninit<StdInstant> = MaybeUninit::uninit();
11
12static mut ALARM_AT: u64 = u64::MAX;
13static mut NEXT_ALARM_ID: u8 = 0;
14
15struct TimeDriver;
16embassy::time_driver_impl!(TimeDriver);
17
18impl Driver for TimeDriver {
19 fn now() -> u64 {
20 let zero = unsafe { CLOCK_ZERO.as_ptr().read() };
21 let dur = StdInstant::now().duration_since(zero);
22 dur.as_secs() * (TICKS_PER_SECOND as u64)
23 + (dur.subsec_nanos() as u64) * (TICKS_PER_SECOND as u64) / 1_000_000_000
24 }
25
26 unsafe fn allocate_alarm() -> Option<AlarmHandle> {
27 let r = NEXT_ALARM_ID;
28 NEXT_ALARM_ID += 1;
29 Some(AlarmHandle::new(r))
30 }
31
32 fn set_alarm_callback(_alarm: AlarmHandle, _callback: fn(*mut ()), _ctx: *mut ()) {}
33
34 fn set_alarm(_alarm: AlarmHandle, timestamp: u64) {
35 unsafe { ALARM_AT = ALARM_AT.min(timestamp) }
36 }
37}
38
39struct Signaler {
40 mutex: Mutex<bool>,
41 condvar: Condvar,
42}
43
44impl Signaler {
45 fn new() -> Self {
46 Self {
47 mutex: Mutex::new(false),
48 condvar: Condvar::new(),
49 }
50 }
51
52 fn wait(&self) {
53 let mut signaled = self.mutex.lock().unwrap();
54 while !*signaled {
55 let alarm_at = unsafe { ALARM_AT };
56 if alarm_at == u64::MAX {
57 signaled = self.condvar.wait(signaled).unwrap();
58 } else {
59 unsafe { ALARM_AT = u64::MAX };
60 let now = TimeDriver::now();
61 if now >= alarm_at {
62 break;
63 }
64
65 let left = alarm_at - now;
66 let dur = StdDuration::new(
67 left / (TICKS_PER_SECOND as u64),
68 (left % (TICKS_PER_SECOND as u64) * 1_000_000_000 / (TICKS_PER_SECOND as u64))
69 as u32,
70 );
71 let (signaled2, timeout) = self.condvar.wait_timeout(signaled, dur).unwrap();
72 signaled = signaled2;
73 if timeout.timed_out() {
74 break;
75 }
76 }
77 }
78 *signaled = false;
79 }
80
81 fn signal(ctx: *mut ()) {
82 let this = unsafe { &*(ctx as *mut Self) };
83 let mut signaled = this.mutex.lock().unwrap();
84 *signaled = true;
85 this.condvar.notify_one();
86 }
87}
88
89pub struct Executor {
90 inner: raw::Executor,
91 not_send: PhantomData<*mut ()>,
92 signaler: Signaler,
93}
94
95impl Executor {
96 pub fn new() -> Self {
97 unsafe {
98 CLOCK_ZERO.as_mut_ptr().write(StdInstant::now());
99 }
100
101 Self {
102 inner: raw::Executor::new(Signaler::signal, ptr::null_mut()),
103 not_send: PhantomData,
104 signaler: Signaler::new(),
105 }
106 }
107
108 /// Runs the executor.
109 ///
110 /// This function never returns.
111 pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! {
112 self.inner.set_signal_ctx(&self.signaler as *const _ as _);
113
114 init(unsafe { self.inner.spawner() });
115
116 loop {
117 unsafe { self.inner.run_queued() };
118 self.signaler.wait();
119 }
120 }
121}