|
@@ -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);
|
|
|
}
|