51 lines
1 KiB
C
51 lines
1 KiB
C
#ifndef KERNEL_Spinlock_H
|
|
#define KERNEL_Spinlock_H
|
|
|
|
#include "types.h"
|
|
|
|
/** 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.
|
|
};
|
|
|
|
/**
|
|
* 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);
|
|
|
|
#endif
|