root/kernel/sleeplock.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. initsleeplock
  2. acquiresleep
  3. releasesleep
  4. holdingsleep

   1 // Sleeping locks
   2 
   3 #include "types.h"
   4 #include "riscv.h"
   5 #include "defs.h"
   6 #include "param.h"
   7 #include "memlayout.h"
   8 #include "spinlock.h"
   9 #include "proc.h"
  10 #include "sleeplock.h"
  11 
  12 void
  13 initsleeplock(struct sleeplock *lk, char *name)
  14 {
  15   initlock(&lk->lk, "sleep lock");
  16   lk->name = name;
  17   lk->locked = 0;
  18   lk->pid = 0;
  19 }
  20 
  21 void
  22 acquiresleep(struct sleeplock *lk)
  23 {
  24   acquire(&lk->lk);
  25   while (lk->locked) {
  26     sleep_prepare(lk);
  27     release(&lk->lk);
  28     sleep();
  29     acquire(&lk->lk);
  30   }
  31   lk->locked = 1;
  32   lk->pid = myproc()->pid;
  33   release(&lk->lk);
  34 }
  35 
  36 void
  37 releasesleep(struct sleeplock *lk)
  38 {
  39   acquire(&lk->lk);
  40   lk->locked = 0;
  41   lk->pid = 0;
  42   wakeup(lk);
  43   release(&lk->lk);
  44 }
  45 
  46 int
  47 holdingsleep(struct sleeplock *lk)
  48 {
  49   int r;
  50 
  51   acquire(&lk->lk);
  52   r = lk->locked && (lk->pid == myproc()->pid);
  53   release(&lk->lk);
  54   return r;
  55 }

/* [<][>][^][v][top][bottom][index][help] */