// // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #include "compiler/InitializeDll.h" #include "compiler/InitializeGlobals.h" #include "compiler/InitializeParseContext.h" #include "compiler/osinclude.h" OS_TLSIndex ThreadInitializeIndex = OS_INVALID_TLS_INDEX; bool InitProcess() { if (ThreadInitializeIndex != OS_INVALID_TLS_INDEX) { // // Function is re-entrant. // return true; } ThreadInitializeIndex = OS_AllocTLSIndex(); if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) { assert(0 && "InitProcess(): Failed to allocate TLS area for init flag"); return false; } if (!InitializePoolIndex()) { assert(0 && "InitProcess(): Failed to initalize global pool"); return false; } if (!InitializeParseContextIndex()) { assert(0 && "InitProcess(): Failed to initalize parse context"); return false; } return InitThread(); } bool DetachProcess() { bool success = true; if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) return true; success = DetachThread(); if (!FreeParseContextIndex()) success = false; FreePoolIndex(); OS_FreeTLSIndex(ThreadInitializeIndex); ThreadInitializeIndex = OS_INVALID_TLS_INDEX; return success; } bool InitThread() { // // This function is re-entrant // if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) { assert(0 && "InitThread(): Process hasn't been initalised."); return false; } if (OS_GetTLSValue(ThreadInitializeIndex) != 0) return true; InitializeGlobalPools(); if (!InitializeGlobalParseContext()) return false; if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) { assert(0 && "InitThread(): Unable to set init flag."); return false; } return true; } bool DetachThread() { bool success = true; if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) return true; // // Function is re-entrant and this thread may not have been initalised. // if (OS_GetTLSValue(ThreadInitializeIndex) != 0) { if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)0)) { assert(0 && "DetachThread(): Unable to clear init flag."); success = false; } if (!FreeParseContext()) success = false; FreeGlobalPools(); } return success; }