 67702cf706
			
		
	
	
		67702cf706
		
	
	
	
	
		
			
			locking plan, which is a difficult to understand because ptable lock protects many invariants. This implementation has a bug: once in a while xv6 unlocks a proc lock that is locked by another core.
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			797 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			797 B
		
	
	
	
		
			C
		
	
	
	
	
	
| // Sleeping locks
 | |
| 
 | |
| #include "types.h"
 | |
| #include "riscv.h"
 | |
| #include "defs.h"
 | |
| #include "param.h"
 | |
| #include "memlayout.h"
 | |
| #include "spinlock.h"
 | |
| #include "proc.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 = myproc()->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 && (lk->pid == myproc()->pid);
 | |
|   release(&lk->lk);
 | |
|   return r;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 |