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