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