Преглед на файлове

trying to add CVs, small check added to mutexes

tarfeef101 преди 6 години
родител
ревизия
0360b88f76
променени са 1 файла, в които са добавени 41 реда и са изтрити 38 реда
  1. 41 38
      kern/thread/synch.c

+ 41 - 38
kern/thread/synch.c

@@ -188,6 +188,7 @@ void lock_destroy(struct lock * lock)
 void lock_acquire(struct lock * lock)
 {
   KASSERT(lock);
+  KASSERT(!(lock_do_i_hold(lock)));
 
   spinlock_acquire(&(lock->spin));
   
@@ -226,58 +227,60 @@ bool lock_do_i_hold(struct lock * lock)
 // CV
 
 
-struct cv *
-cv_create(const char *name)
+struct cv * cv_create(const char * name)
 {
-        struct cv *cv;
-
-        cv = kmalloc(sizeof(struct cv));
-        if (cv == NULL) {
-                return NULL;
-        }
+  struct cv * cv = kmalloc(sizeof(struct cv));
+  
+  if (cv == NULL)
+  {
+    return NULL;
+  }
+  
+  cv->cv_name = kstrdup(name);
+  struct wchan * wc = wchan_create(cv->cv_name);
+  
+  if (cv->cv_name == NULL || wc == NULL)
+  {
+    kfree(cv->cv_name);
+    kfree(cv);
+    kfree(wc);
+    return NULL;
+  }
 
-        cv->cv_name = kstrdup(name);
-        if (cv->cv_name==NULL) {
-                kfree(cv);
-                return NULL;
-        }
-        
-        // add stuff here as needed
-        
-        return cv;
+ return cv;
 }
 
-void
-cv_destroy(struct cv *cv)
+void cv_destroy(struct cv * cv)
 {
-        KASSERT(cv != NULL);
-
-        // add stuff here as needed
-        
-        kfree(cv->cv_name);
-        kfree(cv);
+  KASSERT(cv);
+  
+  wchan_destroy(cv->wc);
+  kfree(cv->cv_name);
+  kfree(cv);
 }
 
-void
-cv_wait(struct cv *cv, struct lock *lock)
+void cv_wait(struct cv * cv, struct lock * lock)
 {
-        // Write this
-        (void)cv;    // suppress warning until code gets written
-        (void)lock;  // suppress warning until code gets written
+  KASSERT(lock_do_i_hold(lock));
+  
+  wchan_lock(cv->wc);
+  lock_release(lock);
+  wchan_sleep(cv->wc);
+  lock_acquire(lock);
 }
 
 void
-cv_signal(struct cv *cv, struct lock *lock)
+cv_signal(struct cv * cv, struct lock * lock)
 {
-        // Write this
-	(void)cv;    // suppress warning until code gets written
-	(void)lock;  // suppress warning until code gets written
+  KASSERT(lock_do_i_hold(lock));
+  
+  wchan_wakeone(cv->wc);
 }
 
 void
-cv_broadcast(struct cv *cv, struct lock *lock)
+cv_broadcast(struct cv * cv, struct lock * lock)
 {
-	// Write this
-	(void)cv;    // suppress warning until code gets written
-	(void)lock;  // suppress warning until code gets written
+	KASSERT(lock_do_i_hold(lock));
+	
+	wchan_wakeall(cv->wc);
 }