📄 lock.c
字号:
#define _LOCK_EXTENSION#include <stdlib.h>#include <string.h>#include "../plan9/sys9.h"#include <lock.h>enum{ Pagesize = 4096, Semperpg = Pagesize/(16*sizeof(unsigned int)), Lockaddr = 0x60000000, POWER = 0x320, MAGNUM = 0x330, MAGNUMII = 0x340, R4K = 0x500,};static int arch;extern int C_3ktas(int*);extern int C_4ktas(int*);extern int C_fcr0(void);static voidlockinit(void){ int n; if(arch != 0) return; /* allow multiple calls */ arch = C_fcr0(); switch(arch) { case POWER: n = _SEGATTACH(0, "lock", (void*)Lockaddr, Pagesize); if(n < 0) { arch = MAGNUM; break; } memset((void*)Lockaddr, 0, Pagesize); break; case MAGNUM: case MAGNUMII: case R4K: break; default: abort(); } }voidlock(Lock *lk){ int *hwsem; int hash;retry: switch(arch) { case 0: lockinit(); goto retry; case MAGNUM: case MAGNUMII: while(C_3ktas(&lk->val)) _SLEEP(0); return; case R4K: for(;;){ while(lk->val) ; if(C_4ktas(&lk->val) == 0) return; } break; case POWER: /* Use low order lock bits to generate hash */ hash = ((int)lk/sizeof(int)) & (Semperpg-1); hwsem = (int*)Lockaddr+hash; for(;;) { if((*hwsem & 1) == 0) { if(lk->val) *hwsem = 0; else { lk->val = 1; *hwsem = 0; return; } } while(lk->val) ; } } }intcanlock(Lock *lk){ int *hwsem; int hash;retry: switch(arch) { case 0: lockinit(); goto retry; case MAGNUM: case MAGNUMII: if(C_3ktas(&lk->val)) return 0; return 1; case R4K: if(C_4ktas(&lk->val)) return 0; return 1; case POWER: /* Use low order lock bits to generate hash */ hash = ((int)lk/sizeof(int)) & (Semperpg-1); hwsem = (int*)Lockaddr+hash; if((*hwsem & 1) == 0) { if(lk->val) *hwsem = 0; else { lk->val = 1; *hwsem = 0; return 1; } } return 0; } }voidunlock(Lock *lk){ lk->val = 0;}inttas(int *p){ int *hwsem; int hash;retry: switch(arch) { case 0: lockinit(); goto retry; case MAGNUM: case MAGNUMII: return C_3ktas(p); case R4K: return C_4ktas(p); case POWER: /* Use low order lock bits to generate hash */ hash = ((int)p/sizeof(int)) & (Semperpg-1); hwsem = (int*)Lockaddr+hash; if((*hwsem & 1) == 0) { if(*p) *hwsem = 0; else { *p = 1; *hwsem = 0; return 0; } } return 1; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -