| Index: update_attempter.cc
|
| diff --git a/update_attempter.cc b/update_attempter.cc
|
| index 50c59ab94f49de1b496c8b60c79d908c2cc16dbe..a099d7c737144868bf704b4fc9eb387072ab34f9 100644
|
| --- a/update_attempter.cc
|
| +++ b/update_attempter.cc
|
| @@ -114,6 +114,28 @@ ActionExitCode GetErrorCodeForAction(AbstractAction* action,
|
| return code;
|
| }
|
|
|
| +UpdateAttempter::UpdateAttempter(PrefsInterface* prefs,
|
| + MetricsLibraryInterface* metrics_lib)
|
| + : dbus_service_(NULL),
|
| + prefs_(prefs),
|
| + metrics_lib_(metrics_lib),
|
| + priority_(utils::kProcessPriorityNormal),
|
| + manage_priority_source_(NULL),
|
| + status_(UPDATE_STATUS_IDLE),
|
| + download_progress_(0.0),
|
| + last_checked_time_(0),
|
| + new_version_("0.0.0.0"),
|
| + new_size_(0) {
|
| + last_notify_time_.tv_sec = 0;
|
| + last_notify_time_.tv_nsec = 0;
|
| + if (utils::FileExists(kUpdateCompletedMarker))
|
| + status_ = UPDATE_STATUS_UPDATED_NEED_REBOOT;
|
| +}
|
| +
|
| +UpdateAttempter::~UpdateAttempter() {
|
| + CleanupPriorityManagement();
|
| +}
|
| +
|
| void UpdateAttempter::Update(const std::string& app_version,
|
| const std::string& omaha_url) {
|
| if (status_ == UPDATE_STATUS_UPDATED_NEED_REBOOT) {
|
| @@ -242,6 +264,9 @@ void UpdateAttempter::ProcessingDone(const ActionProcessor* processor,
|
| LOG(INFO) << "Processing Done.";
|
| actions_.clear();
|
|
|
| + // Reset process priority back to normal.
|
| + CleanupPriorityManagement();
|
| +
|
| if (status_ == UPDATE_STATUS_REPORTING_ERROR_EVENT) {
|
| LOG(INFO) << "Error event sent.";
|
| SetStatusAndNotify(UPDATE_STATUS_IDLE);
|
| @@ -269,6 +294,8 @@ void UpdateAttempter::ProcessingDone(const ActionProcessor* processor,
|
| }
|
|
|
| void UpdateAttempter::ProcessingStopped(const ActionProcessor* processor) {
|
| + // Reset process priority back to normal.
|
| + CleanupPriorityManagement();
|
| download_progress_ = 0.0;
|
| SetStatusAndNotify(UPDATE_STATUS_IDLE);
|
| actions_.clear();
|
| @@ -301,6 +328,7 @@ void UpdateAttempter::ActionCompleted(ActionProcessor* processor,
|
| // TODO(adlr): put version in InstallPlan
|
| new_version_ = "0.0.0.0";
|
| new_size_ = plan.size;
|
| + SetupPriorityManagement();
|
| } else if (type == DownloadAction::StaticType()) {
|
| SetStatusAndNotify(UPDATE_STATUS_FINALIZING);
|
| }
|
| @@ -404,4 +432,54 @@ bool UpdateAttempter::ScheduleErrorEventAction() {
|
| return true;
|
| }
|
|
|
| +void UpdateAttempter::SetPriority(utils::ProcessPriority priority) {
|
| + if (priority_ == priority) {
|
| + return;
|
| + }
|
| + if (utils::SetProcessPriority(priority)) {
|
| + priority_ = priority;
|
| + LOG(INFO) << "Process priority = " << priority_;
|
| + }
|
| +}
|
| +
|
| +void UpdateAttempter::SetupPriorityManagement() {
|
| + if (manage_priority_source_) {
|
| + LOG(ERROR) << "Process priority timeout source hasn't been destroyed.";
|
| + CleanupPriorityManagement();
|
| + }
|
| + const int kPriorityTimeout = 10 * 60; // 10 minutes
|
| + manage_priority_source_ = g_timeout_source_new_seconds(kPriorityTimeout);
|
| + g_source_set_callback(manage_priority_source_,
|
| + StaticManagePriorityCallback,
|
| + this,
|
| + NULL);
|
| + g_source_attach(manage_priority_source_, NULL);
|
| + SetPriority(utils::kProcessPriorityLow);
|
| +}
|
| +
|
| +void UpdateAttempter::CleanupPriorityManagement() {
|
| + if (manage_priority_source_) {
|
| + g_source_destroy(manage_priority_source_);
|
| + manage_priority_source_ = NULL;
|
| + }
|
| + SetPriority(utils::kProcessPriorityNormal);
|
| +}
|
| +
|
| +gboolean UpdateAttempter::StaticManagePriorityCallback(gpointer data) {
|
| + return reinterpret_cast<UpdateAttempter*>(data)->ManagePriorityCallback();
|
| +}
|
| +
|
| +bool UpdateAttempter::ManagePriorityCallback() {
|
| + // If the current process priority is below normal, set it to normal
|
| + // and let GLib invoke this callback again.
|
| + if (utils::ComparePriorities(priority_, utils::kProcessPriorityNormal) < 0) {
|
| + SetPriority(utils::kProcessPriorityNormal);
|
| + return true;
|
| + }
|
| + // Set the priority to high and let GLib destroy the timeout source.
|
| + SetPriority(utils::kProcessPriorityHigh);
|
| + manage_priority_source_ = NULL;
|
| + return false;
|
| +}
|
| +
|
| } // namespace chromeos_update_engine
|
|
|