Index: content/browser/device_orientation/data_fetcher_shared_memory_base.cc |
diff --git a/content/browser/device_orientation/data_fetcher_shared_memory_base.cc b/content/browser/device_orientation/data_fetcher_shared_memory_base.cc |
index 167b78791a361eb13755d792a9e6a11f0a5d68e2..ddeb08e169ef328b84f63bc5da59c6940115250b 100644 |
--- a/content/browser/device_orientation/data_fetcher_shared_memory_base.cc |
+++ b/content/browser/device_orientation/data_fetcher_shared_memory_base.cc |
@@ -21,7 +21,9 @@ class DataFetcherSharedMemoryBase::PollingThread : public base::Thread { |
PollingThread(const char* name, DataFetcherSharedMemoryBase* fetcher); |
virtual ~PollingThread(); |
- void SetConsumers(int consumers_bitmask); |
+ void AddConsumer(ConsumerType consumer_type); |
+ void RemoveConsumer(ConsumerType consumer_type); |
+ |
unsigned GetConsumersBitmask() const { return consumers_bitmask_; } |
private: |
@@ -45,13 +47,13 @@ DataFetcherSharedMemoryBase::PollingThread::PollingThread( |
DataFetcherSharedMemoryBase::PollingThread::~PollingThread() { |
} |
-void DataFetcherSharedMemoryBase::PollingThread::SetConsumers( |
- int consumers_bitmask) { |
- consumers_bitmask_ = consumers_bitmask; |
- if (!consumers_bitmask_) { |
- timer_.reset(); // will also stop the timer. |
+void DataFetcherSharedMemoryBase::PollingThread::AddConsumer( |
+ ConsumerType consumer_type) { |
+ DCHECK(fetcher_); |
+ if (!fetcher_->Start(consumer_type)) |
return; |
- } |
+ |
+ consumers_bitmask_ |= consumer_type; |
if (!timer_) |
timer_.reset(new base::RepeatingTimer<PollingThread>()); |
@@ -61,6 +63,18 @@ void DataFetcherSharedMemoryBase::PollingThread::SetConsumers( |
this, &PollingThread::DoPoll); |
} |
+void DataFetcherSharedMemoryBase::PollingThread::RemoveConsumer( |
+ ConsumerType consumer_type) { |
+ DCHECK(fetcher_); |
+ if (!fetcher_->Stop(consumer_type)) |
+ return; |
+ |
+ consumers_bitmask_ ^= consumer_type; |
+ |
+ if (!consumers_bitmask_) |
+ timer_.reset(); // will also stop the timer. |
+} |
+ |
void DataFetcherSharedMemoryBase::PollingThread::DoPoll() { |
DCHECK(fetcher_); |
DCHECK(consumers_bitmask_); |
@@ -90,23 +104,21 @@ bool DataFetcherSharedMemoryBase::StartFetchingDeviceData( |
if (started_consumers_ & consumer_type) |
return true; |
- if (!Start(consumer_type)) |
- return false; |
- |
- started_consumers_ |= consumer_type; |
- |
if (IsPolling()) { |
- if (!InitAndStartPollingThreadIfNecessary()) { |
- Stop(consumer_type); |
- started_consumers_ ^= consumer_type; |
+ if (!InitAndStartPollingThreadIfNecessary()) |
return false; |
- } |
polling_thread_->message_loop()->PostTask( |
FROM_HERE, |
- base::Bind(&PollingThread::SetConsumers, |
+ base::Bind(&PollingThread::AddConsumer, |
base::Unretained(polling_thread_.get()), |
- started_consumers_)); |
+ consumer_type)); |
+ } else { |
+ if (!Start(consumer_type)) |
+ return false; |
} |
+ |
+ started_consumers_ |= consumer_type; |
+ |
return true; |
} |
@@ -115,18 +127,19 @@ bool DataFetcherSharedMemoryBase::StopFetchingDeviceData( |
if (!(started_consumers_ & consumer_type)) |
return true; |
- if (!Stop(consumer_type)) |
- return false; |
- |
- started_consumers_ ^= consumer_type; |
- |
if (IsPolling()) { |
polling_thread_->message_loop()->PostTask( |
FROM_HERE, |
- base::Bind(&PollingThread::SetConsumers, |
+ base::Bind(&PollingThread::RemoveConsumer, |
base::Unretained(polling_thread_.get()), |
- started_consumers_)); |
+ consumer_type)); |
+ } else { |
+ if (!Stop(consumer_type)) |
+ return false; |
} |
+ |
+ started_consumers_ ^= consumer_type; |
+ |
return true; |
} |