| #include <parlib/uthread.h> | 
 | #include <parlib/assert.h> | 
 | #include <semaphore.h> | 
 | #include <parlib/stdio.h> | 
 | #include <errno.h> | 
 |  | 
 | int sem_init(sem_t *__sem, int __pshared, unsigned int __value) | 
 | { | 
 | 	if (__pshared == TRUE) { | 
 | 		printf("__pshared functionality of sem_init is not yet implemented!"); | 
 | 		return -1; | 
 | 	} | 
 | 	uth_semaphore_init(&__sem->real_sem, __value); | 
 | 	return 0; | 
 | } | 
 |  | 
 | int sem_destroy(sem_t *__sem) | 
 | { | 
 | 	uth_semaphore_destroy(&__sem->real_sem); | 
 | 	return 0; | 
 | } | 
 |  | 
 | sem_t *sem_open(__const char *__name, int __oflag, ...) | 
 | { | 
 | 	printf("sem_open is not yet implemented!"); | 
 | 	return NULL; | 
 | } | 
 |  | 
 | int sem_close(sem_t *__sem) | 
 | { | 
 | 	printf("sem_close is not yet implemented!"); | 
 | 	return -1; | 
 | } | 
 |  | 
 | int sem_unlink(__const char *__name) | 
 | { | 
 | 	printf("sem_unlink is not yet implemented!"); | 
 | 	return -1; | 
 | } | 
 |  | 
 | int sem_wait(sem_t *__sem) | 
 | { | 
 | 	uth_semaphore_down(&__sem->real_sem); | 
 | 	return 0; | 
 | } | 
 |  | 
 | int sem_timedwait(sem_t *__sem, const struct timespec *abs_timeout) | 
 | { | 
 | 	if (!uth_semaphore_timed_down(&__sem->real_sem, abs_timeout)) { | 
 | 		errno = ETIMEDOUT; | 
 | 		return -1; | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | int sem_trywait(sem_t *__sem) | 
 | { | 
 | 	if (!uth_semaphore_trydown(&__sem->real_sem)) | 
 | 		return -1; | 
 | 	return 0; | 
 | } | 
 |  | 
 | int sem_post(sem_t *__sem) | 
 | { | 
 | 	uth_semaphore_up(&__sem->real_sem); | 
 | 	return 0; | 
 | } | 
 |  | 
 | int sem_getvalue(sem_t *__restrict __sem, int *__restrict __sval) | 
 | { | 
 | 	spin_pdr_lock(&__sem->real_sem.lock); | 
 | 	*__sval = __sem->real_sem.count; | 
 | 	spin_pdr_unlock(&__sem->real_sem.lock); | 
 | 	return 0; | 
 | } |