cashew: Prevent double deletion of ProcfsByteCounter instance.
BUG=chromium-os:29181
TEST=Build cashew and run unit tests.
Change-Id: I4d0226882b5e4a33c0b899c589199a438a2ee844
Reviewed-on: https://gerrit.chromium.org/gerrit/20545
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Ben Chan <benchan@chromium.org>
Tested-by: Ben Chan <benchan@chromium.org>
diff --git a/src/data_plan.cc b/src/data_plan.cc
index d8801fa..48f5c97 100644
--- a/src/data_plan.cc
+++ b/src/data_plan.cc
@@ -376,7 +376,6 @@
DCHECK(service != NULL);
DCHECK(service_manager != NULL);
DCHECK(device != NULL);
- DCHECK(device->ByteCounterRunning());
LOG(INFO) << "OnByteCounterUpdate: delta_rx_bytes = " << delta_rx_bytes
<< ", delta_tx_bytes = " << delta_tx_bytes;
diff --git a/src/device_impl.cc b/src/device_impl.cc
index aaa10d5..e90cfd9 100644
--- a/src/device_impl.cc
+++ b/src/device_impl.cc
@@ -149,16 +149,21 @@
void DeviceImpl::StopByteCounter() {
if (byte_counter_running_) {
- DeleteByteCounter();
+ // NOTE: |byte_counter_| is an instance of ProcfsByteCounter.
+ // The implementation of ProcfsByteCounter is subtle in a way that
+ // the destructor of ProcfsByteCounter may again trigger the invocation
+ // of this method. To prevent |byte_counter_| from being deleted again
+ // during its destruction, we must set |byte_counter_running_| to false
+ // before calling DeleteByteCounter to delete |byte_counter_|.
byte_counter_running_ = false;
+ DeleteByteCounter();
// notify |parent_|
parent_->OnByteCounterStopped();
}
- DCHECK(byte_counter_ == NULL);
}
bool DeviceImpl::ReadStats() {
- return byte_counter_->ReadStats();
+ return byte_counter_ ? byte_counter_->ReadStats() : false;
}
bool DeviceImpl::GetByteCounterStats(uint64 *rx_bytes, uint64 *tx_bytes) const {