OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "nacl_io/ossocket.h" | 5 #include "nacl_io/ossocket.h" |
6 | 6 |
7 #if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) | 7 #if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |
8 | 8 |
9 static __thread int __h_errno__; | 9 #include <stdlib.h> |
10 #include <pthread.h> | |
11 | |
12 static pthread_key_t __h_errno_key; | |
13 static pthread_once_t __h_errno_once = PTHREAD_ONCE_INIT; | |
14 | |
15 static void __h_errno_create() { | |
16 pthread_key_create(&__h_errno_key, NULL); | |
17 } | |
10 | 18 |
11 extern "C" int *__h_errno_location() { | 19 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.
| |
12 return &__h_errno__; | 20 int* h_errno_ptr; |
21 pthread_once(&__h_errno_once, __h_errno_create); | |
22 h_errno_ptr = (int *) pthread_getspecific(__h_errno_key); | |
23 | |
24 if (NULL == h_errno_ptr) { | |
25 h_errno_ptr = (int *) malloc(sizeof(int)); | |
26 pthread_setspecific(__h_errno_key, h_errno_ptr); | |
27 *h_errno_ptr = 0; | |
28 } | |
29 | |
30 return h_errno_ptr; | |
13 } | 31 } |
14 | 32 |
33 #if defined(__BIONIC__) | |
34 extern "C" int *__get_h_errno() { | |
35 return __h_errno_location(); | |
36 } | |
37 #endif | |
38 | |
15 #endif // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) | 39 #endif // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |
OLD | NEW |