Probleme im Zusammenhang mit Semaphoren
Philipp und ich hatten einige Fehler beim Implementieren der Semaphoren.
Mein Code, der eventuell Fehler enthält: semaphore.rs
Anmerkungen zum Code:
- Auch in der post-Fkt. wird ein neuer FifoScheduler erstellt, falls dies noch nicht passiert ist. Das ist eigentlich nicht notwendig.
- Ich denke, dass der FifoScheduler nicht durch einen InterruptSpinlock geschützt werden muss, da er schon durch den Mutex für den Zähler geschützt werden kann.
Fehler die bei dem Test "sem_test" auftreten können (Nur wenn der Timer aktiviert ist):
-
[PANIC] panicked at 'already borrowed: BorrowMutError', edu-kernel/src/scheduler/mod.rs:72:41
(Zeilennummern sind eventuell verschoben zur Vorlage)
Zeile 72:let mut task_ref = task.borrow_mut();
in der Fkt. "wakeup" -
[PANIC] panicked at 'not implemented: Interrupt handler "invalid_opcode" stack_frame = InterruptStackFrame { instruction_pointer: VirtAddr(0x216212), code_segment: 8, cpu_flags: 0x11002, stack_pointer: VirtAddr(0x483d58), stack_segment: 16, }', edu-kernel/src/arch/x86_64/interrupts.rs:133:1
Möglicherweise wird der BorrowMutError dadurch verursacht, dass ein Task auf eine RefCell (in diesem Fall einem TaskRef) die Funktion borrow() oder borrow_mut() aufruft und vor dem Beenden des Borrows vom Timer-Interrupt unterbrochen wird. Daher sollten alle (public) Fkt. im Code, die borrow() oder borrow_mut() nutzen, vor Interrupts geschützt werden.
Dies wäre z. B. pub fn spawn_prio
in edu-kernel/src/scheduler/thread.rs
, aber auch block_current_task
, get_current_stack
oder wakeup_task
in edu-kernel/src/scheduler/mod.rs
Es wäre auch nicht schlecht einen Arc für TaskRef zu verwenden: pub type TaskRef = Arc<RefCell<Task>>;
.
Mit den genannten Veränderungen scheinen die oben genannten Fehler nicht mehr aufzutreten.