Chromium Code Reviews| Index: native_client_sdk/src/libraries/nacl_io/h_errno.c |
| diff --git a/native_client_sdk/src/libraries/nacl_io/h_errno.c b/native_client_sdk/src/libraries/nacl_io/h_errno.c |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..11c28225e8c7573fa004a6d74f1b47af62434d42 |
| --- /dev/null |
| +++ b/native_client_sdk/src/libraries/nacl_io/h_errno.c |
| @@ -0,0 +1,39 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
|
binji
2014/04/02 18:35:53
2014
noelallen1
2014/04/03 17:58:52
Done.
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "nacl_io/ossocket.h" |
| + |
| +#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |
| + |
| +#include <stdlib.h> |
| +#include <pthread.h> |
| + |
| +static pthread_key_t __h_errno_key; |
|
binji
2014/04/02 18:35:53
identifiers that begin with __ are reserved. Chrom
noelallen1
2014/04/03 17:58:52
Done.
|
| +static pthread_once_t __h_errno_once = PTHREAD_ONCE_INIT; |
| + |
| +static void __h_errno_create() { |
| + pthread_key_create(&__h_errno_key, NULL); |
| +} |
| + |
| +int *__h_errno_location() { |
| + 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__) |
| +int *__get_h_errno() { |
| + return __h_errno_location(); |
| +} |
| +#endif |
| + |
| +#endif // defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__) |