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#ifndef __OSINCLUDE_H
8#define __OSINCLUDE_H
9
10//
11// This file contains contains os-specific datatypes and
12// declares any os-specific functions.
13//
14
15#if defined(_WIN32) || defined(_WIN64)
16#define ANGLE_OS_WIN
17#elif defined(__APPLE__) || defined(__linux__) || \
18      defined(__FreeBSD__) || defined(__OpenBSD__) || \
19      defined(__sun)
20#define ANGLE_OS_POSIX
21#else
22#error Unsupported platform.
23#endif
24
25#if defined(ANGLE_USE_NSPR)
26#include "prthread.h"
27#elif defined(ANGLE_OS_WIN)
28#define STRICT
29#define VC_EXTRALEAN 1
30#include <windows.h>
31#elif defined(ANGLE_OS_POSIX)
32#include <pthread.h>
33#include <semaphore.h>
34#include <errno.h>
35#endif  // ANGLE_USE_NSPR
36
37
38#include "compiler/debug.h"
39
40//
41// Thread Local Storage Operations
42//
43#if defined(ANGLE_USE_NSPR)
44typedef PRUintn OS_TLSIndex;
45#define OS_INVALID_TLS_INDEX 0xFFFFFFFF
46#elif defined(ANGLE_OS_WIN)
47typedef DWORD OS_TLSIndex;
48#define OS_INVALID_TLS_INDEX (TLS_OUT_OF_INDEXES)
49#elif defined(ANGLE_OS_POSIX)
50typedef unsigned int OS_TLSIndex;
51#define OS_INVALID_TLS_INDEX 0xFFFFFFFF
52#endif  // ANGLE_USE_NSPR
53
54OS_TLSIndex OS_AllocTLSIndex();
55bool OS_SetTLSValue(OS_TLSIndex nIndex, void *lpvValue);
56bool OS_FreeTLSIndex(OS_TLSIndex nIndex);
57
58inline void* OS_GetTLSValue(OS_TLSIndex nIndex)
59{
60    ASSERT(nIndex != OS_INVALID_TLS_INDEX);
61#if defined(ANGLE_USE_NSPR)
62    return PR_GetThreadPrivate(nIndex);
63#elif defined(ANGLE_OS_WIN)
64    return TlsGetValue(nIndex);
65#elif defined(ANGLE_OS_POSIX)
66    return pthread_getspecific(nIndex);
67#endif  // ANGLE_OS_WIN
68}
69
70#endif // __OSINCLUDE_H
71