epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "base/threading/platform_thread.h" |
| 6 | |
| 7 | #include <errno.h> |
avi | 5730099 | 2015-12-25 06:53:59 +0900 | [diff] [blame] | 8 | #include <stddef.h> |
apatole@nvidia.com | 60d0534 | 2014-02-13 23:17:25 +0900 | [diff] [blame] | 9 | #include <sys/prctl.h> |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 10 | #include <sys/resource.h> |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 11 | #include <sys/types.h> |
| 12 | #include <unistd.h> |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 13 | |
| 14 | #include "base/android/jni_android.h" |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 15 | #include "base/lazy_instance.h" |
| 16 | #include "base/logging.h" |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 17 | #include "base/threading/platform_thread_internal_posix.h" |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 18 | #include "base/threading/thread_id_name_manager.h" |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 19 | #include "jni/ThreadUtils_jni.h" |
| 20 | |
| 21 | namespace base { |
| 22 | |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 23 | namespace internal { |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 24 | |
reveman | 636ac80 | 2016-02-25 12:42:43 +0900 | [diff] [blame] | 25 | // - BACKGROUND corresponds to Android's PRIORITY_BACKGROUND = 10 value and can |
| 26 | // result in heavy throttling and force the thread onto a little core on |
| 27 | // big.LITTLE devices. |
reveman | 55f05e0 | 2016-02-25 04:22:09 +0900 | [diff] [blame] | 28 | // - DISPLAY corresponds to Android's PRIORITY_DISPLAY = -4 value. |
reveman | 636ac80 | 2016-02-25 12:42:43 +0900 | [diff] [blame] | 29 | // - REALTIME_AUDIO corresponds to Android's PRIORITY_AUDIO = -16 value. |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 30 | const ThreadPriorityToNiceValuePair kThreadPriorityToNiceValueMap[4] = { |
reveman | 636ac80 | 2016-02-25 12:42:43 +0900 | [diff] [blame] | 31 | {ThreadPriority::BACKGROUND, 10}, |
gab | 5285ef9 | 2015-04-02 08:05:02 +0900 | [diff] [blame] | 32 | {ThreadPriority::NORMAL, 0}, |
reveman | 55f05e0 | 2016-02-25 04:22:09 +0900 | [diff] [blame] | 33 | {ThreadPriority::DISPLAY, -4}, |
gab | 5285ef9 | 2015-04-02 08:05:02 +0900 | [diff] [blame] | 34 | {ThreadPriority::REALTIME_AUDIO, -16}, |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 35 | }; |
| 36 | |
toyoshim | bdebfa1 | 2015-07-14 18:42:03 +0900 | [diff] [blame] | 37 | bool SetCurrentThreadPriorityForPlatform(ThreadPriority priority) { |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 38 | // On Android, we set the Audio priority through JNI as Audio priority |
| 39 | // will also allow the process to run while it is backgrounded. |
gab | 5285ef9 | 2015-04-02 08:05:02 +0900 | [diff] [blame] | 40 | if (priority == ThreadPriority::REALTIME_AUDIO) { |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 41 | JNIEnv* env = base::android::AttachCurrentThread(); |
| 42 | Java_ThreadUtils_setThreadPriorityAudio(env, PlatformThread::CurrentId()); |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 43 | return true; |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 44 | } |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 45 | return false; |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 46 | } |
| 47 | |
toyoshim | bdebfa1 | 2015-07-14 18:42:03 +0900 | [diff] [blame] | 48 | bool GetCurrentThreadPriorityForPlatform(ThreadPriority* priority) { |
ajith.v | 74e6e8b | 2015-10-01 00:27:40 +0900 | [diff] [blame] | 49 | DCHECK(priority); |
| 50 | *priority = ThreadPriority::NORMAL; |
| 51 | JNIEnv* env = base::android::AttachCurrentThread(); |
| 52 | if (Java_ThreadUtils_isThreadPriorityAudio( |
| 53 | env, PlatformThread::CurrentId())) { |
| 54 | *priority = ThreadPriority::REALTIME_AUDIO; |
| 55 | return true; |
| 56 | } |
gab | 1232dda | 2015-04-02 02:10:06 +0900 | [diff] [blame] | 57 | return false; |
| 58 | } |
| 59 | |
gab | 15b5300 | 2015-03-20 04:08:18 +0900 | [diff] [blame] | 60 | } // namespace internal |
| 61 | |
dbeam | f8037ff | 2015-05-05 08:00:04 +0900 | [diff] [blame] | 62 | void PlatformThread::SetName(const std::string& name) { |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 63 | ThreadIdNameManager::GetInstance()->SetName(CurrentId(), name); |
apatole@nvidia.com | 60d0534 | 2014-02-13 23:17:25 +0900 | [diff] [blame] | 64 | |
| 65 | // Like linux, on android we can get the thread names to show up in the |
| 66 | // debugger by setting the process name for the LWP. |
| 67 | // We don't want to do this for the main thread because that would rename |
| 68 | // the process, causing tools like killall to stop working. |
| 69 | if (PlatformThread::CurrentId() == getpid()) |
| 70 | return; |
| 71 | |
| 72 | // Set the name for the LWP (which gets truncated to 15 characters). |
dbeam | f8037ff | 2015-05-05 08:00:04 +0900 | [diff] [blame] | 73 | int err = prctl(PR_SET_NAME, name.c_str()); |
apatole@nvidia.com | 60d0534 | 2014-02-13 23:17:25 +0900 | [diff] [blame] | 74 | if (err < 0 && errno != EPERM) |
| 75 | DPLOG(ERROR) << "prctl(PR_SET_NAME)"; |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 76 | } |
| 77 | |
| 78 | |
| 79 | void InitThreading() { |
| 80 | } |
| 81 | |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 82 | void TerminateOnThread() { |
| 83 | base::android::DetachFromVM(); |
| 84 | } |
| 85 | |
| 86 | size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) { |
eugenis@chromium.org | 5833ee2 | 2014-01-29 20:15:19 +0900 | [diff] [blame] | 87 | #if !defined(ADDRESS_SANITIZER) |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 88 | return 0; |
eugenis@chromium.org | 5833ee2 | 2014-01-29 20:15:19 +0900 | [diff] [blame] | 89 | #else |
| 90 | // AddressSanitizer bloats the stack approximately 2x. Default stack size of |
| 91 | // 1Mb is not enough for some tests (see http://crbug.com/263749 for example). |
| 92 | return 2 * (1 << 20); // 2Mb |
| 93 | #endif |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 94 | } |
| 95 | |
epenner@chromium.org | ed1c9ba | 2013-05-22 09:01:38 +0900 | [diff] [blame] | 96 | } // namespace base |