36 #include <sys/cdefs.h>
39 #include <sys/param.h>
40 #include <sys/systm.h>
42 #include <sys/condvar.h>
44 #include <sys/mutex.h>
51 KASSERT((value >= 0), (
"%s(): negative value\n", __func__));
53 bzero(sema,
sizeof(*sema));
54 mtx_init(&sema->sema_mtx, description,
"sema backing lock",
55 MTX_DEF | MTX_NOWITNESS | MTX_QUIET);
56 cv_init(&sema->sema_cv, description);
57 sema->sema_value =
value;
59 CTR4(KTR_LOCK,
"%s(%p, %d, \"%s\")", __func__, sema, value, description);
66 CTR3(KTR_LOCK,
"%s(%p) \"%s\"", __func__, sema,
67 cv_wmesg(&sema->sema_cv));
69 KASSERT((sema->sema_waiters == 0), (
"%s(): waiters\n", __func__));
79 mtx_lock(&sema->sema_mtx);
81 if (sema->sema_waiters && sema->sema_value > 0)
84 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
85 cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
87 mtx_unlock(&sema->sema_mtx);
94 mtx_lock(&sema->sema_mtx);
95 while (sema->sema_value == 0) {
97 cv_wait(&sema->sema_cv, &sema->sema_mtx);
102 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
103 cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
105 mtx_unlock(&sema->sema_mtx);
113 mtx_lock(&sema->sema_mtx);
121 for (error = 0; sema->sema_value == 0 && error == 0;) {
122 sema->sema_waiters++;
123 error = cv_timedwait(&sema->sema_cv, &sema->sema_mtx, timo);
124 sema->sema_waiters--;
126 if (sema->sema_value > 0) {
131 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
132 cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
134 CTR5(KTR_LOCK,
"%s(%p) \"%s\" fail at %s:%d", __func__, sema,
135 cv_wmesg(&sema->sema_cv), file, line);
138 mtx_unlock(&sema->sema_mtx);
147 mtx_lock(&sema->sema_mtx);
149 if (sema->sema_value > 0) {
154 CTR6(KTR_LOCK,
"%s(%p) \"%s\" v = %d at %s:%d", __func__, sema,
155 cv_wmesg(&sema->sema_cv), sema->sema_value, file, line);
159 CTR5(KTR_LOCK,
"%s(%p) \"%s\" fail at %s:%d", __func__, sema,
160 cv_wmesg(&sema->sema_cv), file, line);
163 mtx_unlock(&sema->sema_mtx);
172 mtx_lock(&sema->sema_mtx);
173 ret = sema->sema_value;
174 mtx_unlock(&sema->sema_mtx);
int sema_value(struct sema *sema)
void cv_destroy(struct cv *cvp)
void cv_signal(struct cv *cvp)
void _sema_wait(struct sema *sema, const char *file, int line)
int _sema_trywait(struct sema *sema, const char *file, int line)
static struct semid_kernel * sema
void cv_init(struct cv *cvp, const char *desc)
int _sema_timedwait(struct sema *sema, int timo, const char *file, int line)
void mtx_init(struct mtx *m, const char *name, const char *type, int opts)
void sema_init(struct sema *sema, int value, const char *description)
void mtx_destroy(struct mtx *m)
void _sema_post(struct sema *sema, const char *file, int line)
void sema_destroy(struct sema *sema)