57 lines
898 B
C
57 lines
898 B
C
// TODO: CHECK/REPLACE/UPDATE OLD CODE (this file is based on xv6)
|
|
// Sleeping locks
|
|
|
|
#include "types.h"
|
|
#include "riscv.h"
|
|
#include "defs.h"
|
|
#include "param.h"
|
|
#include "memlayout.h"
|
|
#include "sched.h"
|
|
#include "proc.h"
|
|
#include "sched.h"
|
|
|
|
void
|
|
initsleeplock(sched_sleeplock_t *lk, char *name)
|
|
{
|
|
initlock(&lk->spin, "sleep lock");
|
|
lk->debugstring = name;
|
|
lk->islocked = 0;
|
|
lk->pid = 0;
|
|
}
|
|
|
|
void
|
|
acquiresleep(sched_sleeplock_t *lk)
|
|
{
|
|
acquire(&lk->spin);
|
|
while (lk->islocked) {
|
|
sleep(lk, &lk->spin);
|
|
}
|
|
lk->islocked = 1;
|
|
lk->pid = myproc()->pid;
|
|
release(&lk->spin);
|
|
}
|
|
|
|
void
|
|
releasesleep(sched_sleeplock_t *lk)
|
|
{
|
|
acquire(&lk->spin);
|
|
lk->islocked = 0;
|
|
lk->pid = 0;
|
|
sched_wake(lk);
|
|
release(&lk->spin);
|
|
}
|
|
|
|
int
|
|
holdingsleep(sched_sleeplock_t *lk)
|
|
{
|
|
int r;
|
|
|
|
acquire(&lk->spin);
|
|
r = lk->islocked && (lk->pid == myproc()->pid);
|
|
release(&lk->spin);
|
|
return r;
|
|
}
|
|
|
|
|
|
|