int sem_init(sem_t* sem, int pshared, unsigned int value) { // Ensure that 'value' can be stored in the semaphore. if (value > SEM_VALUE_MAX) { errno = EINVAL; return -1; } unsigned int count = SEMCOUNT_FROM_VALUE(value); if (pshared != 0) { count |= SEMCOUNT_SHARED_MASK; } atomic_uint* sem_count_ptr = SEM_TO_ATOMIC_POINTER(sem); atomic_init(sem_count_ptr, count); return 0; }
int sem_init(sem_t *sem, int pshared, unsigned int value) { if (sem == NULL) { errno = EINVAL; return -1; } /* ensure that 'value' can be stored in the semaphore */ if (value > SEM_MAX_VALUE) { errno = EINVAL; return -1; } sem->count = SEMCOUNT_FROM_VALUE(value); if (pshared != 0) sem->count |= SEMCOUNT_SHARED_MASK; return 0; }