| Index: base/threading/platform_thread_linux.cc
|
| diff --git a/base/threading/platform_thread_linux.cc b/base/threading/platform_thread_linux.cc
|
| index 9f7437418a7299ec6ab92d80b1be6735f6b9b9fa..48cf7443f7d5156b31624318bc0a18d2aba35e5c 100644
|
| --- a/base/threading/platform_thread_linux.cc
|
| +++ b/base/threading/platform_thread_linux.cc
|
| @@ -27,6 +27,7 @@ namespace internal {
|
| namespace {
|
| #if !defined(OS_NACL)
|
| const struct sched_param kRealTimePrio = {8};
|
| +const struct sched_param kResetPrio = {0};
|
| #endif
|
| } // namespace
|
|
|
| @@ -37,11 +38,18 @@ const ThreadPriorityToNiceValuePair kThreadPriorityToNiceValueMap[4] = {
|
| {ThreadPriority::REALTIME_AUDIO, -10},
|
| };
|
|
|
| -bool SetThreadPriorityForPlatform(PlatformThreadHandle handle,
|
| - ThreadPriority priority) {
|
| +bool SetCurrentThreadPriorityForPlatform(ThreadPriority priority) {
|
| #if !defined(OS_NACL)
|
| - // TODO(gab): Assess the correctness of using |pthread_self()| below instead
|
| - // of |handle|. http://crbug.com/468793.
|
| + ThreadPriority current_priority;
|
| + if (priority != ThreadPriority::REALTIME_AUDIO &&
|
| + GetCurrentThreadPriorityForPlatform(¤t_priority) &&
|
| + current_priority == ThreadPriority::REALTIME_AUDIO) {
|
| + // If the pthread's round-robin scheduler is already enabled, and the new
|
| + // priority will use setpriority() instead, the pthread scheduler should be
|
| + // reset to use SCHED_OTHER so that setpriority() just works.
|
| + pthread_setschedparam(pthread_self(), SCHED_OTHER, &kResetPrio);
|
| + return false;
|
| + }
|
| return priority == ThreadPriority::REALTIME_AUDIO &&
|
| pthread_setschedparam(pthread_self(), SCHED_RR, &kRealTimePrio) == 0;
|
| #else
|
| @@ -49,13 +57,10 @@ bool SetThreadPriorityForPlatform(PlatformThreadHandle handle,
|
| #endif
|
| }
|
|
|
| -bool GetThreadPriorityForPlatform(PlatformThreadHandle handle,
|
| - ThreadPriority* priority) {
|
| +bool GetCurrentThreadPriorityForPlatform(ThreadPriority* priority) {
|
| #if !defined(OS_NACL)
|
| int maybe_sched_rr = 0;
|
| struct sched_param maybe_realtime_prio = {0};
|
| - // TODO(gab): Assess the correctness of using |pthread_self()| below instead
|
| - // of |handle|. http://crbug.com/468793.
|
| if (pthread_getschedparam(pthread_self(), &maybe_sched_rr,
|
| &maybe_realtime_prio) == 0 &&
|
| maybe_sched_rr == SCHED_RR &&
|
|
|