Merge pull request #385 from embassy-rs/remove-embassy-std
Remove embassy-std crate.
This commit is contained in:
		
						commit
						a3beb1ca3d
					
				| @ -1,10 +0,0 @@ | |||||||
| [package] |  | ||||||
| name = "embassy-std" |  | ||||||
| version = "0.1.0" |  | ||||||
| authors = ["Dario Nieuwenhuis <dirbaio@dirbaio.net>"] |  | ||||||
| edition = "2018" |  | ||||||
| 
 |  | ||||||
| [dependencies] |  | ||||||
| embassy = { version = "0.1.0", path = "../embassy", features = ["std", "time-tick-32768hz"] } |  | ||||||
| embassy-macros = { version = "0.1.0", path = "../embassy-macros", features = ["std"]} |  | ||||||
| lazy_static = "1.4.0" |  | ||||||
| @ -1,121 +0,0 @@ | |||||||
| use embassy::executor::{raw, Spawner}; |  | ||||||
| use embassy::time::driver::{AlarmHandle, Driver}; |  | ||||||
| use embassy::time::TICKS_PER_SECOND; |  | ||||||
| use std::marker::PhantomData; |  | ||||||
| use std::mem::MaybeUninit; |  | ||||||
| use std::ptr; |  | ||||||
| use std::sync::{Condvar, Mutex}; |  | ||||||
| use std::time::{Duration as StdDuration, Instant as StdInstant}; |  | ||||||
| 
 |  | ||||||
| static mut CLOCK_ZERO: MaybeUninit<StdInstant> = MaybeUninit::uninit(); |  | ||||||
| 
 |  | ||||||
| static mut ALARM_AT: u64 = u64::MAX; |  | ||||||
| static mut NEXT_ALARM_ID: u8 = 0; |  | ||||||
| 
 |  | ||||||
| struct TimeDriver; |  | ||||||
| embassy::time_driver_impl!(TimeDriver); |  | ||||||
| 
 |  | ||||||
| impl Driver for TimeDriver { |  | ||||||
|     fn now() -> u64 { |  | ||||||
|         let zero = unsafe { CLOCK_ZERO.as_ptr().read() }; |  | ||||||
|         let dur = StdInstant::now().duration_since(zero); |  | ||||||
|         dur.as_secs() * (TICKS_PER_SECOND as u64) |  | ||||||
|             + (dur.subsec_nanos() as u64) * (TICKS_PER_SECOND as u64) / 1_000_000_000 |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     unsafe fn allocate_alarm() -> Option<AlarmHandle> { |  | ||||||
|         let r = NEXT_ALARM_ID; |  | ||||||
|         NEXT_ALARM_ID += 1; |  | ||||||
|         Some(AlarmHandle::new(r)) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn set_alarm_callback(_alarm: AlarmHandle, _callback: fn(*mut ()), _ctx: *mut ()) {} |  | ||||||
| 
 |  | ||||||
|     fn set_alarm(_alarm: AlarmHandle, timestamp: u64) { |  | ||||||
|         unsafe { ALARM_AT = ALARM_AT.min(timestamp) } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| struct Signaler { |  | ||||||
|     mutex: Mutex<bool>, |  | ||||||
|     condvar: Condvar, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Signaler { |  | ||||||
|     fn new() -> Self { |  | ||||||
|         Self { |  | ||||||
|             mutex: Mutex::new(false), |  | ||||||
|             condvar: Condvar::new(), |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn wait(&self) { |  | ||||||
|         let mut signaled = self.mutex.lock().unwrap(); |  | ||||||
|         while !*signaled { |  | ||||||
|             let alarm_at = unsafe { ALARM_AT }; |  | ||||||
|             if alarm_at == u64::MAX { |  | ||||||
|                 signaled = self.condvar.wait(signaled).unwrap(); |  | ||||||
|             } else { |  | ||||||
|                 unsafe { ALARM_AT = u64::MAX }; |  | ||||||
|                 let now = TimeDriver::now(); |  | ||||||
|                 if now >= alarm_at { |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 let left = alarm_at - now; |  | ||||||
|                 let dur = StdDuration::new( |  | ||||||
|                     left / (TICKS_PER_SECOND as u64), |  | ||||||
|                     (left % (TICKS_PER_SECOND as u64) * 1_000_000_000 / (TICKS_PER_SECOND as u64)) |  | ||||||
|                         as u32, |  | ||||||
|                 ); |  | ||||||
|                 let (signaled2, timeout) = self.condvar.wait_timeout(signaled, dur).unwrap(); |  | ||||||
|                 signaled = signaled2; |  | ||||||
|                 if timeout.timed_out() { |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         *signaled = false; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fn signal(ctx: *mut ()) { |  | ||||||
|         let this = unsafe { &*(ctx as *mut Self) }; |  | ||||||
|         let mut signaled = this.mutex.lock().unwrap(); |  | ||||||
|         *signaled = true; |  | ||||||
|         this.condvar.notify_one(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pub struct Executor { |  | ||||||
|     inner: raw::Executor, |  | ||||||
|     not_send: PhantomData<*mut ()>, |  | ||||||
|     signaler: Signaler, |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Executor { |  | ||||||
|     pub fn new() -> Self { |  | ||||||
|         unsafe { |  | ||||||
|             CLOCK_ZERO.as_mut_ptr().write(StdInstant::now()); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         Self { |  | ||||||
|             inner: raw::Executor::new(Signaler::signal, ptr::null_mut()), |  | ||||||
|             not_send: PhantomData, |  | ||||||
|             signaler: Signaler::new(), |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// Runs the executor.
 |  | ||||||
|     ///
 |  | ||||||
|     /// This function never returns.
 |  | ||||||
|     pub fn run(&'static mut self, init: impl FnOnce(Spawner)) -> ! { |  | ||||||
|         self.inner.set_signal_ctx(&self.signaler as *const _ as _); |  | ||||||
| 
 |  | ||||||
|         init(unsafe { self.inner.spawner() }); |  | ||||||
| 
 |  | ||||||
|         loop { |  | ||||||
|             unsafe { self.inner.run_queued() }; |  | ||||||
|             self.signaler.wait(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user