Go to the documentation of this file.
30 #include <sys/resource.h>
40 #if defined(__GLIBC__) && !defined(__UCLIBC__)
41 #include <gnu/libc-version.h>
45 #define NANOSEC ((uint64_t) 1e9)
47 #if defined(PTHREAD_BARRIER_SERIAL_THREAD)
52 #if defined(_AIX) || \
53 defined(__OpenBSD__) || \
54 !defined(PTHREAD_BARRIER_SERIAL_THREAD)
59 if (barrier == NULL ||
count == 0)
93 if (barrier == NULL || barrier->
b == NULL)
99 if (++
b->in ==
b->threshold) {
101 b->out =
b->threshold;
109 last = (--
b->out == 0);
127 if (
b->in != 0 ||
b->out != 0)
141 return UV__ERR(pthread_barrier_init(barrier, NULL,
count));
148 rc = pthread_barrier_wait(barrier);
150 if (rc != PTHREAD_BARRIER_SERIAL_THREAD)
153 return rc == PTHREAD_BARRIER_SERIAL_THREAD;
158 if (pthread_barrier_destroy(barrier))
172 #if defined(__APPLE__) || defined(__linux__)
175 if (getrlimit(RLIMIT_STACK, &lim))
178 if (lim.rlim_cur != RLIM_INFINITY) {
180 lim.rlim_cur -= lim.rlim_cur % (rlim_t) getpagesize();
193 if (lim.rlim_cur >= 8192)
194 if (lim.rlim_cur >= PTHREAD_STACK_MIN)
199 #if !defined(__linux__)
201 #elif defined(__PPC__) || defined(__ppc__) || defined(__powerpc__)
217 void (*entry)(
void *
arg),
220 pthread_attr_t*
attr;
221 pthread_attr_t attr_storage;
235 if (stack_size == 0) {
238 pagesize = (size_t)getpagesize();
240 stack_size = (stack_size + pagesize - 1) &~ (pagesize - 1);
241 #ifdef PTHREAD_STACK_MIN
242 if (stack_size < PTHREAD_STACK_MIN)
243 stack_size = PTHREAD_STACK_MIN;
247 if (stack_size > 0) {
248 attr = &attr_storage;
250 if (pthread_attr_init(
attr))
253 if (pthread_attr_setstacksize(
attr, stack_size))
261 pthread_attr_destroy(
attr);
268 return pthread_self();
277 return pthread_equal(*
t1, *t2);
282 #if defined(NDEBUG) || !defined(PTHREAD_MUTEX_ERRORCHECK)
285 pthread_mutexattr_t
attr;
288 if (pthread_mutexattr_init(&
attr))
291 if (pthread_mutexattr_settype(&
attr, PTHREAD_MUTEX_ERRORCHECK))
296 if (pthread_mutexattr_destroy(&
attr))
305 pthread_mutexattr_t
attr;
308 if (pthread_mutexattr_init(&
attr))
311 if (pthread_mutexattr_settype(&
attr, PTHREAD_MUTEX_RECURSIVE))
316 if (pthread_mutexattr_destroy(&
attr))
324 if (pthread_mutex_destroy(
mutex))
330 if (pthread_mutex_lock(
mutex))
340 if (
err != EBUSY &&
err != EAGAIN)
350 if (pthread_mutex_unlock(
mutex))
361 if (pthread_rwlock_destroy(
rwlock))
367 if (pthread_rwlock_rdlock(
rwlock))
377 if (
err != EBUSY &&
err != EAGAIN)
387 if (pthread_rwlock_unlock(
rwlock))
393 if (pthread_rwlock_wrlock(
rwlock))
403 if (
err != EBUSY &&
err != EAGAIN)
413 if (pthread_rwlock_unlock(
rwlock))
423 #if defined(__APPLE__) && defined(__MACH__)
428 err = semaphore_create(mach_task_self(),
sem, SYNC_POLICY_FIFO,
value);
429 if (
err == KERN_SUCCESS)
431 if (
err == KERN_INVALID_ARGUMENT)
433 if (
err == KERN_RESOURCE_SHORTAGE)
442 if (semaphore_destroy(mach_task_self(), *
sem))
448 if (semaphore_signal(*
sem))
457 r = semaphore_wait(*
sem);
458 while (
r == KERN_ABORTED);
460 if (
r != KERN_SUCCESS)
466 mach_timespec_t interval;
470 interval.tv_nsec = 0;
472 err = semaphore_timedwait(*
sem, interval);
473 if (
err == KERN_SUCCESS)
475 if (
err == KERN_OPERATION_TIMED_OUT)
484 #if defined(__GLIBC__) && !defined(__UCLIBC__)
497 static void glibc_version_check(
void) {
498 const char*
version = gnu_get_libc_version();
504 #elif defined(__MVS__)
506 #define platform_needs_custom_semaphore 1
510 #define platform_needs_custom_semaphore 0
520 #if (defined(__GLIBC__) && !defined(__UCLIBC__)) || \
521 platform_needs_custom_semaphore
577 while (
sem->value == 0)
591 if (
sem->value == 0) {
626 while (
r == -1 && errno == EINTR);
638 while (
r == -1 && errno == EINTR);
650 #if defined(__GLIBC__) && !defined(__UCLIBC__)
651 uv_once(&glibc_version_check_once, glibc_version_check);
695 #if defined(__APPLE__) && defined(__MACH__) || defined(__MVS__)
704 pthread_condattr_t
attr;
707 err = pthread_condattr_init(&
attr);
711 #if !(defined(__ANDROID_API__) && __ANDROID_API__ < 21)
712 err = pthread_condattr_setclock(&
attr, CLOCK_MONOTONIC);
721 err = pthread_condattr_destroy(&
attr);
728 pthread_cond_destroy(
cond);
730 pthread_condattr_destroy(&
attr);
737 #if defined(__APPLE__) && defined(__MACH__)
742 pthread_mutex_t
mutex;
746 if (pthread_mutex_init(&
mutex, NULL))
749 if (pthread_mutex_lock(&
mutex))
755 err = pthread_cond_timedwait_relative_np(
cond, &
mutex, &ts);
756 if (
err != 0 &&
err != ETIMEDOUT)
759 if (pthread_mutex_unlock(&
mutex))
762 if (pthread_mutex_destroy(&
mutex))
766 if (pthread_cond_destroy(
cond))
771 if (pthread_cond_signal(
cond))
776 if (pthread_cond_broadcast(
cond))
793 #if defined(__APPLE__) && defined(__MACH__)
796 r = pthread_cond_timedwait_relative_np(
cond,
mutex, &ts);
799 if (gettimeofday(&tv, NULL))
807 #if defined(__ANDROID_API__) && __ANDROID_API__ < 21
813 r = pthread_cond_timedwait_monotonic_np(
cond,
mutex, &ts);
834 return UV__ERR(pthread_key_create(
key, NULL));
839 if (pthread_key_delete(*
key))
845 return pthread_getspecific(*
key);
850 if (pthread_setspecific(*
key,
value))
int uv_barrier_init(uv_barrier_t *barrier, unsigned int count)
static size_t thread_stack_size(void)
struct uv_semaphore_s uv_semaphore_t
void uv_key_set(uv_key_t *key, void *value)
int uv_sem_trywait(uv_sem_t *sem)
void uv_sem_destroy(uv_sem_t *sem)
void * uv__malloc(size_t size)
@ UV_THREAD_HAS_STACK_SIZE
static void uv__sem_wait(uv_sem_t *sem)
#define STATIC_ASSERT(expr)
int uv_key_create(uv_key_t *key)
uint64_t uv__hrtime(uv_clocktype_t type)
int uv_rwlock_init(uv_rwlock_t *rwlock)
int sem_wait(UV_PLATFORM_SEM_T *semid)
void uv_mutex_lock(uv_mutex_t *mutex)
int uv_thread_create_ex(uv_thread_t *tid, const uv_thread_options_t *params, void(*entry)(void *arg), void *arg)
static void uv__sem_post(uv_sem_t *sem)
void uv_mutex_destroy(uv_mutex_t *mutex)
int uv_mutex_trylock(uv_mutex_t *mutex)
int sem_post(UV_PLATFORM_SEM_T *semid)
void uv_rwlock_wrunlock(uv_rwlock_t *rwlock)
int uv_cond_timedwait(uv_cond_t *cond, uv_mutex_t *mutex, uint64_t timeout)
static int uv__sem_init(uv_sem_t *sem, unsigned int value)
void uv_rwlock_wrlock(uv_rwlock_t *rwlock)
void uv_sem_wait(uv_sem_t *sem)
void uv_mutex_unlock(uv_mutex_t *mutex)
static void uv__custom_sem_post(uv_sem_t *sem_)
void uv_rwlock_destroy(uv_rwlock_t *rwlock)
void uv_once(uv_once_t *guard, void(*callback)(void))
int uv_mutex_init_recursive(uv_mutex_t *mutex)
int uv_barrier_wait(uv_barrier_t *barrier)
void uv_barrier_destroy(uv_barrier_t *barrier)
unsigned __int64 uint64_t
void uv_key_delete(uv_key_t *key)
pthread_mutex_t uv_mutex_t
static void callback(void *arg, int status, int timeouts, struct hostent *host)
UV_PLATFORM_SEM_T uv_sem_t
static void uv__custom_sem_wait(uv_sem_t *sem_)
int sem_destroy(UV_PLATFORM_SEM_T *semid)
int uv_thread_equal(const uv_thread_t *t1, const uv_thread_t *t2)
void uv_sem_post(uv_sem_t *sem)
void uv_rwlock_rdunlock(uv_rwlock_t *rwlock)
uv_thread_t uv_thread_self(void)
OPENSSL_EXPORT X509_ATTRIBUTE * attr
static int uv__custom_sem_init(uv_sem_t *sem_, unsigned int value)
void * uv_key_get(uv_key_t *key)
int sem_init(UV_PLATFORM_SEM_T *semid, int pshared, unsigned int value)
int uv_rwlock_trywrlock(uv_rwlock_t *rwlock)
int uv_sem_init(uv_sem_t *sem, unsigned int value)
void uv_cond_signal(uv_cond_t *cond)
static void uv__custom_sem_destroy(uv_sem_t *sem_)
int uv_thread_join(uv_thread_t *tid)
static int uv__sem_trywait(uv_sem_t *sem)
int uv_mutex_init(uv_mutex_t *mutex)
int uv_cond_init(uv_cond_t *cond)
int uv_rwlock_tryrdlock(uv_rwlock_t *rwlock)
void uv_rwlock_rdlock(uv_rwlock_t *rwlock)
int uv_thread_create(uv_thread_t *tid, void(*entry)(void *arg), void *arg)
void uv_cond_wait(uv_cond_t *cond, uv_mutex_t *mutex)
static void uv__sem_destroy(uv_sem_t *sem)
void uv_cond_destroy(uv_cond_t *cond)
int sem_trywait(UV_PLATFORM_SEM_T *semid)
static uv_rwlock_t rwlock
#define platform_needs_custom_semaphore
void uv_cond_broadcast(uv_cond_t *cond)
static int uv__custom_sem_trywait(uv_sem_t *sem_)
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:37