1b85b2756d1e247f8314bb591700fb175d7346631keunyoung/* 2b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Copyright (C) 2011 The Android Open Source Project 3b85b2756d1e247f8314bb591700fb175d7346631keunyoung* 4b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Licensed under the Apache License, Version 2.0 (the "License"); 5b85b2756d1e247f8314bb591700fb175d7346631keunyoung* you may not use this file except in compliance with the License. 6b85b2756d1e247f8314bb591700fb175d7346631keunyoung* You may obtain a copy of the License at 7b85b2756d1e247f8314bb591700fb175d7346631keunyoung* 8b85b2756d1e247f8314bb591700fb175d7346631keunyoung* http://www.apache.org/licenses/LICENSE-2.0 9b85b2756d1e247f8314bb591700fb175d7346631keunyoung* 10b85b2756d1e247f8314bb591700fb175d7346631keunyoung* Unless required by applicable law or agreed to in writing, software 11b85b2756d1e247f8314bb591700fb175d7346631keunyoung* distributed under the License is distributed on an "AS IS" BASIS, 12b85b2756d1e247f8314bb591700fb175d7346631keunyoung* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b85b2756d1e247f8314bb591700fb175d7346631keunyoung* See the License for the specific language governing permissions and 14b85b2756d1e247f8314bb591700fb175d7346631keunyoung* limitations under the License. 15b85b2756d1e247f8314bb591700fb175d7346631keunyoung*/ 16b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "ThreadInfo.h" 17b85b2756d1e247f8314bb591700fb175d7346631keunyoung#include "cutils/threads.h" 18b85b2756d1e247f8314bb591700fb175d7346631keunyoung 19b85b2756d1e247f8314bb591700fb175d7346631keunyoungthread_store_t s_tls = THREAD_STORE_INITIALIZER; 20b85b2756d1e247f8314bb591700fb175d7346631keunyoung 21dcacca1449afecd0604a16c8dc97e2a67c47ce56bohustatic bool sDefaultTlsDestructorCallback(void* ptr) { return true; } 22dcacca1449afecd0604a16c8dc97e2a67c47ce56bohustatic bool (*sTlsDestructorCallback)(void*) = sDefaultTlsDestructorCallback; 23dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu 24b85b2756d1e247f8314bb591700fb175d7346631keunyoungstatic void tlsDestruct(void *ptr) 25b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 26dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu sTlsDestructorCallback(ptr); 27b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (ptr) { 28b85b2756d1e247f8314bb591700fb175d7346631keunyoung EGLThreadInfo *ti = (EGLThreadInfo *)ptr; 29b85b2756d1e247f8314bb591700fb175d7346631keunyoung delete ti->hostConn; 30b85b2756d1e247f8314bb591700fb175d7346631keunyoung delete ti; 31dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu#ifdef __ANDROID__ 32e01d5f47354d9e5cd63ae584daadc5076850851bDavid 'Digit' Turner ((void **)__get_tls())[TLS_SLOT_OPENGL] = NULL; 33dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu#endif 34b85b2756d1e247f8314bb591700fb175d7346631keunyoung } 35b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 36b85b2756d1e247f8314bb591700fb175d7346631keunyoung 37dcacca1449afecd0604a16c8dc97e2a67c47ce56bohuvoid setTlsDestructor(tlsDtorCallback func) { 38dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu sTlsDestructorCallback = func; 39dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu} 40dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu 41dcacca1449afecd0604a16c8dc97e2a67c47ce56bohuEGLThreadInfo *goldfish_get_egl_tls() 42b85b2756d1e247f8314bb591700fb175d7346631keunyoung{ 43dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu EGLThreadInfo* ti = (EGLThreadInfo*)thread_store_get(&s_tls); 44dcacca1449afecd0604a16c8dc97e2a67c47ce56bohu 45b85b2756d1e247f8314bb591700fb175d7346631keunyoung if (ti) return ti; 46b85b2756d1e247f8314bb591700fb175d7346631keunyoung 47b85b2756d1e247f8314bb591700fb175d7346631keunyoung ti = new EGLThreadInfo(); 48b85b2756d1e247f8314bb591700fb175d7346631keunyoung thread_store_set(&s_tls, ti, tlsDestruct); 49b85b2756d1e247f8314bb591700fb175d7346631keunyoung 50b85b2756d1e247f8314bb591700fb175d7346631keunyoung return ti; 51b85b2756d1e247f8314bb591700fb175d7346631keunyoung} 52