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