diff --git a/sys/kern/kern_condvar.c b/sys/kern/kern_condvar.c index 859001be5385..6129c12320a7 100644 --- a/sys/kern/kern_condvar.c +++ b/sys/kern/kern_condvar.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_condvar.c,v 1.9 2007/07/09 21:10:51 ad Exp $ */ +/* $NetBSD: kern_condvar.c,v 1.10 2007/08/01 20:30:38 ad Exp $ */ /*- * Copyright (c) 2006, 2007 The NetBSD Foundation, Inc. @@ -45,7 +45,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.9 2007/07/09 21:10:51 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.10 2007/08/01 20:30:38 ad Exp $"); #include #include @@ -57,7 +57,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.9 2007/07/09 21:10:51 ad Exp $"); static void cv_unsleep(lwp_t *); static void cv_changepri(lwp_t *, pri_t); -syncobj_t cv_syncobj = { +static syncobj_t cv_syncobj = { SOBJ_SLEEPQ_SORTED, cv_unsleep, cv_changepri, @@ -65,6 +65,8 @@ syncobj_t cv_syncobj = { syncobj_noowner, }; +static const char deadcv[] = "deadcv"; + /* * cv_init: * @@ -90,8 +92,9 @@ cv_destroy(kcondvar_t *cv) { #ifdef DIAGNOSTIC - KASSERT(cv->cv_waiters == 0 && cv->cv_wmesg != NULL); - cv->cv_wmesg = NULL; + KASSERT(cv->cv_wmesg != deadcv && cv->cv_wmesg != NULL); + KASSERT(cv->cv_waiters == 0); + cv->cv_wmesg = deadcv; #endif } @@ -106,7 +109,7 @@ cv_enter(kcondvar_t *cv, kmutex_t *mtx, lwp_t *l) { sleepq_t *sq; - KASSERT(cv->cv_wmesg != NULL); + KASSERT(cv->cv_wmesg != deadcv && cv->cv_wmesg != NULL); KASSERT((l->l_flag & LW_INTR) == 0); l->l_cv_signalled = 0; @@ -137,6 +140,8 @@ cv_exit(kcondvar_t *cv, kmutex_t *mtx, lwp_t *l, const int error) if (__predict_false(error != 0) && l->l_cv_signalled != 0) cv_signal(cv); + KASSERT(cv->cv_wmesg != deadcv && cv->cv_wmesg != NULL); + return error; } @@ -151,13 +156,14 @@ cv_exit(kcondvar_t *cv, kmutex_t *mtx, lwp_t *l, const int error) static void cv_unsleep(lwp_t *l) { - uintptr_t addr; + kcondvar_t *cv; KASSERT(l->l_wchan != NULL); KASSERT(lwp_locked(l, l->l_sleepq->sq_mutex)); - addr = (uintptr_t)l->l_wchan; - ((kcondvar_t *)addr)->cv_waiters--; + cv = (kcondvar_t *)(uintptr_t)l->l_wchan; + KASSERT(cv->cv_wmesg != deadcv && cv->cv_wmesg != NULL); + cv->cv_waiters--; sleepq_unsleep(l); }