Chromium Code Reviews| Index: chromeos/dbus/power_manager_client.cc |
| diff --git a/chromeos/dbus/power_manager_client.cc b/chromeos/dbus/power_manager_client.cc |
| index 587e43f79992af6b6acaa62f82eb49448ce849d8..6f42ad657488145ff102ce641b77287f34604e27 100644 |
| --- a/chromeos/dbus/power_manager_client.cc |
| +++ b/chromeos/dbus/power_manager_client.cc |
| @@ -48,8 +48,11 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| power_manager_proxy_(NULL), |
| suspend_delay_id_(-1), |
| has_suspend_delay_id_(false), |
| + dark_suspend_delay_id_(-1), |
| + has_dark_suspend_delay_id_(false), |
| pending_suspend_id_(-1), |
| suspend_is_pending_(false), |
| + suspending_from_dark_resume_(false), |
| num_pending_suspend_readiness_callbacks_(0), |
| last_is_projecting_(false), |
| weak_ptr_factory_(this) {} |
| @@ -285,6 +288,15 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| power_manager_proxy_->ConnectToSignal( |
| power_manager::kPowerManagerInterface, |
| + power_manager::kDarkSuspendImminentSignal, |
| + base::Bind( |
| + &PowerManagerClientImpl::DarkSuspendImminentReceived, |
| + weak_ptr_factory_.GetWeakPtr()), |
| + base::Bind(&PowerManagerClientImpl::SignalConnected, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + |
| + power_manager_proxy_->ConnectToSignal( |
| + power_manager::kPowerManagerInterface, |
| power_manager::kIdleActionImminentSignal, |
| base::Bind( |
| &PowerManagerClientImpl::IdleActionImminentReceived, |
| @@ -301,7 +313,7 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| base::Bind(&PowerManagerClientImpl::SignalConnected, |
| weak_ptr_factory_.GetWeakPtr())); |
| - RegisterSuspendDelay(); |
| + RegisterSuspendDelays(); |
| } |
| private: |
| @@ -336,7 +348,7 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| << (new_owner.empty() ? "[none]" : new_owner.c_str()) << ")"; |
| if (!new_owner.empty()) { |
| VLOG(1) << "Sending initial state to power manager"; |
| - RegisterSuspendDelay(); |
| + RegisterSuspendDelays(); |
| SetIsProjecting(last_is_projecting_); |
| FOR_EACH_OBSERVER(Observer, observers_, PowerManagerRestarted()); |
| } |
| @@ -424,54 +436,78 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| callback.Run(percent); |
| } |
| - void OnRegisterSuspendDelayReply(dbus::Response* response) { |
| + void OnRegisterSuspendDelayReply(bool dark_suspend, |
| + dbus::Response* response) { |
| if (!response) { |
| - LOG(ERROR) << "Error calling " |
| - << power_manager::kRegisterSuspendDelayMethod; |
| + LOG(ERROR) << "Error calling " << response->GetMember(); |
| return; |
| } |
| dbus::MessageReader reader(response); |
| power_manager::RegisterSuspendDelayReply protobuf; |
| if (!reader.PopArrayOfBytesAsProto(&protobuf)) { |
| - LOG(ERROR) << "Unable to parse reply from " |
| - << power_manager::kRegisterSuspendDelayMethod; |
| + LOG(ERROR) << "Unable to parse reply from " << response->GetMember(); |
| return; |
| } |
| - suspend_delay_id_ = protobuf.delay_id(); |
| - has_suspend_delay_id_ = true; |
| - VLOG(1) << "Registered suspend delay " << suspend_delay_id_; |
| + if (dark_suspend) { |
| + dark_suspend_delay_id_ = protobuf.delay_id(); |
| + has_dark_suspend_delay_id_ = true; |
| + VLOG(1) << "Registered dark suspend delay " << dark_suspend_delay_id_; |
| + } else { |
| + suspend_delay_id_ = protobuf.delay_id(); |
| + has_suspend_delay_id_ = true; |
| + VLOG(1) << "Registered suspend delay " << suspend_delay_id_; |
| + } |
| } |
| void SuspendImminentReceived(dbus::Signal* signal) { |
| - if (!has_suspend_delay_id_) { |
| - LOG(ERROR) << "Received unrequested " |
| - << power_manager::kSuspendImminentSignal << " signal"; |
| + SuspendImminentCommon(false, signal); |
| + } |
| + |
| + void DarkSuspendImminentReceived(dbus::Signal* signal) { |
|
Daniel Erat
2014/08/15 23:49:31
can you just eliminate these and bind true or fals
Chirantan Ekbote
2014/08/18 17:49:08
sure. will fix.
|
| + SuspendImminentCommon(true, signal); |
| + } |
| + |
| + void SuspendImminentCommon(bool in_dark_resume, |
|
Daniel Erat
2014/08/15 23:49:31
nit: HandleSuspendImminent()?
|
| + dbus::Signal* signal) { |
| + std::string signal_name = signal->GetMember(); |
| + if ((in_dark_resume && !has_dark_suspend_delay_id_) || |
| + (!in_dark_resume && !has_suspend_delay_id_)) { |
| + LOG(ERROR) << "Received unrequested " << signal_name << " signal"; |
| return; |
| } |
| dbus::MessageReader reader(signal); |
| power_manager::SuspendImminent proto; |
| if (!reader.PopArrayOfBytesAsProto(&proto)) { |
| - LOG(ERROR) << "Unable to decode protocol buffer from " |
| - << power_manager::kSuspendImminentSignal << " signal"; |
| + LOG(ERROR) << "Unable to decode protocol buffer from " << signal_name |
| + << " signal"; |
| return; |
| } |
| - VLOG(1) << "Got " << power_manager::kSuspendImminentSignal << " signal " |
| - << "announcing suspend attempt " << proto.suspend_id(); |
| - if (suspend_is_pending_) { |
| - LOG(WARNING) << "Got " << power_manager::kSuspendImminentSignal |
| - << " signal about pending suspend attempt " |
| - << proto.suspend_id() << " while still waiting " |
| - << "on attempt " << pending_suspend_id_; |
| + VLOG(1) << "Got " << signal_name << " signal announcing suspend attempt " |
| + << proto.suspend_id(); |
| + |
| + // If a previous suspend is pending from the same state we are currently in |
| + // (fully powered on or in dark resume), then something's gone a little |
| + // wonky. |
| + if (suspend_is_pending_ && |
| + suspending_from_dark_resume_ == in_dark_resume) { |
| + LOG(WARNING) << "Got " << signal_name << " signal about pending suspend " |
| + << "attempt " << proto.suspend_id() << " while still " |
| + << "waiting on attempt " << pending_suspend_id_; |
|
Daniel Erat
2014/08/15 23:49:31
i'm trying to think of when this could happen -- w
Chirantan Ekbote
2014/08/18 17:49:08
Yes, that's the situation in which this could happ
|
| } |
| pending_suspend_id_ = proto.suspend_id(); |
| suspend_is_pending_ = true; |
| + suspending_from_dark_resume_ = in_dark_resume; |
| num_pending_suspend_readiness_callbacks_ = 0; |
| - FOR_EACH_OBSERVER(Observer, observers_, SuspendImminent()); |
| + if (suspending_from_dark_resume_) { |
|
Daniel Erat
2014/08/15 23:49:31
nit: omit curly brackets
|
| + FOR_EACH_OBSERVER(Observer, observers_, DarkSuspendImminent()); |
| + } else { |
| + FOR_EACH_OBSERVER(Observer, observers_, SuspendImminent()); |
| + } |
| MaybeReportSuspendReadiness(); |
| } |
| @@ -556,18 +592,24 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| } |
| } |
| - // Registers a suspend delay with the power manager. This is usually |
| - // only called at startup, but if the power manager restarts, we need to |
| - // create a new delay. |
| - void RegisterSuspendDelay() { |
| + // Registers suspend delays with the power manager. This is usually only |
| + // called at startup, but if the power manager restarts, we need to create new |
| + // delays. |
| + void RegisterSuspendDelays() { |
| // Throw out any old delay that was registered. |
| suspend_delay_id_ = -1; |
| has_suspend_delay_id_ = false; |
| + dark_suspend_delay_id_ = -1; |
| + has_dark_suspend_delay_id_ = false; |
| dbus::MethodCall method_call( |
| power_manager::kPowerManagerInterface, |
| power_manager::kRegisterSuspendDelayMethod); |
| dbus::MessageWriter writer(&method_call); |
| + dbus::MethodCall dark_method_call( |
| + power_manager::kPowerManagerInterface, |
| + power_manager::kRegisterDarkSuspendDelayMethod); |
| + dbus::MessageWriter dark_writer(&dark_method_call); |
| power_manager::RegisterSuspendDelayRequest protobuf_request; |
| base::TimeDelta timeout = |
| @@ -580,12 +622,23 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| << power_manager::kRegisterSuspendDelayMethod; |
| return; |
| } |
| + if (!dark_writer.AppendProtoAsArrayOfBytes(protobuf_request)) { |
| + LOG(ERROR) << "Error constructing message for " |
| + << power_manager::kRegisterDarkSuspendDelayMethod; |
| + return; |
| + } |
| power_manager_proxy_->CallMethod( |
| &method_call, |
| dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| base::Bind( |
| &PowerManagerClientImpl::OnRegisterSuspendDelayReply, |
| - weak_ptr_factory_.GetWeakPtr())); |
| + weak_ptr_factory_.GetWeakPtr(), false)); |
| + power_manager_proxy_->CallMethod( |
|
Daniel Erat
2014/08/15 23:49:31
add a helper method for this to cut down on the du
|
| + &dark_method_call, |
| + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| + base::Bind( |
| + &PowerManagerClientImpl::OnRegisterSuspendDelayReply, |
| + weak_ptr_factory_.GetWeakPtr(), true)); |
| } |
| // Records the fact that an observer has finished doing asynchronous work |
| @@ -607,23 +660,31 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| if (!suspend_is_pending_ || num_pending_suspend_readiness_callbacks_ > 0) |
| return; |
| + std::string method_name; |
| + int32 delay_id; |
| + if (suspending_from_dark_resume_) { |
| + method_name = power_manager::kHandleDarkSuspendReadinessMethod; |
| + delay_id = dark_suspend_delay_id_; |
| + } else { |
| + method_name = power_manager::kHandleSuspendReadinessMethod; |
| + delay_id = suspend_delay_id_; |
| + } |
| + |
| dbus::MethodCall method_call( |
| - power_manager::kPowerManagerInterface, |
| - power_manager::kHandleSuspendReadinessMethod); |
| + power_manager::kPowerManagerInterface, method_name); |
| dbus::MessageWriter writer(&method_call); |
| - VLOG(1) << "Announcing readiness of suspend delay " << suspend_delay_id_ |
| + VLOG(1) << "Announcing readiness of suspend delay " << delay_id |
| << " for suspend attempt " << pending_suspend_id_; |
| power_manager::SuspendReadinessInfo protobuf_request; |
| - protobuf_request.set_delay_id(suspend_delay_id_); |
| + protobuf_request.set_delay_id(delay_id); |
| protobuf_request.set_suspend_id(pending_suspend_id_); |
| pending_suspend_id_ = -1; |
| suspend_is_pending_ = false; |
| if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) { |
| - LOG(ERROR) << "Error constructing message for " |
| - << power_manager::kHandleSuspendReadinessMethod; |
| + LOG(ERROR) << "Error constructing message for " << method_name; |
| return; |
| } |
| power_manager_proxy_->CallMethod( |
| @@ -642,10 +703,15 @@ class PowerManagerClientImpl : public PowerManagerClient { |
| int32 suspend_delay_id_; |
| bool has_suspend_delay_id_; |
| + // The delay_id_ obtained from the RegisterDarkSuspendDelay request. |
| + int32 dark_suspend_delay_id_; |
| + bool has_dark_suspend_delay_id_; |
| + |
| // powerd-supplied ID corresponding to an imminent suspend attempt that is |
| // currently being delayed. |
| int32 pending_suspend_id_; |
| bool suspend_is_pending_; |
| + bool suspending_from_dark_resume_; |
|
Daniel Erat
2014/08/15 23:49:31
add a comment clarifying what this means, and that
|
| // Number of callbacks that have been returned by |
| // GetSuspendReadinessCallback() during the currently-pending suspend |