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