| 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;
|
| }
|
|
|
|
|