nrf/gpiote: fix irq race condition

The interrupt could fire between checking if sense=disabled and registering the waker,
in which case the future would get stuck.
This commit is contained in:
Dario Nieuwenhuis
2021-03-27 02:08:01 +01:00
parent 4ce46df160
commit 1c9f98e1b6
2 changed files with 10 additions and 15 deletions

View File

@ -1,7 +1,7 @@
use core::ptr::{self, NonNull};
use core::task::Waker;
use atomic_polyfill::{AtomicPtr, Ordering};
use atomic_polyfill::{compiler_fence, AtomicPtr, Ordering};
use crate::executor::raw::{task_from_waker, wake_task, TaskHeader};
@ -63,6 +63,7 @@ impl AtomicWaker {
pub fn register(&self, w: &Waker) {
let w = unsafe { task_from_waker(w) };
self.waker.store(w.as_ptr(), Ordering::Relaxed);
compiler_fence(Ordering::SeqCst);
}
/// Wake the registered waker, if any.