diff options
Diffstat (limited to 'deps/uv/src/unix')
-rw-r--r-- | deps/uv/src/unix/atomic-ops.h | 12 | ||||
-rw-r--r-- | deps/uv/src/unix/darwin.c | 6 | ||||
-rw-r--r-- | deps/uv/src/unix/thread.c | 30 |
3 files changed, 34 insertions, 14 deletions
diff --git a/deps/uv/src/unix/atomic-ops.h b/deps/uv/src/unix/atomic-ops.h index 7e4e64beda..8fb157dcc6 100644 --- a/deps/uv/src/unix/atomic-ops.h +++ b/deps/uv/src/unix/atomic-ops.h @@ -33,6 +33,10 @@ UV_UNUSED(static int cmpxchgi(int* ptr, int oldval, int newval)) { : "r" (newval), "0" (oldval) : "memory"); return out; +#elif defined(_AIX) && defined(__xlC__) + const int out = (*(volatile int*) ptr); + __compare_and_swap(ptr, &oldval, newval); + return out; #else return __sync_val_compare_and_swap(ptr, oldval, newval); #endif @@ -46,6 +50,14 @@ UV_UNUSED(static long cmpxchgl(long* ptr, long oldval, long newval)) { : "r" (newval), "0" (oldval) : "memory"); return out; +#elif defined(_AIX) && defined(__xlC__) + const long out = (*(volatile int*) ptr); +# if defined(__64BIT__) + __compare_and_swaplp(ptr, &oldval, newval); +# else + __compare_and_swap(ptr, &oldval, newval); +# endif /* if defined(__64BIT__) */ + return out; #else return __sync_val_compare_and_swap(ptr, oldval, newval); #endif diff --git a/deps/uv/src/unix/darwin.c b/deps/uv/src/unix/darwin.c index 718a81e4c1..dab6ca999d 100644 --- a/deps/uv/src/unix/darwin.c +++ b/deps/uv/src/unix/darwin.c @@ -199,8 +199,10 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { } *cpu_infos = uv__malloc(numcpus * sizeof(**cpu_infos)); - if (!(*cpu_infos)) - return -ENOMEM; /* FIXME(bnoordhuis) Deallocate info? */ + if (!(*cpu_infos)) { + vm_deallocate(mach_task_self(), (vm_address_t)info, msg_type); + return -ENOMEM; + } *count = numcpus; diff --git a/deps/uv/src/unix/thread.c b/deps/uv/src/unix/thread.c index 6080cf5f73..c56a317025 100644 --- a/deps/uv/src/unix/thread.c +++ b/deps/uv/src/unix/thread.c @@ -124,14 +124,14 @@ void uv_mutex_lock(uv_mutex_t* mutex) { int uv_mutex_trylock(uv_mutex_t* mutex) { int err; - /* FIXME(bnoordhuis) EAGAIN means recursive lock limit reached. Arguably - * a bug, should probably abort rather than return -EAGAIN. - */ err = pthread_mutex_trylock(mutex); - if (err && err != EBUSY && err != EAGAIN) - abort(); + if (err) { + if (err != EBUSY && err != EAGAIN) + abort(); + return -EBUSY; + } - return -err; + return 0; } @@ -162,10 +162,13 @@ int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock) { int err; err = pthread_rwlock_tryrdlock(rwlock); - if (err && err != EBUSY && err != EAGAIN) - abort(); + if (err) { + if (err != EBUSY && err != EAGAIN) + abort(); + return -EBUSY; + } - return -err; + return 0; } @@ -185,10 +188,13 @@ int uv_rwlock_trywrlock(uv_rwlock_t* rwlock) { int err; err = pthread_rwlock_trywrlock(rwlock); - if (err && err != EBUSY && err != EAGAIN) - abort(); + if (err) { + if (err != EBUSY && err != EAGAIN) + abort(); + return -EBUSY; + } - return -err; + return 0; } |