aboutsummaryrefslogtreecommitdiff
path: root/deps/uv/src/unix
diff options
context:
space:
mode:
Diffstat (limited to 'deps/uv/src/unix')
-rw-r--r--deps/uv/src/unix/atomic-ops.h12
-rw-r--r--deps/uv/src/unix/darwin.c6
-rw-r--r--deps/uv/src/unix/thread.c30
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;
}