Lines Matching refs:sem
79 struct sem { struct
89 LIST_ENTRY(sem) entry; argument
90 struct sem **backpointer; argument
93 typedef struct sem* sem_t;
107 static void sem_free(sem_t sem);
109 static LIST_HEAD(, sem) named_sems = LIST_HEAD_INITIALIZER(named_sems);
124 sem_check_validity(sem_t *sem) in sem_check_validity() argument
127 if ((sem != NULL) && ((*sem)->magic == SEM_MAGIC)) in sem_check_validity()
136 sem_free(sem_t sem) in sem_free() argument
139 sem->magic = 0; in sem_free()
140 free(sem); in sem_free()
146 sem_t sem; in sem_alloc() local
153 sem = (sem_t)malloc(sizeof(struct sem)); in sem_alloc()
154 if (sem == NULL) { in sem_alloc()
159 sem->count = (u_int32_t)value; in sem_alloc()
160 sem->nwaiters = 0; in sem_alloc()
161 sem->magic = SEM_MAGIC; in sem_alloc()
162 sem->semid = semid; in sem_alloc()
163 sem->syssem = system_sem; in sem_alloc()
164 return (sem); in sem_alloc()
168 _libc_sem_init_compat(sem_t *sem, int pshared, unsigned int value) in _libc_sem_init_compat() argument
182 *sem = sem_alloc(value, semid, pshared); in _libc_sem_init_compat()
183 if ((*sem) == NULL) { in _libc_sem_init_compat()
192 _libc_sem_destroy_compat(sem_t *sem) in _libc_sem_destroy_compat() argument
196 if (sem_check_validity(sem) != 0) in _libc_sem_destroy_compat()
203 if ((*sem)->syssem != 0) in _libc_sem_destroy_compat()
204 retval = ksem_destroy((*sem)->semid); in _libc_sem_destroy_compat()
205 else if ((*sem)->nwaiters > 0) { in _libc_sem_destroy_compat()
211 (*sem)->magic = 0; in _libc_sem_destroy_compat()
215 sem_free(*sem); in _libc_sem_destroy_compat()
222 sem_t *sem; in _libc_sem_open_compat() local
252 sem = s->backpointer; in _libc_sem_open_compat()
254 return (sem); in _libc_sem_open_compat()
257 sem = (sem_t *)malloc(sizeof(*sem)); in _libc_sem_open_compat()
258 if (sem == NULL) in _libc_sem_open_compat()
260 *sem = sem_alloc(value, semid, 1); in _libc_sem_open_compat()
261 if ((*sem) == NULL) in _libc_sem_open_compat()
263 LIST_INSERT_HEAD(&named_sems, *sem, entry); in _libc_sem_open_compat()
264 (*sem)->backpointer = sem; in _libc_sem_open_compat()
266 return (sem); in _libc_sem_open_compat()
270 if (sem != NULL) { in _libc_sem_open_compat()
271 if (*sem != NULL) in _libc_sem_open_compat()
272 sem_free(*sem); in _libc_sem_open_compat()
275 free(sem); in _libc_sem_open_compat()
283 _libc_sem_close_compat(sem_t *sem) in _libc_sem_close_compat() argument
286 if (sem_check_validity(sem) != 0) in _libc_sem_close_compat()
289 if ((*sem)->syssem == 0) { in _libc_sem_close_compat()
295 if (ksem_close((*sem)->semid) != 0) { in _libc_sem_close_compat()
299 LIST_REMOVE((*sem), entry); in _libc_sem_close_compat()
301 sem_free(*sem); in _libc_sem_close_compat()
302 *sem = NULL; in _libc_sem_close_compat()
303 free(sem); in _libc_sem_close_compat()
356 sem_t *sem = arg; in sem_cancel_handler() local
358 atomic_add_int(&(*sem)->nwaiters, -1); in sem_cancel_handler()
359 if ((*sem)->nwaiters && (*sem)->count) in sem_cancel_handler()
360 _umtx_wake(&(*sem)->count); in sem_cancel_handler()
364 _libc_sem_timedwait_compat(sem_t * __restrict sem, in _libc_sem_timedwait_compat() argument
369 if (sem_check_validity(sem) != 0) in _libc_sem_timedwait_compat()
372 if ((*sem)->syssem != 0) { in _libc_sem_timedwait_compat()
374 retval = ksem_wait((*sem)->semid); /* XXX no timeout */ in _libc_sem_timedwait_compat()
382 while ((val = (*sem)->count) > 0) { in _libc_sem_timedwait_compat()
383 if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1)) in _libc_sem_timedwait_compat()
396 atomic_add_int(&(*sem)->nwaiters, 1); in _libc_sem_timedwait_compat()
397 pthread_cleanup_push(sem_cancel_handler, sem); in _libc_sem_timedwait_compat()
399 retval = _umtx_wait_uint(&(*sem)->count, 0, abstime); in _libc_sem_timedwait_compat()
402 atomic_add_int(&(*sem)->nwaiters, -1); in _libc_sem_timedwait_compat()
408 _libc_sem_wait_compat(sem_t *sem) in _libc_sem_wait_compat() argument
410 return _libc_sem_timedwait_compat(sem, NULL); in _libc_sem_wait_compat()
414 _libc_sem_trywait_compat(sem_t *sem) in _libc_sem_trywait_compat() argument
418 if (sem_check_validity(sem) != 0) in _libc_sem_trywait_compat()
421 if ((*sem)->syssem != 0) in _libc_sem_trywait_compat()
422 return ksem_trywait((*sem)->semid); in _libc_sem_trywait_compat()
424 while ((val = (*sem)->count) > 0) { in _libc_sem_trywait_compat()
425 if (atomic_cmpset_acq_int(&(*sem)->count, val, val - 1)) in _libc_sem_trywait_compat()
433 _libc_sem_post_compat(sem_t *sem) in _libc_sem_post_compat() argument
436 if (sem_check_validity(sem) != 0) in _libc_sem_post_compat()
439 if ((*sem)->syssem != 0) in _libc_sem_post_compat()
440 return ksem_post((*sem)->semid); in _libc_sem_post_compat()
442 atomic_add_rel_int(&(*sem)->count, 1); in _libc_sem_post_compat()
444 if ((*sem)->nwaiters) in _libc_sem_post_compat()
445 return _umtx_wake(&(*sem)->count); in _libc_sem_post_compat()
450 _libc_sem_getvalue_compat(sem_t * __restrict sem, int * __restrict sval) in _libc_sem_getvalue_compat() argument
454 if (sem_check_validity(sem) != 0) in _libc_sem_getvalue_compat()
457 if ((*sem)->syssem != 0) in _libc_sem_getvalue_compat()
458 retval = ksem_getvalue((*sem)->semid, sval); in _libc_sem_getvalue_compat()
460 *sval = (int)(*sem)->count; in _libc_sem_getvalue_compat()