Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Unified Diff: content/browser/device_orientation/data_fetcher_shared_memory_base.cc

Issue 22926029: Mac: implement orientation/motion shared memory data fetcher. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: FakeNonPollingDataFetcher on stack Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..5b60f1f11f2ce830d44001126a1992a6125d5cf2 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;
}
@@ -170,12 +183,13 @@ base::SharedMemory* DataFetcherSharedMemoryBase::InitSharedMemory(
if (it != shared_memory_map_.end())
return it->second;
- base::SharedMemory* new_shared_mem = new base::SharedMemory;
+ scoped_ptr<base::SharedMemory> new_shared_mem(new base::SharedMemory);
if (new_shared_mem->CreateAndMapAnonymous(buffer_size)) {
if (void* mem = new_shared_mem->memory()) {
memset(mem, 0, buffer_size);
- shared_memory_map_[consumer_type] = new_shared_mem;
- return new_shared_mem;
+ base::SharedMemory* shared_mem = new_shared_mem.release();
+ shared_memory_map_[consumer_type] = shared_mem;
+ return shared_mem;
}
}
LOG(ERROR) << "Failed to initialize shared memory";

Powered by Google App Engine
This is Rietveld 408576698