pub struct Locked<A> {
inner: Mutex<A>,
holder: AtomicI16,
}Expand description
割り込みセーフな spin::Mutex をラップし、パニック発生時のデッドロックを防止するために
ロックを現在保持している CPU コア ID の追跡記録機能を追加したラッパー構造体。
Fields§
§inner: Mutex<A>§holder: AtomicI16ロックを現在保持しているコア ID(-1 の場合は未保持)。
Implementations§
Source§impl<A> Locked<A>
impl<A> Locked<A>
Sourcepub fn lock(&self) -> LockedGuard<'_, A>
pub fn lock(&self) -> LockedGuard<'_, A>
ロックを獲得し、保持するコア ID を自動記録してガードオブジェクトを返します。
§プリエンプション禁止は不要(2026-08-05 検討済み)
一度 preempt_disable() を足したが、誤りだったので取り消した。
下の spin::Mutex::lock は取得時に割り込みを禁止する
(is_interrupt_enabled / disable_interrupts)。
割り込みが来ないのだからタイマ割り込み経由のプリエンプションも起きず、
「ロックを握ったまま切り替わって、他スレッドが空回りする」経路は存在しない。
効果が無いばかりか、preempt_disable/enable は SeqCst のアトミック
読み書きなので、全確保・全解放に余計なコストを足すだけだった。
ここは最も呼ばれる経路なので、意味の無い命令を置いてはいけない。
Sourcepub unsafe fn force_release_if_core(&self, cid: i16)
pub unsafe fn force_release_if_core(&self, cid: i16)
パニック回復時に、指定された CPU コア cid が現在このロックを保持している場合、
そのロックを強制解放してリカバリ可能にします。
§Safety
コア cid の現在実行中のタスク(スレッド)がアボートされ、その文脈が破棄される状況でのみ
安全に呼び出すことができます。
Trait Implementations§
Source§impl GlobalAlloc for Locked<TlsfHeap>
impl GlobalAlloc for Locked<TlsfHeap>
Source§unsafe fn alloc(&self, layout: Layout) -> *mut u8
unsafe fn alloc(&self, layout: Layout) -> *mut u8
Allocates memory as described by the given
layout. Read moreAuto Trait Implementations§
impl<A> !Freeze for Locked<A>
impl<A> !RefUnwindSafe for Locked<A>
impl<A> Send for Locked<A>where
A: Send,
impl<A> Sync for Locked<A>where
A: Send,
impl<A> Unpin for Locked<A>where
A: Unpin,
impl<A> UnsafeUnpin for Locked<A>where
A: UnsafeUnpin,
impl<A> UnwindSafe for Locked<A>where
A: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more