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

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

Issue 1124763003: Update from https://crrev.com/327068 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: update nacl, buildtools, fix display_change_notifier_unittest Created 5 years, 7 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 <sys/resource.h> 10 #include <sys/resource.h>
(...skipping 21 matching lines...) Expand all
32 void InitOnThread(); 32 void InitOnThread();
33 void TerminateOnThread(); 33 void TerminateOnThread();
34 size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes); 34 size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes);
35 35
36 namespace { 36 namespace {
37 37
38 struct ThreadParams { 38 struct ThreadParams {
39 ThreadParams() 39 ThreadParams()
40 : delegate(NULL), 40 : delegate(NULL),
41 joinable(false), 41 joinable(false),
42 priority(kThreadPriority_Normal), 42 priority(ThreadPriority::NORMAL),
43 handle(NULL), 43 handle(NULL),
44 handle_set(false, false) { 44 handle_set(false, false) {
45 } 45 }
46 46
47 PlatformThread::Delegate* delegate; 47 PlatformThread::Delegate* delegate;
48 bool joinable; 48 bool joinable;
49 ThreadPriority priority; 49 ThreadPriority priority;
50 PlatformThreadHandle* handle; 50 PlatformThreadHandle* handle;
51 WaitableEvent handle_set; 51 WaitableEvent handle_set;
52 }; 52 };
53 53
54 void* ThreadFunc(void* params) { 54 void* ThreadFunc(void* params) {
55 base::InitOnThread(); 55 base::InitOnThread();
56 ThreadParams* thread_params = static_cast<ThreadParams*>(params); 56 ThreadParams* thread_params = static_cast<ThreadParams*>(params);
57 57
58 PlatformThread::Delegate* delegate = thread_params->delegate; 58 PlatformThread::Delegate* delegate = thread_params->delegate;
59 if (!thread_params->joinable) 59 if (!thread_params->joinable)
60 base::ThreadRestrictions::SetSingletonAllowed(false); 60 base::ThreadRestrictions::SetSingletonAllowed(false);
61 61
62 if (thread_params->priority != kThreadPriority_Normal) { 62 if (thread_params->priority != ThreadPriority::NORMAL) {
63 PlatformThread::SetThreadPriority(PlatformThread::CurrentHandle(), 63 PlatformThread::SetThreadPriority(PlatformThread::CurrentHandle(),
64 thread_params->priority); 64 thread_params->priority);
65 } 65 }
66 66
67 // Stash the id in the handle so the calling thread has a complete 67 // Stash the id in the handle so the calling thread has a complete
68 // handle, and unblock the parent thread. 68 // handle, and unblock the parent thread.
69 *(thread_params->handle) = PlatformThreadHandle(pthread_self(), 69 *(thread_params->handle) = PlatformThreadHandle(pthread_self(),
70 PlatformThread::CurrentId()); 70 PlatformThread::CurrentId());
71 thread_params->handle_set.Signal(); 71 thread_params->handle_set.Signal();
72 72
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 // static 194 // static
195 const char* PlatformThread::GetName() { 195 const char* PlatformThread::GetName() {
196 return ThreadIdNameManager::GetInstance()->GetName(CurrentId()); 196 return ThreadIdNameManager::GetInstance()->GetName(CurrentId());
197 } 197 }
198 198
199 // static 199 // static
200 bool PlatformThread::Create(size_t stack_size, Delegate* delegate, 200 bool PlatformThread::Create(size_t stack_size, Delegate* delegate,
201 PlatformThreadHandle* thread_handle) { 201 PlatformThreadHandle* thread_handle) {
202 base::ThreadRestrictions::ScopedAllowWait allow_wait; 202 base::ThreadRestrictions::ScopedAllowWait allow_wait;
203 return CreateThread(stack_size, true /* joinable thread */, 203 return CreateThread(stack_size, true /* joinable thread */,
204 delegate, thread_handle, kThreadPriority_Normal); 204 delegate, thread_handle, ThreadPriority::NORMAL);
205 } 205 }
206 206
207 // static 207 // static
208 bool PlatformThread::CreateWithPriority(size_t stack_size, Delegate* delegate, 208 bool PlatformThread::CreateWithPriority(size_t stack_size, Delegate* delegate,
209 PlatformThreadHandle* thread_handle, 209 PlatformThreadHandle* thread_handle,
210 ThreadPriority priority) { 210 ThreadPriority priority) {
211 base::ThreadRestrictions::ScopedAllowWait allow_wait; 211 base::ThreadRestrictions::ScopedAllowWait allow_wait;
212 return CreateThread(stack_size, true, // joinable thread 212 return CreateThread(stack_size, true, // joinable thread
213 delegate, thread_handle, priority); 213 delegate, thread_handle, priority);
214 } 214 }
215 215
216 // static 216 // static
217 bool PlatformThread::CreateNonJoinable(size_t stack_size, Delegate* delegate) { 217 bool PlatformThread::CreateNonJoinable(size_t stack_size, Delegate* delegate) {
218 PlatformThreadHandle unused; 218 PlatformThreadHandle unused;
219 219
220 base::ThreadRestrictions::ScopedAllowWait allow_wait; 220 base::ThreadRestrictions::ScopedAllowWait allow_wait;
221 bool result = CreateThread(stack_size, false /* non-joinable thread */, 221 bool result = CreateThread(stack_size, false /* non-joinable thread */,
222 delegate, &unused, kThreadPriority_Normal); 222 delegate, &unused, ThreadPriority::NORMAL);
223 return result; 223 return result;
224 } 224 }
225 225
226 // static 226 // static
227 void PlatformThread::Join(PlatformThreadHandle thread_handle) { 227 void PlatformThread::Join(PlatformThreadHandle thread_handle) {
228 // Joining another thread may block the current thread for a long time, since 228 // Joining another thread may block the current thread for a long time, since
229 // the thread referred to by |thread_handle| may still be running long-lived / 229 // the thread referred to by |thread_handle| may still be running long-lived /
230 // blocking tasks. 230 // blocking tasks.
231 base::ThreadRestrictions::AssertIOAllowed(); 231 base::ThreadRestrictions::AssertIOAllowed();
232 CHECK_EQ(0, pthread_join(thread_handle.handle_, NULL)); 232 CHECK_EQ(0, pthread_join(thread_handle.handle_, NULL));
233 } 233 }
234 234
235 // Mac has its own SetThreadPriority() implementation. 235 // Mac has its own Set/GetThreadPriority() implementations.
236 #if !defined(OS_MACOSX) 236 #if !defined(OS_MACOSX)
237
237 // static 238 // static
238 void PlatformThread::SetThreadPriority(PlatformThreadHandle handle, 239 void PlatformThread::SetThreadPriority(PlatformThreadHandle handle,
239 ThreadPriority priority) { 240 ThreadPriority priority) {
240 #if !defined(OS_NACL) 241 #if defined(OS_NACL)
241 if (internal::HandleSetThreadPriorityForPlatform(handle, priority)) 242 NOTIMPLEMENTED();
243 #else
244 if (internal::SetThreadPriorityForPlatform(handle, priority))
242 return; 245 return;
243 246
244 // setpriority(2) should change the whole thread group's (i.e. process) 247 // setpriority(2) should change the whole thread group's (i.e. process)
245 // priority. However, as stated in the bugs section of 248 // priority. However, as stated in the bugs section of
246 // http://man7.org/linux/man-pages/man2/getpriority.2.html: "under the current 249 // http://man7.org/linux/man-pages/man2/getpriority.2.html: "under the current
247 // Linux/NPTL implementation of POSIX threads, the nice value is a per-thread 250 // Linux/NPTL implementation of POSIX threads, the nice value is a per-thread
248 // attribute". Also, 0 is prefered to the current thread id since it is 251 // attribute". Also, 0 is prefered to the current thread id since it is
249 // equivalent but makes sandboxing easier (https://crbug.com/399473). 252 // equivalent but makes sandboxing easier (https://crbug.com/399473).
250 DCHECK_NE(handle.id_, kInvalidThreadId); 253 DCHECK_NE(handle.id_, kInvalidThreadId);
251 const int nice_setting = internal::ThreadPriorityToNiceValue(priority); 254 const int nice_setting = internal::ThreadPriorityToNiceValue(priority);
252 const PlatformThreadId current_id = PlatformThread::CurrentId(); 255 const PlatformThreadId current_id = PlatformThread::CurrentId();
253 if (setpriority(PRIO_PROCESS, handle.id_ == current_id ? 0 : handle.id_, 256 if (setpriority(PRIO_PROCESS, handle.id_ == current_id ? 0 : handle.id_,
254 nice_setting)) { 257 nice_setting)) {
255 DVPLOG(1) << "Failed to set nice value of thread (" << handle.id_ << ") to " 258 DVPLOG(1) << "Failed to set nice value of thread (" << handle.id_ << ") to "
256 << nice_setting; 259 << nice_setting;
257 } 260 }
261 #endif // defined(OS_NACL)
262 }
263
264 // static
265 ThreadPriority PlatformThread::GetThreadPriority(PlatformThreadHandle handle) {
266 #if defined(OS_NACL)
267 NOTIMPLEMENTED();
268 return ThreadPriority::NORMAL;
269 #else
270 // Mirrors SetThreadPriority()'s implementation.
271 ThreadPriority platform_specific_priority;
272 if (internal::GetThreadPriorityForPlatform(handle,
273 &platform_specific_priority)) {
274 return platform_specific_priority;
275 }
276
277 DCHECK_NE(handle.id_, kInvalidThreadId);
278 const PlatformThreadId current_id = PlatformThread::CurrentId();
279 // Need to clear errno before calling getpriority():
280 // http://man7.org/linux/man-pages/man2/getpriority.2.html
281 errno = 0;
282 int nice_value =
283 getpriority(PRIO_PROCESS, handle.id_ == current_id ? 0 : handle.id_);
284 if (errno != 0) {
285 DVPLOG(1) << "Failed to get nice value of thread (" << handle.id_ << ")";
286 return ThreadPriority::NORMAL;
287 }
288
289 return internal::NiceValueToThreadPriority(nice_value);
258 #endif // !defined(OS_NACL) 290 #endif // !defined(OS_NACL)
259 } 291 }
292
260 #endif // !defined(OS_MACOSX) 293 #endif // !defined(OS_MACOSX)
261 294
262 } // namespace base 295 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698