slkern/sleeplock.c

57 lines
898 B
C
Raw Normal View History

// 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;
}