1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * dEQP glslang integration
3e5c31af7Sopenharmony_ci * ------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2015 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief glslang OS interface.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "osinclude.h"
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "deThread.h"
27e5c31af7Sopenharmony_ci#include "deThreadLocal.h"
28e5c31af7Sopenharmony_ci#include "deMutex.h"
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_cinamespace glslang
31e5c31af7Sopenharmony_ci{
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_ciDE_STATIC_ASSERT(sizeof(deThreadLocal)	== sizeof(OS_TLSIndex));
34e5c31af7Sopenharmony_ciDE_STATIC_ASSERT(sizeof(deThread)		== sizeof(void*));
35e5c31af7Sopenharmony_ci
36e5c31af7Sopenharmony_ci// Thread-local
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ciOS_TLSIndex OS_AllocTLSIndex (void)
39e5c31af7Sopenharmony_ci{
40e5c31af7Sopenharmony_ci	return (OS_TLSIndex)deThreadLocal_create();
41e5c31af7Sopenharmony_ci}
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_cibool OS_SetTLSValue (OS_TLSIndex nIndex, void* lpvValue)
44e5c31af7Sopenharmony_ci{
45e5c31af7Sopenharmony_ci	deThreadLocal_set((deThreadLocal)nIndex, lpvValue);
46e5c31af7Sopenharmony_ci	return true;
47e5c31af7Sopenharmony_ci}
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_cibool OS_FreeTLSIndex (OS_TLSIndex nIndex)
50e5c31af7Sopenharmony_ci{
51e5c31af7Sopenharmony_ci	deThreadLocal_destroy((deThreadLocal)nIndex);
52e5c31af7Sopenharmony_ci	return true;
53e5c31af7Sopenharmony_ci}
54e5c31af7Sopenharmony_ci
55e5c31af7Sopenharmony_civoid* OS_GetTLSValue (OS_TLSIndex nIndex)
56e5c31af7Sopenharmony_ci{
57e5c31af7Sopenharmony_ci	return deThreadLocal_get((deThreadLocal)nIndex);
58e5c31af7Sopenharmony_ci}
59e5c31af7Sopenharmony_ci
60e5c31af7Sopenharmony_ci// Global lock
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_cistatic deMutex s_globalLock = 0;
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_civoid InitGlobalLock (void)
65e5c31af7Sopenharmony_ci{
66e5c31af7Sopenharmony_ci	DE_ASSERT(s_globalLock == 0);
67e5c31af7Sopenharmony_ci	s_globalLock = deMutex_create(DE_NULL);
68e5c31af7Sopenharmony_ci}
69e5c31af7Sopenharmony_ci
70e5c31af7Sopenharmony_civoid GetGlobalLock (void)
71e5c31af7Sopenharmony_ci{
72e5c31af7Sopenharmony_ci	deMutex_lock(s_globalLock);
73e5c31af7Sopenharmony_ci}
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_civoid ReleaseGlobalLock (void)
76e5c31af7Sopenharmony_ci{
77e5c31af7Sopenharmony_ci	deMutex_unlock(s_globalLock);
78e5c31af7Sopenharmony_ci}
79e5c31af7Sopenharmony_ci
80e5c31af7Sopenharmony_ci// Threading
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ciDE_STATIC_ASSERT(sizeof(void*) >= sizeof(deThread));
83e5c31af7Sopenharmony_ci
84e5c31af7Sopenharmony_cistatic void EnterGenericThread (void* entry)
85e5c31af7Sopenharmony_ci{
86e5c31af7Sopenharmony_ci	((TThreadEntrypoint)entry)(DE_NULL);
87e5c31af7Sopenharmony_ci}
88e5c31af7Sopenharmony_ci
89e5c31af7Sopenharmony_civoid* OS_CreateThread (TThreadEntrypoint entry)
90e5c31af7Sopenharmony_ci{
91e5c31af7Sopenharmony_ci	return (void*)(deUintptr)deThread_create(EnterGenericThread, (void*)entry, DE_NULL);
92e5c31af7Sopenharmony_ci}
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_civoid OS_WaitForAllThreads (void* threads, int numThreads)
95e5c31af7Sopenharmony_ci{
96e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < numThreads; ndx++)
97e5c31af7Sopenharmony_ci	{
98e5c31af7Sopenharmony_ci		const deThread thread = (deThread)(deUintptr)((void**)threads)[ndx];
99e5c31af7Sopenharmony_ci		deThread_join(thread);
100e5c31af7Sopenharmony_ci		deThread_destroy(thread);
101e5c31af7Sopenharmony_ci	}
102e5c31af7Sopenharmony_ci}
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_civoid OS_Sleep (int milliseconds)
105e5c31af7Sopenharmony_ci{
106e5c31af7Sopenharmony_ci	deSleep(milliseconds);
107e5c31af7Sopenharmony_ci}
108e5c31af7Sopenharmony_ci
109e5c31af7Sopenharmony_civoid OS_DumpMemoryCounters (void)
110e5c31af7Sopenharmony_ci{
111e5c31af7Sopenharmony_ci	// Not used
112e5c31af7Sopenharmony_ci}
113e5c31af7Sopenharmony_ci
114e5c31af7Sopenharmony_ci} // glslang
115