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;
}
Beispiel #2
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;
}