1b486a98aadc95d80548953410cf23edba62259faAndreas Gampe/* 2b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * Copyright (C) 2011 The Android Open Source Project 3b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * 4b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * Licensed under the Apache License, Version 2.0 (the "License"); 5b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * you may not use this file except in compliance with the License. 6b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * You may obtain a copy of the License at 7b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * 8b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * http://www.apache.org/licenses/LICENSE-2.0 9b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * 10b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * Unless required by applicable law or agreed to in writing, software 11b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * distributed under the License is distributed on an "AS IS" BASIS, 12b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * See the License for the specific language governing permissions and 14b486a98aadc95d80548953410cf23edba62259faAndreas Gampe * limitations under the License. 15b486a98aadc95d80548953410cf23edba62259faAndreas Gampe */ 16b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 17b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#ifndef ART_RUNTIME_THREAD_CURRENT_INL_H_ 18b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#define ART_RUNTIME_THREAD_CURRENT_INL_H_ 19b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 20b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#include "thread.h" 21b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 22b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#ifdef ART_TARGET_ANDROID 23b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#include <bionic_tls.h> // Access to our own TLS slot. 24b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#endif 25b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 26b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#include <pthread.h> 27b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 28b486a98aadc95d80548953410cf23edba62259faAndreas Gampenamespace art { 29b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 30b486a98aadc95d80548953410cf23edba62259faAndreas Gampeinline Thread* Thread::Current() { 31b486a98aadc95d80548953410cf23edba62259faAndreas Gampe // We rely on Thread::Current returning null for a detached thread, so it's not obvious 32b486a98aadc95d80548953410cf23edba62259faAndreas Gampe // that we can replace this with a direct %fs access on x86. 33b486a98aadc95d80548953410cf23edba62259faAndreas Gampe if (!is_started_) { 34b486a98aadc95d80548953410cf23edba62259faAndreas Gampe return nullptr; 35b486a98aadc95d80548953410cf23edba62259faAndreas Gampe } else { 36b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#ifdef ART_TARGET_ANDROID 37b486a98aadc95d80548953410cf23edba62259faAndreas Gampe void* thread = __get_tls()[TLS_SLOT_ART_THREAD_SELF]; 38b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#else 39b486a98aadc95d80548953410cf23edba62259faAndreas Gampe void* thread = pthread_getspecific(Thread::pthread_key_self_); 40b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#endif 41b486a98aadc95d80548953410cf23edba62259faAndreas Gampe return reinterpret_cast<Thread*>(thread); 42b486a98aadc95d80548953410cf23edba62259faAndreas Gampe } 43b486a98aadc95d80548953410cf23edba62259faAndreas Gampe} 44b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 45b486a98aadc95d80548953410cf23edba62259faAndreas Gampe} // namespace art 46b486a98aadc95d80548953410cf23edba62259faAndreas Gampe 47b486a98aadc95d80548953410cf23edba62259faAndreas Gampe#endif // ART_RUNTIME_THREAD_CURRENT_INL_H_ 48