diff --git a/Kernel/Core/sync/mutex.rs b/Kernel/Core/sync/mutex.rs index 48b72a504f2242376b53f3320ce65609cf3bb448..bdc2ae7c2d911e016e26d8e90d44008617138a68 100644 --- a/Kernel/Core/sync/mutex.rs +++ b/Kernel/Core/sync/mutex.rs @@ -18,6 +18,7 @@ pub struct Mutex<T: Send> pub struct MutexInner { held: bool, + holder: ::threads::ThreadID, queue: ::threads::WaitQueue, } @@ -44,6 +45,7 @@ impl<T: Send> Mutex<T> Mutex { inner: ::sync::Spinlock::new(MutexInner { held: false, + holder: 0, queue: ::threads::WaitQueue::new(), }), val: ::core::cell::UnsafeCell::new(val), @@ -59,14 +61,17 @@ impl<T: Send> Mutex<T> let mut lh = self.inner.lock(); if lh.held != false { + assert!(lh.holder != ::threads::get_thread_id(), "Recursive lock of {}", type_name!(Self)); // If mutex is locked, then wait for it to be unlocked // - ThreadList::wait will release the passed spinlock waitqueue_wait_ext!(lh, .queue); // lh.queue.wait(lh); // << Trips borrowck + self.inner.lock().holder = ::threads::get_thread_id(); } else { lh.held = true; + lh.holder = ::threads::get_thread_id(); } } ::core::sync::atomic::fence(::core::sync::atomic::Ordering::Acquire); diff --git a/Kernel/Core/threads/mod.rs b/Kernel/Core/threads/mod.rs index 235628a81b870e95250db15762bf7960737a085d..ea83022386077f37ed1d4c1c31fd69dc513746ec 100644 --- a/Kernel/Core/threads/mod.rs +++ b/Kernel/Core/threads/mod.rs @@ -13,7 +13,7 @@ mod worker_thread; mod sleep_object; -pub use self::thread::{Thread,ThreadPtr}; +pub use self::thread::{Thread,ThreadPtr,ThreadID}; pub use self::thread::{ThreadHandle,ProcessHandle}; pub use self::thread::new_idle_thread;