52 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
#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.
 | 
						|
};
 |