Chromium Code Reviews| Index: base/threading/platform_thread_posix.cc |
| diff --git a/base/threading/platform_thread_posix.cc b/base/threading/platform_thread_posix.cc |
| index 5c5023b1c27a996b2b4c617653d7bbefd57ca904..7b20b854e6c277c287ea7defa42274041243460a 100644 |
| --- a/base/threading/platform_thread_posix.cc |
| +++ b/base/threading/platform_thread_posix.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/safe_strerror_posix.h" |
| +#include "base/scoped_clear_errno.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/threading/platform_thread_internal_posix.h" |
| #include "base/threading/thread_id_name_manager.h" |
| @@ -232,12 +233,15 @@ void PlatformThread::Join(PlatformThreadHandle thread_handle) { |
| CHECK_EQ(0, pthread_join(thread_handle.handle_, NULL)); |
| } |
| -// Mac has its own SetThreadPriority() implementation. |
| +// Mac has its own Set/GetThreadPriority() implementations. |
| #if !defined(OS_MACOSX) |
| + |
| // static |
| void PlatformThread::SetThreadPriority(PlatformThreadHandle handle, |
| ThreadPriority priority) { |
| -#if !defined(OS_NACL) |
| +#if defined(OS_NACL) |
| + NOTIMPLEMENTED(); |
| +#else |
| if (internal::HandleSetThreadPriorityForPlatform(handle, priority)) |
| return; |
| @@ -255,8 +259,38 @@ void PlatformThread::SetThreadPriority(PlatformThreadHandle handle, |
| DVPLOG(1) << "Failed to set nice value of thread (" << handle.id_ << ") to " |
| << nice_setting; |
| } |
| +#endif // defined(OS_NACL) |
| +} |
| + |
| +// static |
| +ThreadPriority PlatformThread::GetThreadPriority(PlatformThreadHandle handle) { |
| +#if defined(OS_NACL) |
| + NOTIMPLEMENTED(); |
| + return kThreadPriority_Normal; |
| +#else |
| + // Mirrors SetThreadPriority()'s implementation. |
| + ThreadPriority platform_specific_priority; |
| + if (internal::HandleGetThreadPriorityForPlatform( |
| + handle, &platform_specific_priority)) { |
| + return platform_specific_priority; |
| + } |
| + |
| + DCHECK_NE(handle.id_, kInvalidThreadId); |
| + const PlatformThreadId current_id = PlatformThread::CurrentId(); |
| + // Need to clear errno before calling getpriority(): |
| + // http://man7.org/linux/man-pages/man2/getpriority.2.html |
| + ScopedClearErrno clear_errno; |
|
rvargas (doing something else)
2015/03/19 22:19:21
errno = 0 instead?
gab
2015/03/30 20:14:45
I don't know much about Chromium POSIX development
rvargas (doing something else)
2015/03/30 22:31:22
There is no contract on base to preserve errno (or
gab
2015/03/31 14:02:33
Done.
|
| + int nice_value = |
| + getpriority(PRIO_PROCESS, handle.id_ == current_id ? 0 : handle.id_); |
| + if (errno != 0) { |
| + DVPLOG(1) << "Failed to get nice value of thread (" << handle.id_ << ")"; |
| + return kThreadPriority_Normal; |
| + } |
| + |
| + return internal::NiceValueToThreadPriority(nice_value); |
| #endif // !defined(OS_NACL) |
| } |
| + |
| #endif // !defined(OS_MACOSX) |
| } // namespace base |