| Index: base/threading/simple_thread.cc
|
| diff --git a/base/threading/simple_thread.cc b/base/threading/simple_thread.cc
|
| index 7059ceab76661428a3a4e9f7eb124e524b162ebe..3e8ff97853657bb7859ca2f2b9522ded0aeb6dce 100644
|
| --- a/base/threading/simple_thread.cc
|
| +++ b/base/threading/simple_thread.cc
|
| @@ -12,15 +12,24 @@
|
| namespace base {
|
|
|
| SimpleThread::SimpleThread(const std::string& name_prefix)
|
| - : name_prefix_(name_prefix), name_(name_prefix),
|
| - thread_(), event_(true, false), tid_(0), joined_(false) {
|
| -}
|
| + : name_prefix_(name_prefix),
|
| + name_(name_prefix),
|
| + thread_(),
|
| + event_(true, false),
|
| + tid_(0),
|
| + joined_(false),
|
| + priority_(options_.priority()) {}
|
|
|
| SimpleThread::SimpleThread(const std::string& name_prefix,
|
| const Options& options)
|
| - : name_prefix_(name_prefix), name_(name_prefix), options_(options),
|
| - thread_(), event_(true, false), tid_(0), joined_(false) {
|
| -}
|
| + : name_prefix_(name_prefix),
|
| + name_(name_prefix),
|
| + options_(options),
|
| + thread_(),
|
| + event_(true, false),
|
| + tid_(0),
|
| + joined_(false),
|
| + priority_(options_.priority()) {}
|
|
|
| SimpleThread::~SimpleThread() {
|
| DCHECK(HasBeenStarted()) << "SimpleThread was never started.";
|
| @@ -66,6 +75,63 @@ void SimpleThread::ThreadMain() {
|
| Run();
|
| }
|
|
|
| +bool SimpleThread::SetThreadPriority(ThreadPriority priority) {
|
| + DCHECK(HasBeenStarted())
|
| + << "Tried to set a priority of never-started thread.";
|
| +
|
| + if (PlatformThread::SetChildThreadPriorityInCurrentProcess(thread_, tid_,
|
| + priority)) {
|
| + priority_ = priority;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +// Must have default priority either equal to higher or lower priority.
|
| +DynamicPriorityThread::DynamicPriorityThread(const PrioritySet& priorities,
|
| + const std::string& name_prefix,
|
| + const Options& options)
|
| + : SimpleThread(name_prefix, options),
|
| + priorities_(priorities),
|
| + dynamic_priorities_(false),
|
| + priority_changed_(false) {
|
| + CHECK(priorities_.higher_priority == priorities_.default_priority ||
|
| + priorities_.lower_priority == priorities_.default_priority);
|
| + dynamic_priorities_ =
|
| + priorities_.higher_priority != priorities_.lower_priority;
|
| +}
|
| +
|
| +bool DynamicPriorityThread::Speedup() {
|
| + if (dynamic_priorities_ &&
|
| + (GetThreadPriority() != priorities_.higher_priority)) {
|
| + SetThreadPriority(priorities_.higher_priority);
|
| + priority_changed_ = true;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +bool DynamicPriorityThread::Slowdown() {
|
| + if (dynamic_priorities_ &&
|
| + (GetThreadPriority() != priorities_.lower_priority)) {
|
| + SetThreadPriority(priorities_.lower_priority);
|
| + priority_changed_ = true;
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +bool DynamicPriorityThread::RestoreDefaultPriority() {
|
| + if (dynamic_priorities_ && priority_changed_) {
|
| + priority_changed_ = false;
|
| + SetThreadPriority(priorities_.default_priority);
|
| + // LOG(ERROR) << "\nPRAS:: [" << std::hex << this << "] "
|
| + // << GetPrioritySetForDebugging() << ". Restored to default.";
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| DelegateSimpleThread::DelegateSimpleThread(Delegate* delegate,
|
| const std::string& name_prefix)
|
| : SimpleThread(name_prefix),
|
|
|