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