Index: native_client_sdk/src/libraries/nacl_io/h_errno.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/h_errno.cc b/native_client_sdk/src/libraries/nacl_io/h_errno.cc |
index 5f328edd1696b41b848d451bca43b3581a70371d..9f7ede0092f1526bbcc804816d5ac9cd9861fd97 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/h_errno.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/h_errno.cc |
@@ -6,10 +6,34 @@ |
#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |
-static __thread int __h_errno__; |
+#include <stdlib.h> |
+#include <pthread.h> |
+ |
+static pthread_key_t __h_errno_key; |
+static pthread_once_t __h_errno_once = PTHREAD_ONCE_INIT; |
+ |
+static void __h_errno_create() { |
+ pthread_key_create(&__h_errno_key, NULL); |
+} |
extern "C" int *__h_errno_location() { |
Sam Clegg
2014/03/27 00:10:02
Make this into a .c file and drop the extern "C"s?
noelallen1
2014/03/27 18:13:48
Done.
|
- return &__h_errno__; |
+ int* h_errno_ptr; |
+ pthread_once(&__h_errno_once, __h_errno_create); |
+ h_errno_ptr = (int *) pthread_getspecific(__h_errno_key); |
+ |
+ if (NULL == h_errno_ptr) { |
+ h_errno_ptr = (int *) malloc(sizeof(int)); |
+ pthread_setspecific(__h_errno_key, h_errno_ptr); |
+ *h_errno_ptr = 0; |
+ } |
+ |
+ return h_errno_ptr; |
+} |
+ |
+#if defined(__BIONIC__) |
+extern "C" int *__get_h_errno() { |
+ return __h_errno_location(); |
} |
+#endif |
#endif // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |