bool mutex_obj_free(kmutex_t *lock) { struct kmutexobj *mo = (struct kmutexobj *)lock; if (atomic_dec_uint_nv(&mo->mo_refcnt) > 0) { return false; } mutex_destroy(&mo->mo_lock); kmem_free(mo, sizeof(*mo)); return true; }
void kcpuset_unuse(kcpuset_t *c, kcpuset_t **lst) { if (atomic_dec_uint_nv(&c->nused) != 0) return; KASSERT(c->nused == 0); KASSERT(c->next == NULL); if (lst == NULL) { kcpuset_destroy(c); return; } c->next = *lst; *lst = c; }
/* * mutex_obj_free: * * Drop a reference from a lock object. If the last reference is being * dropped, free the object and return true. Otherwise, return false. */ bool mutex_obj_free(kmutex_t *lock) { struct kmutexobj *mo = (struct kmutexobj *)lock; KASSERTMSG(mo->mo_magic == MUTEX_OBJ_MAGIC, "%s: lock %p: mo->mo_magic (%#x) != MUTEX_OBJ_MAGIC (%#x)", __func__, mo, mo->mo_magic, MUTEX_OBJ_MAGIC); KASSERTMSG(mo->mo_refcnt > 0, "%s: lock %p: mo->mo_refcnt (%#x) == 0", __func__, mo, mo->mo_refcnt); if (atomic_dec_uint_nv(&mo->mo_refcnt) > 0) { return false; } mutex_destroy(&mo->mo_lock); pool_cache_put(mutex_obj_cache, mo); return true; }
/* * This is normally called via the rxb's freefunc, when an mblk referencing the * rxb is freed. */ void rxbuf_free(struct rxbuf *rxb) { if (atomic_dec_uint_nv(&rxb->ref_cnt) == 0) kmem_cache_free(rxb->cache, rxb); }