Lines Matching refs:sem

81 struct sem {  struct
91 LIST_ENTRY(sem) entry; argument
92 struct sem **backpointer; argument
95 typedef struct sem* sem_t;
109 static void sem_free(sem_t sem);
111 static LIST_HEAD(, sem) named_sems = LIST_HEAD_INITIALIZER(named_sems);
126 sem_check_validity(sem_t *sem) in sem_check_validity() argument
129 if ((sem != NULL) && ((*sem)->magic == SEM_MAGIC)) in sem_check_validity()
138 sem_free(sem_t sem) in sem_free() argument
141 sem->magic = 0; in sem_free()
142 free(sem); in sem_free()
148 sem_t sem; in sem_alloc() local
155 sem = (sem_t)malloc(sizeof(struct sem)); in sem_alloc()
156 if (sem == NULL) { in sem_alloc()
161 sem->count = (u_int32_t)value; in sem_alloc()
162 sem->nwaiters = 0; in sem_alloc()
163 sem->magic = SEM_MAGIC; in sem_alloc()
164 sem->semid = semid; in sem_alloc()
165 sem->syssem = system_sem; in sem_alloc()
166 return (sem); in sem_alloc()
170 _libc_sem_init_compat(sem_t *sem, int pshared, unsigned int value) in _libc_sem_init_compat() argument
184 *sem = sem_alloc(value, semid, pshared); in _libc_sem_init_compat()
185 if ((*sem) == NULL) { in _libc_sem_init_compat()
194 _libc_sem_destroy_compat(sem_t *sem) in _libc_sem_destroy_compat() argument
198 if (sem_check_validity(sem) != 0) in _libc_sem_destroy_compat()
205 if ((*sem)->syssem != 0) in _libc_sem_destroy_compat()
206 retval = ksem_destroy((*sem)->semid); in _libc_sem_destroy_compat()
207 else if ((*sem)->nwaiters > 0) { in _libc_sem_destroy_compat()
213 (*sem)->magic = 0; in _libc_sem_destroy_compat()
217 sem_free(*sem); in _libc_sem_destroy_compat()
224 sem_t *sem; in _libc_sem_open_compat() local
254 sem = s->backpointer; in _libc_sem_open_compat()
256 return (sem); in _libc_sem_open_compat()
259 sem = (sem_t *)malloc(sizeof(*sem)); in _libc_sem_open_compat()
260 if (sem == NULL) in _libc_sem_open_compat()
262 *sem = sem_alloc(value, semid, 1); in _libc_sem_open_compat()
263 if ((*sem) == NULL) in _libc_sem_open_compat()
265 LIST_INSERT_HEAD(&named_sems, *sem, entry); in _libc_sem_open_compat()
266 (*sem)->backpointer = sem; in _libc_sem_open_compat()
268 return (sem); in _libc_sem_open_compat()
272 if (sem != NULL) { in _libc_sem_open_compat()
273 if (*sem != NULL) in _libc_sem_open_compat()
274 sem_free(*sem); in _libc_sem_open_compat()
277 free(sem); in _libc_sem_open_compat()
285 _libc_sem_close_compat(sem_t *sem) in _libc_sem_close_compat() argument
288 if (sem_check_validity(sem) != 0) in _libc_sem_close_compat()
291 if ((*sem)->syssem == 0) { in _libc_sem_close_compat()
297 if (ksem_close((*sem)->semid) != 0) { in _libc_sem_close_compat()
301 LIST_REMOVE((*sem), entry); in _libc_sem_close_compat()
303 sem_free(*sem); in _libc_sem_close_compat()
304 *sem = NULL; in _libc_sem_close_compat()
305 free(sem); in _libc_sem_close_compat()
358 sem_t *sem = arg; in sem_cancel_handler() local
360 atomic_add_int(&(*sem)->nwaiters, -1); in sem_cancel_handler()
361 if ((*sem)->nwaiters && (*sem)->count) in sem_cancel_handler()
362 _umtx_wake(&(*sem)->count); in sem_cancel_handler()
366 _libc_sem_timedwait_compat(sem_t * __restrict sem, in _libc_sem_timedwait_compat() argument
371 if (sem_check_validity(sem) != 0) in _libc_sem_timedwait_compat()
374 if ((*sem)->syssem != 0) { in _libc_sem_timedwait_compat()
376 retval = ksem_wait((*sem)->semid); /* XXX no timeout */ in _libc_sem_timedwait_compat()
384 while ((val = (*sem)->count) > 0) { in _libc_sem_timedwait_compat()
385 if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1)) in _libc_sem_timedwait_compat()
398 atomic_add_int(&(*sem)->nwaiters, 1); in _libc_sem_timedwait_compat()
399 pthread_cleanup_push(sem_cancel_handler, sem); in _libc_sem_timedwait_compat()
401 retval = _umtx_wait_uint(&(*sem)->count, 0, abstime); in _libc_sem_timedwait_compat()
404 atomic_add_int(&(*sem)->nwaiters, -1); in _libc_sem_timedwait_compat()
410 _libc_sem_wait_compat(sem_t *sem) in _libc_sem_wait_compat() argument
412 return _libc_sem_timedwait_compat(sem, NULL); in _libc_sem_wait_compat()
416 _libc_sem_trywait_compat(sem_t *sem) in _libc_sem_trywait_compat() argument
420 if (sem_check_validity(sem) != 0) in _libc_sem_trywait_compat()
423 if ((*sem)->syssem != 0) in _libc_sem_trywait_compat()
424 return ksem_trywait((*sem)->semid); in _libc_sem_trywait_compat()
426 while ((val = (*sem)->count) > 0) { in _libc_sem_trywait_compat()
427 if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1)) in _libc_sem_trywait_compat()
435 _libc_sem_post_compat(sem_t *sem) in _libc_sem_post_compat() argument
438 if (sem_check_validity(sem) != 0) in _libc_sem_post_compat()
441 if ((*sem)->syssem != 0) in _libc_sem_post_compat()
442 return ksem_post((*sem)->semid); in _libc_sem_post_compat()
444 atomic_add_rel_int(&(*sem)->count, 1); in _libc_sem_post_compat()
446 if ((*sem)->nwaiters) in _libc_sem_post_compat()
447 return _umtx_wake(&(*sem)->count); in _libc_sem_post_compat()
452 _libc_sem_getvalue_compat(sem_t * __restrict sem, int * __restrict sval) in _libc_sem_getvalue_compat() argument
456 if (sem_check_validity(sem) != 0) in _libc_sem_getvalue_compat()
459 if ((*sem)->syssem != 0) in _libc_sem_getvalue_compat()
460 retval = ksem_getvalue((*sem)->semid, sval); in _libc_sem_getvalue_compat()
462 *sval = (int)(*sem)->count; in _libc_sem_getvalue_compat()