⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spinlock.c

📁 类unix x86平台的简单操作系统
💻 C
字号:
// Mutual exclusion spin locks.#include "types.h"#include "defs.h"#include "x86.h"#include "mmu.h"#include "param.h"#include "proc.h"#include "spinlock.h"extern int use_console_lock;voidinitlock(struct spinlock *lock, char *name){  lock->name = name;  lock->locked = 0;  lock->cpu = 0xffffffff;}// Record the current call stack in pcs[] by following the %ebp chain.voidgetcallerpcs(void *v, uint pcs[]){  uint *ebp = (uint*)v - 2;  int i;  for(i = 0; i < 10; i++){    if(ebp == 0 || ebp == (uint*)0xffffffff)      break;    pcs[i] = ebp[1];     // saved %eip    ebp = (uint*)ebp[0]; // saved %ebp  }  for(; i < 10; i++)    pcs[i] = 0;}// Acquire the lock.// Loops (spins) until the lock is acquired.// (Because contention is handled by spinning, must not// go to sleep holding any locks.)voidacquire(struct spinlock *lock){  if(holding(lock))    panic("acquire");  if(cpus[cpu()].nlock == 0)    cli();  cpus[cpu()].nlock++;  while(cmpxchg(0, 1, &lock->locked) == 1)    ;  // Serialize instructions: now that lock is acquired, make sure   // we wait for all pending writes from other processors.  cpuid(0, 0, 0, 0, 0);  // memory barrier (see Ch 7, IA-32 manual vol 3)    // Record info about lock acquisition for debugging.  // The +10 is only so that we can tell the difference  // between forgetting to initialize lock->cpu  // and holding a lock on cpu 0.  lock->cpu = cpu() + 10;  getcallerpcs(&lock, lock->pcs);}// Release the lock.voidrelease(struct spinlock *lock){  if(!holding(lock))    panic("release");  lock->pcs[0] = 0;  lock->cpu = 0xffffffff;    // Serialize instructions: before unlocking the lock, make sure  // to flush any pending memory writes from this processor.  cpuid(0, 0, 0, 0, 0);  // memory barrier (see Ch 7, IA-32 manual vol 3)  lock->locked = 0;  if(--cpus[cpu()].nlock == 0)    sti();}// Check whether this cpu is holding the lock.intholding(struct spinlock *lock){  return lock->locked && lock->cpu == cpu() + 10;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -