1617a3babSopenharmony_ci/*-------------------------------------------------------------------------
2617a3babSopenharmony_ci * dEQP glslang integration
3617a3babSopenharmony_ci * ------------------------
4617a3babSopenharmony_ci *
5617a3babSopenharmony_ci * Copyright 2015 The Android Open Source Project
6617a3babSopenharmony_ci *
7617a3babSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8617a3babSopenharmony_ci * you may not use this file except in compliance with the License.
9617a3babSopenharmony_ci * You may obtain a copy of the License at
10617a3babSopenharmony_ci *
11617a3babSopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12617a3babSopenharmony_ci *
13617a3babSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14617a3babSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15617a3babSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16617a3babSopenharmony_ci * See the License for the specific language governing permissions and
17617a3babSopenharmony_ci * limitations under the License.
18617a3babSopenharmony_ci *
19617a3babSopenharmony_ci *//*!
20617a3babSopenharmony_ci * \file
21617a3babSopenharmony_ci * \brief glslang OS interface.
22617a3babSopenharmony_ci *//*--------------------------------------------------------------------*/
23617a3babSopenharmony_ci
24617a3babSopenharmony_ci#include "osinclude.h"
25617a3babSopenharmony_ci
26617a3babSopenharmony_ci#include "deThread.h"
27617a3babSopenharmony_ci#include "deThreadLocal.h"
28617a3babSopenharmony_ci#include "deMutex.h"
29617a3babSopenharmony_ci
30617a3babSopenharmony_cinamespace glslang
31617a3babSopenharmony_ci{
32617a3babSopenharmony_ci
33617a3babSopenharmony_ciDE_STATIC_ASSERT(sizeof(deThreadLocal)	== sizeof(OS_TLSIndex));
34617a3babSopenharmony_ciDE_STATIC_ASSERT(sizeof(deThread)		== sizeof(void*));
35617a3babSopenharmony_ci
36617a3babSopenharmony_ci// Thread-local
37617a3babSopenharmony_ci
38617a3babSopenharmony_ciOS_TLSIndex OS_AllocTLSIndex (void)
39617a3babSopenharmony_ci{
40617a3babSopenharmony_ci	return (OS_TLSIndex)deThreadLocal_create();
41617a3babSopenharmony_ci}
42617a3babSopenharmony_ci
43617a3babSopenharmony_cibool OS_SetTLSValue (OS_TLSIndex nIndex, void* lpvValue)
44617a3babSopenharmony_ci{
45617a3babSopenharmony_ci	deThreadLocal_set((deThreadLocal)nIndex, lpvValue);
46617a3babSopenharmony_ci	return true;
47617a3babSopenharmony_ci}
48617a3babSopenharmony_ci
49617a3babSopenharmony_cibool OS_FreeTLSIndex (OS_TLSIndex nIndex)
50617a3babSopenharmony_ci{
51617a3babSopenharmony_ci	deThreadLocal_destroy((deThreadLocal)nIndex);
52617a3babSopenharmony_ci	return true;
53617a3babSopenharmony_ci}
54617a3babSopenharmony_ci
55617a3babSopenharmony_civoid* OS_GetTLSValue (OS_TLSIndex nIndex)
56617a3babSopenharmony_ci{
57617a3babSopenharmony_ci	return deThreadLocal_get((deThreadLocal)nIndex);
58617a3babSopenharmony_ci}
59617a3babSopenharmony_ci
60617a3babSopenharmony_ci// Global lock
61617a3babSopenharmony_ci
62617a3babSopenharmony_cistatic deMutex s_globalLock = 0;
63617a3babSopenharmony_ci
64617a3babSopenharmony_civoid InitGlobalLock (void)
65617a3babSopenharmony_ci{
66617a3babSopenharmony_ci	DE_ASSERT(s_globalLock == 0);
67617a3babSopenharmony_ci	s_globalLock = deMutex_create(DE_NULL);
68617a3babSopenharmony_ci}
69617a3babSopenharmony_ci
70617a3babSopenharmony_civoid GetGlobalLock (void)
71617a3babSopenharmony_ci{
72617a3babSopenharmony_ci	deMutex_lock(s_globalLock);
73617a3babSopenharmony_ci}
74617a3babSopenharmony_ci
75617a3babSopenharmony_civoid ReleaseGlobalLock (void)
76617a3babSopenharmony_ci{
77617a3babSopenharmony_ci	deMutex_unlock(s_globalLock);
78617a3babSopenharmony_ci}
79617a3babSopenharmony_ci
80617a3babSopenharmony_ci// Threading
81617a3babSopenharmony_ci
82617a3babSopenharmony_ciDE_STATIC_ASSERT(sizeof(void*) >= sizeof(deThread));
83617a3babSopenharmony_ci
84617a3babSopenharmony_cistatic void EnterGenericThread (void* entry)
85617a3babSopenharmony_ci{
86617a3babSopenharmony_ci	((TThreadEntrypoint)entry)(DE_NULL);
87617a3babSopenharmony_ci}
88617a3babSopenharmony_ci
89617a3babSopenharmony_civoid* OS_CreateThread (TThreadEntrypoint entry)
90617a3babSopenharmony_ci{
91617a3babSopenharmony_ci	return (void*)(deUintptr)deThread_create(EnterGenericThread, (void*)entry, DE_NULL);
92617a3babSopenharmony_ci}
93617a3babSopenharmony_ci
94617a3babSopenharmony_civoid OS_WaitForAllThreads (void* threads, int numThreads)
95617a3babSopenharmony_ci{
96617a3babSopenharmony_ci	for (int ndx = 0; ndx < numThreads; ndx++)
97617a3babSopenharmony_ci	{
98617a3babSopenharmony_ci		const deThread thread = (deThread)(deUintptr)((void**)threads)[ndx];
99617a3babSopenharmony_ci		deThread_join(thread);
100617a3babSopenharmony_ci		deThread_destroy(thread);
101617a3babSopenharmony_ci	}
102617a3babSopenharmony_ci}
103617a3babSopenharmony_ci
104617a3babSopenharmony_civoid OS_Sleep (int milliseconds)
105617a3babSopenharmony_ci{
106617a3babSopenharmony_ci	deSleep(milliseconds);
107617a3babSopenharmony_ci}
108617a3babSopenharmony_ci
109617a3babSopenharmony_civoid OS_DumpMemoryCounters (void)
110617a3babSopenharmony_ci{
111617a3babSopenharmony_ci	// Not used
112617a3babSopenharmony_ci}
113617a3babSopenharmony_ci
114617a3babSopenharmony_ci} // glslang
115