sleeplock files
This commit is contained in:
parent
dec637bc59
commit
564a1cf0cb
56
sleeplock.c
Normal file
56
sleeplock.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// Sleeping locks
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "defs.h"
|
||||||
|
#include "param.h"
|
||||||
|
#include "x86.h"
|
||||||
|
#include "memlayout.h"
|
||||||
|
#include "mmu.h"
|
||||||
|
#include "proc.h"
|
||||||
|
#include "spinlock.h"
|
||||||
|
#include "sleeplock.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
initsleeplock(struct sleeplock *lk, char *name)
|
||||||
|
{
|
||||||
|
initlock(&lk->lk, "sleep lock");
|
||||||
|
lk->name = name;
|
||||||
|
lk->locked = 0;
|
||||||
|
lk->pid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
acquiresleep(struct sleeplock *lk)
|
||||||
|
{
|
||||||
|
acquire(&lk->lk);
|
||||||
|
while (lk->locked) {
|
||||||
|
sleep(lk, &lk->lk);
|
||||||
|
}
|
||||||
|
lk->locked = 1;
|
||||||
|
lk->pid = proc->pid;
|
||||||
|
release(&lk->lk);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
releasesleep(struct sleeplock *lk)
|
||||||
|
{
|
||||||
|
acquire(&lk->lk);
|
||||||
|
lk->locked = 0;
|
||||||
|
lk->pid = 0;
|
||||||
|
wakeup(lk);
|
||||||
|
release(&lk->lk);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
holdingsleep(struct sleeplock *lk)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
acquire(&lk->lk);
|
||||||
|
r = lk->locked;
|
||||||
|
release(&lk->lk);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
10
sleeplock.h
Normal file
10
sleeplock.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// Long-term locks for processes
|
||||||
|
struct sleeplock {
|
||||||
|
uint locked; // Is the lock held?
|
||||||
|
struct spinlock lk; // spinlock protecting this sleep lock
|
||||||
|
|
||||||
|
// For debugging:
|
||||||
|
char *name; // Name of lock.
|
||||||
|
int pid; // Process holding lock
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in a new issue