1a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 2a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Use of this source code is governed by a BSD-style license that can be 4a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// found in the LICENSE file. 5a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 6a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 7a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 8a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// This file contains the posix specific functions 9a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 10a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#include "compiler/osinclude.h" 11a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 12a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#if !defined(ANGLE_OS_POSIX) 13a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#error Trying to build a posix specific file in a non-posix build. 14a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block#endif 15a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 16a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 17a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// Thread Local Storage Operations 18a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block// 19a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve BlockOS_TLSIndex OS_AllocTLSIndex() 20a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 21a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block pthread_key_t pPoolIndex; 22a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 23a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block // 24a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block // Create global pool key. 25a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block // 26a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if ((pthread_key_create(&pPoolIndex, NULL)) != 0) { 27a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block assert(0 && "OS_AllocTLSIndex(): Unable to allocate Thread Local Storage"); 28a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return false; 29a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 30a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block else { 31a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return pPoolIndex; 32a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 33a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 34a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 35a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 36a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockbool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue) 37a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 38a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (nIndex == OS_INVALID_TLS_INDEX) { 39a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); 40a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return false; 41a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 42a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 43a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (pthread_setspecific(nIndex, lpvValue) == 0) 44a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return true; 45a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block else 46a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return false; 47a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 48a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 49a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 50a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Blockbool OS_FreeTLSIndex(OS_TLSIndex nIndex) 51a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block{ 52a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (nIndex == OS_INVALID_TLS_INDEX) { 53a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block assert(0 && "OS_SetTLSValue(): Invalid TLS Index"); 54a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return false; 55a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block } 56a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block 57a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block // 58a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block // Delete the global pool key. 59a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block // 60a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block if (pthread_key_delete(nIndex) == 0) 61a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return true; 62a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block else 63a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block return false; 64a9bfd6c4a32dfd9cc032cb67c6ccb8d09c16f579Steve Block} 65