Blame include/uv/pthread-barrier.h

Packit b5b901
/*
Packit b5b901
Copyright (c) 2016, Kari Tristan Helgason <kthelgason@gmail.com>
Packit b5b901
Packit b5b901
Permission to use, copy, modify, and/or distribute this software for any
Packit b5b901
purpose with or without fee is hereby granted, provided that the above
Packit b5b901
copyright notice and this permission notice appear in all copies.
Packit b5b901
Packit b5b901
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
Packit b5b901
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
Packit b5b901
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
Packit b5b901
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit b5b901
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
Packit b5b901
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Packit b5b901
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit b5b901
*/
Packit b5b901
Packit b5b901
#ifndef _UV_PTHREAD_BARRIER_
Packit b5b901
#define _UV_PTHREAD_BARRIER_
Packit b5b901
#include <errno.h>
Packit b5b901
#include <pthread.h>
Packit b5b901
#if !defined(__MVS__)
Packit b5b901
#include <semaphore.h> /* sem_t */
Packit b5b901
#endif
Packit b5b901
Packit b5b901
#define PTHREAD_BARRIER_SERIAL_THREAD  0x12345
Packit b5b901
#define UV__PTHREAD_BARRIER_FALLBACK   1
Packit b5b901
Packit b5b901
/*
Packit b5b901
 * To maintain ABI compatibility with
Packit b5b901
 * libuv v1.x struct is padded according
Packit b5b901
 * to target platform
Packit b5b901
 */
Packit b5b901
#if defined(__ANDROID__)
Packit b5b901
# define UV_BARRIER_STRUCT_PADDING \
Packit b5b901
  sizeof(pthread_mutex_t) + \
Packit b5b901
  sizeof(pthread_cond_t) + \
Packit b5b901
  sizeof(unsigned int) - \
Packit b5b901
  sizeof(void *)
Packit b5b901
#elif defined(__APPLE__)
Packit b5b901
# define UV_BARRIER_STRUCT_PADDING \
Packit b5b901
  sizeof(pthread_mutex_t) + \
Packit b5b901
  2 * sizeof(sem_t) + \
Packit b5b901
  2 * sizeof(unsigned int) - \
Packit b5b901
  sizeof(void *)
Packit b5b901
#else
Packit b5b901
# define UV_BARRIER_STRUCT_PADDING 0
Packit b5b901
#endif
Packit b5b901
Packit b5b901
typedef struct {
Packit b5b901
  pthread_mutex_t  mutex;
Packit b5b901
  pthread_cond_t   cond;
Packit b5b901
  unsigned         threshold;
Packit b5b901
  unsigned         in;
Packit b5b901
  unsigned         out;
Packit b5b901
} _uv_barrier;
Packit b5b901
Packit b5b901
typedef struct {
Packit b5b901
  _uv_barrier* b;
Packit b5b901
  char _pad[UV_BARRIER_STRUCT_PADDING];
Packit b5b901
} pthread_barrier_t;
Packit b5b901
Packit b5b901
int pthread_barrier_init(pthread_barrier_t* barrier,
Packit b5b901
                         const void* barrier_attr,
Packit b5b901
                         unsigned count);
Packit b5b901
Packit b5b901
int pthread_barrier_wait(pthread_barrier_t* barrier);
Packit b5b901
int pthread_barrier_destroy(pthread_barrier_t *barrier);
Packit b5b901
Packit b5b901
#endif /* _UV_PTHREAD_BARRIER_ */