diff --git a/kernel/defs.h b/kernel/defs.h index ecbcf26..5525c43 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -2,6 +2,7 @@ #include "riscv.h" #include "types.h" +#include "spinlock.h" struct buf; struct context; @@ -9,7 +10,6 @@ struct file; struct inode; struct pipe; struct proc; -struct spinlock; struct sleeplock; struct stat; struct superblock; @@ -139,14 +139,6 @@ void procdump(void); // swtch.S void swtch(struct context *, struct context *); -// spinlock.c -void acquire(struct spinlock *); -int holding(struct spinlock *); -void initlock(struct spinlock *, char *); -void release(struct spinlock *); -void push_off(void); -void pop_off(void); - // sleeplock.c void acquiresleep(struct sleeplock *); void releasesleep(struct sleeplock *); diff --git a/kernel/spinlock.h b/kernel/spinlock.h index 779d918..8753d9c 100644 --- a/kernel/spinlock.h +++ b/kernel/spinlock.h @@ -2,10 +2,50 @@ #include "types.h" +struct spinlock; + +// spinlock.c + +/** + * Acquire the lock. + * Loops (spins) until the lock is acquired. + * Panics if the lock is already held by this cpu. + */ +void acquire(struct spinlock *); + +/** + * Check whether this cpu is holding the lock. + * Interrupts must be off. + */ +int holding(struct spinlock *); + +/** + * Initialize spinlock + */ +void initlock(struct spinlock *, char *); + +/** + * Release the lock. + * Panics if the lock is not held. + */ +void release(struct spinlock *); + +/** + * @brief push_off/pop_off are like intr_off()/intr_on() except that they are matched: + * it takes two pop_off()s to undo two push_off()s. Also, if interrupts + * are initially off, then push_off, pop_off leaves them off. + */ +void push_off(void); + +/** @copydoc pop_off */ +void pop_off(void); + /** Mutual exclusion spin lock */ struct spinlock { u32 locked; // Is the lock held? + // NOTE: Perhaps feature gate this? + // For debugging: char *name; // Name of lock. struct cpu *cpu; // The cpu holding the lock.