Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Side by Side Diff: base/threading/platform_thread_freebsd.cc

Issue 1015503002: Deduplicate PlatformThread's POSIX implementations of SetThreadPriority. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@background_threads
Patch Set: more fixes Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/threading/platform_thread.h" 5 #include "base/threading/platform_thread.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <sched.h> 8 #include <sched.h>
9 9
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/safe_strerror_posix.h"
14 #include "base/threading/thread_id_name_manager.h" 12 #include "base/threading/thread_id_name_manager.h"
15 #include "base/threading/thread_restrictions.h"
16 #include "base/tracked_objects.h" 13 #include "base/tracked_objects.h"
17 14
18 #if !defined(OS_NACL) 15 #if !defined(OS_NACL)
19 #include <sys/resource.h> 16 #include <pthread.h>
20 #include <sys/syscall.h> 17 #include <sys/prctl.h>
21 #include <sys/time.h>
22 #include <sys/types.h> 18 #include <sys/types.h>
23 #include <unistd.h> 19 #include <unistd.h>
24 #endif 20 #endif
25 21
26 namespace base { 22 namespace base {
27 23
24 namespace internal {
25
28 namespace { 26 namespace {
29 int ThreadNiceValue(ThreadPriority priority) { 27 const struct sched_param kRealTimePrio = {8};
rvargas (doing something else) 2015/03/17 22:15:21 nit: { 8 }
gab 2015/03/18 19:01:05 As mentioned in another comment, this is the outpu
30 switch (priority) { 28 } // namespace
31 case kThreadPriority_RealtimeAudio: 29
32 return -10; 30 const ThreadPriorityToNiceValuePair kThreadPriorityToNiceValueMap[4] = {
33 case kThreadPriority_Background: 31 {kThreadPriority_RealtimeAudio, -10},
34 return 10; 32 {kThreadPriority_Background, 10},
35 case kThreadPriority_Normal: 33 {kThreadPriority_Normal, 0},
36 return 0; 34 {kThreadPriority_Display, -6},
37 case kThreadPriority_Display:
38 return -6;
39 default:
40 NOTREACHED() << "Unknown priority.";
41 return 0;
42 }
43 } 35 }
44 } // namespace 36
37 bool HandleSetThreadPriorityForPlatform(PlatformThreadHandle handle,
38 ThreadPriority priority) {
39 #if !defined(OS_NACL)
40 // Handle real time priority the Linux way if possible.
rvargas (doing something else) 2015/03/17 22:15:21 nit: This comment sounds weird. Why is pthread_set
gab 2015/03/18 19:01:05 Removed comment, was trying to justify it somehow,
41 return priority == kThreadPriority_RealtimeAudio &&
42 pthread_setschedparam(pthread_self(), SCHED_RR, &kRealTimePrio);
43 #else
44 return false;
45 #endif
46 }
47
48 } // namespace internal
45 49
46 // static 50 // static
47 void PlatformThread::SetName(const char* name) { 51 void PlatformThread::SetName(const char* name) {
48 ThreadIdNameManager::GetInstance()->SetName(CurrentId(), name); 52 ThreadIdNameManager::GetInstance()->SetName(CurrentId(), name);
49 tracked_objects::ThreadData::InitializeThreadContext(name); 53 tracked_objects::ThreadData::InitializeThreadContext(name);
50 54
51 #if !defined(OS_NACL) 55 #if !defined(OS_NACL)
52 // On FreeBSD we can get the thread names to show up in the debugger by 56 // On FreeBSD we can get the thread names to show up in the debugger by
53 // setting the process name for the LWP. We don't want to do this for the 57 // setting the process name for the LWP. We don't want to do this for the
54 // main thread because that would rename the process, causing tools like 58 // main thread because that would rename the process, causing tools like
55 // killall to stop working. 59 // killall to stop working.
56 if (PlatformThread::CurrentId() == getpid()) 60 if (PlatformThread::CurrentId() == getpid())
57 return; 61 return;
58 setproctitle("%s", name); 62 setproctitle("%s", name);
59 #endif // !defined(OS_NACL) 63 #endif // !defined(OS_NACL)
60 } 64 }
61 65
62 // static
63 void PlatformThread::SetThreadPriority(PlatformThreadHandle handle,
64 ThreadPriority priority) {
65 #if !defined(OS_NACL)
66 if (priority == kThreadPriority_RealtimeAudio) {
67 const struct sched_param kRealTimePrio = { 8 };
68 if (pthread_setschedparam(pthread_self(), SCHED_RR, &kRealTimePrio) == 0) {
69 // Got real time priority, no need to set nice level.
70 return;
71 }
72 }
73
74 // setpriority(2) will set a thread's priority if it is passed a tid as
75 // the 'process identifier', not affecting the rest of the threads in the
76 // process. Setting this priority will only succeed if the user has been
77 // granted permission to adjust nice values on the system.
78 DCHECK_NE(handle.id_, kInvalidThreadId);
79 const int kNiceSetting = ThreadNiceValue(priority);
80 if (setpriority(PRIO_PROCESS, handle.id_, kNiceSetting)) {
81 DVPLOG(1) << "Failed to set nice value of thread ("
82 << handle.id_ << ") to " << kNiceSetting;
83 }
84 #endif // !defined(OS_NACL)
85 }
86
87 void InitThreading() {} 66 void InitThreading() {}
88 67
89 void InitOnThread() {} 68 void InitOnThread() {}
90 69
91 void TerminateOnThread() {} 70 void TerminateOnThread() {}
92 71
93 size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) { 72 size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) {
94 #if !defined(THREAD_SANITIZER) 73 #if !defined(THREAD_SANITIZER)
95 return 0; 74 return 0;
96 #else 75 #else
97 // ThreadSanitizer bloats the stack heavily. Evidence has been that the 76 // ThreadSanitizer bloats the stack heavily. Evidence has been that the
98 // default stack size isn't enough for some browser tests. 77 // default stack size isn't enough for some browser tests.
99 return 2 * (1 << 23); // 2 times 8192K (the default stack size on Linux). 78 return 2 * (1 << 23); // 2 times 8192K (the default stack size on Linux).
100 #endif 79 #endif
101 } 80 }
102 81
103 } // namespace base 82 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698