OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chromeos/power/power_state_override.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/message_loop.h" | |
9 #include "base/time.h" | |
10 #include "chromeos/dbus/dbus_thread_manager.h" | |
11 #include "chromeos/dbus/power_manager_client.h" | |
12 | |
13 namespace { | |
14 | |
15 // Frequency with which overrides are renewed. | |
16 const int kHeartbeatTimeInSecs = 300; | |
17 | |
18 // Duration beyond |kHeartbeatTimeInSecs| for which overrides are requested. | |
19 // This should be long enough that we're able to renew the request before it | |
20 // expires, but short enough that the power manager won't end up honoring a | |
21 // stale request for a long time if Chrome crashes and orphans its requests. | |
22 const int kRequestSlackInSecs = 15; | |
23 | |
24 } // namespace | |
25 | |
26 namespace chromeos { | |
27 | |
28 PowerStateOverride::PowerStateOverride(Mode mode) | |
29 : override_types_(0), | |
30 request_id_(0), | |
31 dbus_thread_manager_(DBusThreadManager::Get()) { | |
32 switch (mode) { | |
33 case BLOCK_DISPLAY_SLEEP: | |
34 override_types_ |= (PowerManagerClient::DISABLE_IDLE_DIM | | |
35 PowerManagerClient::DISABLE_IDLE_BLANK); | |
36 // fallthrough | |
37 case BLOCK_SYSTEM_SUSPEND: | |
38 override_types_ |= PowerManagerClient::DISABLE_IDLE_SUSPEND; | |
39 break; | |
40 default: | |
41 NOTREACHED() << "Unhandled mode " << mode; | |
42 } | |
43 | |
44 dbus_thread_manager_->AddObserver(this); | |
45 | |
46 // request_id_ = 0 will create a new override request. | |
47 // We do a post task here to ensure that this request runs 'after' our | |
48 // constructor is done. If not, there is a possibility (though only in | |
49 // tests at the moment) that the power state override request executes | |
50 // and returns before the constructor has finished executing. This will | |
51 // cause an AddRef and a Release, the latter destructing our current | |
52 // instance even before the constructor has finished executing (as it does | |
53 // in the DownloadExtensionTest browsertests currently). | |
54 MessageLoop::current()->PostTask( | |
55 FROM_HERE, | |
56 base::Bind(&PowerStateOverride::CallRequestPowerStateOverrides, this)); | |
57 | |
58 heartbeat_.Start(FROM_HERE, | |
59 base::TimeDelta::FromSeconds(kHeartbeatTimeInSecs), | |
60 this, | |
61 &PowerStateOverride::CallRequestPowerStateOverrides); | |
62 } | |
63 | |
64 PowerStateOverride::~PowerStateOverride() { | |
65 if (dbus_thread_manager_) | |
66 dbus_thread_manager_->RemoveObserver(this); | |
67 CancelRequest(); | |
68 } | |
69 | |
70 void PowerStateOverride::OnDBusThreadManagerDestroying( | |
71 DBusThreadManager* manager) { | |
72 DCHECK_EQ(manager, dbus_thread_manager_); | |
73 CancelRequest(); | |
74 dbus_thread_manager_ = NULL; | |
75 } | |
76 | |
77 void PowerStateOverride::SetRequestId(uint32 request_id) { | |
78 request_id_ = request_id; | |
79 } | |
80 | |
81 void PowerStateOverride::CallRequestPowerStateOverrides() { | |
82 DCHECK(dbus_thread_manager_); | |
83 dbus_thread_manager_->GetPowerManagerClient()->RequestPowerStateOverrides( | |
84 request_id_, | |
85 base::TimeDelta::FromSeconds( | |
86 kHeartbeatTimeInSecs + kRequestSlackInSecs), | |
87 override_types_, | |
88 base::Bind(&PowerStateOverride::SetRequestId, this)); | |
89 } | |
90 | |
91 void PowerStateOverride::CancelRequest() { | |
92 if (request_id_) { | |
93 DCHECK(dbus_thread_manager_); | |
94 dbus_thread_manager_->GetPowerManagerClient()-> | |
95 CancelPowerStateOverrides(request_id_); | |
96 request_id_ = 0; | |
97 } | |
98 } | |
99 | |
100 } // namespace chromeos | |
OLD | NEW |