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

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

Issue 2334533002: base: Move renderer threads to the appropriate cpuset. (Closed)
Patch Set: Created 4 years, 3 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 (c) 2012 The Chromium Authors. All rights reserved. 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 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 <pthread.h> 8 #include <pthread.h>
9 #include <sched.h> 9 #include <sched.h>
10 #include <stddef.h> 10 #include <stddef.h>
11 #include <stdint.h> 11 #include <stdint.h>
12 #include <sys/resource.h> 12 #include <sys/resource.h>
13 #include <sys/time.h> 13 #include <sys/time.h>
14 #include <sys/types.h> 14 #include <sys/types.h>
15 #include <unistd.h> 15 #include <unistd.h>
16 16
17 #include <memory> 17 #include <memory>
18 18
19 #include "base/debug/activity_tracker.h" 19 #include "base/debug/activity_tracker.h"
20 #include "base/lazy_instance.h" 20 #include "base/lazy_instance.h"
21 #include "base/logging.h" 21 #include "base/logging.h"
22 #include "base/threading/platform_thread_internal_posix.h" 22 #include "base/threading/platform_thread_internal_posix.h"
23 #include "base/threading/thread_id_name_manager.h" 23 #include "base/threading/thread_id_name_manager.h"
24 #include "base/threading/thread_restrictions.h" 24 #include "base/threading/thread_restrictions.h"
25 #include "build/build_config.h" 25 #include "build/build_config.h"
26 26
27 #if defined(OS_LINUX) 27 #if defined(OS_LINUX)
28 #include "base/files/file_util.h"
29 #include "base/strings/string_number_conversions.h"
30 #include <sys/syscall.h> 28 #include <sys/syscall.h>
31 #endif 29 #endif
32 30
33 namespace base { 31 namespace base {
34 32
35 void InitThreading(); 33 void InitThreading();
36 void TerminateOnThread(); 34 void TerminateOnThread();
37 size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes); 35 size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes);
38 36
39 namespace { 37 namespace {
40 38
41 #if defined(OS_LINUX)
42 const FilePath::CharType kCpusetDirectory[] =
43 FILE_PATH_LITERAL("/sys/fs/cgroup/cpuset/chrome");
44 #endif
45
46 struct ThreadParams { 39 struct ThreadParams {
47 ThreadParams() 40 ThreadParams()
48 : delegate(NULL), joinable(false), priority(ThreadPriority::NORMAL) {} 41 : delegate(NULL), joinable(false), priority(ThreadPriority::NORMAL) {}
49 42
50 PlatformThread::Delegate* delegate; 43 PlatformThread::Delegate* delegate;
51 bool joinable; 44 bool joinable;
52 ThreadPriority priority; 45 ThreadPriority priority;
53 }; 46 };
54 47
55 void* ThreadFunc(void* params) { 48 void* ThreadFunc(void* params) {
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 return geteuid() == 0; 240 return geteuid() == 0;
248 #endif // defined(OS_NACL) 241 #endif // defined(OS_NACL)
249 } 242 }
250 243
251 // static 244 // static
252 void PlatformThread::SetCurrentThreadPriority(ThreadPriority priority) { 245 void PlatformThread::SetCurrentThreadPriority(ThreadPriority priority) {
253 #if defined(OS_NACL) 246 #if defined(OS_NACL)
254 NOTIMPLEMENTED(); 247 NOTIMPLEMENTED();
255 #else 248 #else
256 #if defined(OS_LINUX) 249 #if defined(OS_LINUX)
257 // Move thread into the appropriate cpuset when chrome cpuset directory 250 SetThreadAffinity(PlatformThread::CurrentId(), priority);
258 // exists. Threads with BACKGROUND priority are move to the "non-urgent" 251 #endif
259 // cpuset and threads with DISPLAY and REALTIME_AUDIO priority are moved
260 // to "urgent" cpuset.
261 FilePath cpuset_filepath(kCpusetDirectory);
262 switch (priority) {
263 case ThreadPriority::NORMAL:
264 break;
265 case ThreadPriority::BACKGROUND:
266 cpuset_filepath = cpuset_filepath.Append(FILE_PATH_LITERAL("non-urgent"));
267 break;
268 case ThreadPriority::DISPLAY:
269 case ThreadPriority::REALTIME_AUDIO:
270 cpuset_filepath = cpuset_filepath.Append(FILE_PATH_LITERAL("urgent"));
271 break;
272 }
273 if (DirectoryExists(cpuset_filepath)) {
274 FilePath tasks_filepath =
275 cpuset_filepath.Append(FILE_PATH_LITERAL("tasks"));
276 std::string tid = IntToString(PlatformThread::CurrentId());
277 int bytes_written = WriteFile(tasks_filepath, tid.c_str(), tid.size());
278 if (bytes_written != static_cast<int>(tid.size())) {
279 DVLOG(1) << "Failed to add " << tid << " to " << tasks_filepath.value();
280 }
281 }
282 #endif // defined(OS_LINUX)
283 252
284 if (internal::SetCurrentThreadPriorityForPlatform(priority)) 253 if (internal::SetCurrentThreadPriorityForPlatform(priority))
285 return; 254 return;
286 255
287 // setpriority(2) should change the whole thread group's (i.e. process) 256 // setpriority(2) should change the whole thread group's (i.e. process)
288 // priority. However, as stated in the bugs section of 257 // priority. However, as stated in the bugs section of
289 // http://man7.org/linux/man-pages/man2/getpriority.2.html: "under the current 258 // http://man7.org/linux/man-pages/man2/getpriority.2.html: "under the current
290 // Linux/NPTL implementation of POSIX threads, the nice value is a per-thread 259 // Linux/NPTL implementation of POSIX threads, the nice value is a per-thread
291 // attribute". Also, 0 is prefered to the current thread id since it is 260 // attribute". Also, 0 is prefered to the current thread id since it is
292 // equivalent but makes sandboxing easier (https://crbug.com/399473). 261 // equivalent but makes sandboxing easier (https://crbug.com/399473).
(...skipping 28 matching lines...) Expand all
321 return ThreadPriority::NORMAL; 290 return ThreadPriority::NORMAL;
322 } 291 }
323 292
324 return internal::NiceValueToThreadPriority(nice_value); 293 return internal::NiceValueToThreadPriority(nice_value);
325 #endif // !defined(OS_NACL) 294 #endif // !defined(OS_NACL)
326 } 295 }
327 296
328 #endif // !defined(OS_MACOSX) 297 #endif // !defined(OS_MACOSX)
329 298
330 } // namespace base 299 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698