44#include <sys/condvar.h>
53 KASSERT((
value >= 0), (
"%s(): negative value\n", __func__));
56 mtx_init(&
sema->sema_mtx, description,
"sema backing lock",
57 MTX_DEF | MTX_NOWITNESS | MTX_QUIET);
61 CTR4(KTR_LOCK,
"%s(%p, %d, \"%s\")", __func__,
sema,
value, description);
68 CTR3(KTR_LOCK,
"%s(%p) \"%s\"", __func__,
sema,
69 cv_wmesg(&
sema->sema_cv));
71 KASSERT((
sema->sema_waiters == 0), (
"%s(): waiters\n", __func__));
73 mtx_destroy(&
sema->sema_mtx);
81 mtx_lock(&
sema->sema_mtx);
83 if (
sema->sema_waiters &&
sema->sema_value > 0)
86 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__,
sema,
87 cv_wmesg(&
sema->sema_cv),
sema->sema_value, file, line);
89 mtx_unlock(&
sema->sema_mtx);
96 mtx_lock(&
sema->sema_mtx);
97 while (
sema->sema_value == 0) {
99 cv_wait(&
sema->sema_cv, &
sema->sema_mtx);
100 sema->sema_waiters--;
104 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__,
sema,
105 cv_wmesg(&
sema->sema_cv),
sema->sema_value, file, line);
107 mtx_unlock(&
sema->sema_mtx);
115 mtx_lock(&
sema->sema_mtx);
123 for (error = 0;
sema->sema_value == 0 && error == 0;) {
124 sema->sema_waiters++;
125 error = cv_timedwait(&
sema->sema_cv, &
sema->sema_mtx, timo);
126 sema->sema_waiters--;
128 if (
sema->sema_value > 0) {
133 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__,
sema,
134 cv_wmesg(&
sema->sema_cv),
sema->sema_value, file, line);
136 CTR5(KTR_LOCK,
"%s(%p) \"%s\" fail at %s:%d", __func__,
sema,
137 cv_wmesg(&
sema->sema_cv), file, line);
140 mtx_unlock(&
sema->sema_mtx);
149 mtx_lock(&
sema->sema_mtx);
151 if (
sema->sema_value > 0) {
156 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__,
sema,
157 cv_wmesg(&
sema->sema_cv),
sema->sema_value, file, line);
161 CTR5(KTR_LOCK,
"%s(%p) \"%s\" fail at %s:%d", __func__,
sema,
162 cv_wmesg(&
sema->sema_cv), file, line);
165 mtx_unlock(&
sema->sema_mtx);
174 mtx_lock(&
sema->sema_mtx);
175 ret =
sema->sema_value;
176 mtx_unlock(&
sema->sema_mtx);
void cv_init(struct cv *cvp, const char *desc)
void cv_destroy(struct cv *cvp)
void cv_signal(struct cv *cvp)
void _sema_post(struct sema *sema, const char *file, int line)
int sema_value(struct sema *sema)
void sema_init(struct sema *sema, int value, const char *description)
void _sema_wait(struct sema *sema, const char *file, int line)
void sema_destroy(struct sema *sema)
int _sema_timedwait(struct sema *sema, int timo, const char *file, int line)
int _sema_trywait(struct sema *sema, const char *file, int line)
static struct semid_kernel * sema