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