ksem
static LIST_HEAD(, ksem) *ksem_pshared_hashtab __cacheline_aligned;
ksem_remove_pshared(ksem_t *ksem)
LIST_REMOVE(ksem, ks_entry);
ksem_t *ksem = NULL;
LIST_FOREACH(ksem, &ksem_pshared_hashtab[bucket], ks_entry) {
if (ksem->ks_pshared_id == id) {
mutex_enter(&ksem->ks_lock);
if (ksem->ks_pshared_proc == NULL) {
mutex_exit(&ksem->ks_lock);
ksem->ks_ref++;
KASSERT(ksem->ks_ref != 0);
return ksem;
ksem_t *ksem = ksem_lookup_pshared_locked(id);
return ksem;
ksem_alloc_pshared_id(ksem_t *ksem)
KASSERT(ksem->ks_pshared_proc != NULL);
ksem->ks_pshared_id = try;
u_long bucket = KSEM_PSHARED_HASH(ksem->ks_pshared_id);
LIST_INSERT_HEAD(&ksem_pshared_hashtab[bucket], ksem, ks_entry);
ksem_release(ksem_t *ksem, int fd)
KASSERT(mutex_owned(&ksem->ks_lock));
KASSERT(ksem->ks_ref > 0);
if (--ksem->ks_ref == 0) {
destroy = (ksem->ks_flags & KS_UNLINKED) ||
(ksem->ks_name == NULL);
mutex_exit(&ksem->ks_lock);
ksem_free(ksem);
MODULE(MODULE_CLASS_MISC, ksem, NULL);
static LIST_HEAD(,ksem) ksem_head __cacheline_aligned;
struct ksem *fd_ks; // DTYPE_SEM
LIST_ENTRY(ksem) ks_entry; /* global list entry */
intptr_t ksem, ksem1;
ATF_REQUIRE_EQ(_ksem_open("/ksem_b", O_CREAT | O_EXCL, 0644, 0, &ksem),
ATF_REQUIRE(_ksem_getvalue(ksem, &val) == 0 && val == 0);
ATF_REQUIRE_EQ(_ksem_close(ksem), 0);
intptr_t ksem;
ksem = 0;
ATF_REQUIRE_EQ(_ksem_init(0, &ksem), 0);
ATF_REQUIRE(_ksem_close(ksem) == -1 && errno == EINVAL);
ATF_REQUIRE_EQ(_ksem_destroy(ksem), 0);
intptr_t ksem;
ksem = KSEM_PSHARED;
ATF_REQUIRE_EQ(_ksem_init(0, &ksem), 0);
ATF_REQUIRE(_ksem_close(ksem) == -1 && errno == EINVAL);
ATF_REQUIRE_EQ(_ksem_destroy(ksem), 0);
intptr_t ksem;
ATF_REQUIRE_EQ(_ksem_open("/ksem_x", O_CREAT | O_EXCL, 0644, 0, &ksem),
ATF_REQUIRE(_ksem_destroy(ksem) == -1 && errno == EINVAL);
ATF_REQUIRE_EQ(_ksem_close(ksem), 0);