Chromium Code Reviews| 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__) |