Home | History | Annotate | Download | only in device_sensors
      1 // Copyright 2014 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 "content/browser/device_sensors/device_inertial_sensor_service.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/logging.h"
      9 #include "base/memory/singleton.h"
     10 #include "content/browser/device_sensors/data_fetcher_shared_memory.h"
     11 
     12 namespace content {
     13 
     14 DeviceInertialSensorService::DeviceInertialSensorService()
     15     : num_light_readers_(0),
     16       num_motion_readers_(0),
     17       num_orientation_readers_(0),
     18       is_shutdown_(false) {
     19 }
     20 
     21 DeviceInertialSensorService::~DeviceInertialSensorService() {
     22 }
     23 
     24 DeviceInertialSensorService* DeviceInertialSensorService::GetInstance() {
     25   return Singleton<DeviceInertialSensorService,
     26                    LeakySingletonTraits<DeviceInertialSensorService> >::get();
     27 }
     28 
     29 void DeviceInertialSensorService::AddConsumer(ConsumerType consumer_type) {
     30   if (!ChangeNumberConsumers(consumer_type, 1))
     31     return;
     32 
     33   DCHECK(GetNumberConsumers(consumer_type));
     34 
     35   if (!data_fetcher_)
     36     data_fetcher_.reset(new DataFetcherSharedMemory);
     37   data_fetcher_->StartFetchingDeviceData(consumer_type);
     38 }
     39 
     40 void DeviceInertialSensorService::RemoveConsumer(ConsumerType consumer_type) {
     41   if (!ChangeNumberConsumers(consumer_type, -1))
     42     return;
     43 
     44   if (GetNumberConsumers(consumer_type) == 0)
     45     data_fetcher_->StopFetchingDeviceData(consumer_type);
     46 }
     47 
     48 bool DeviceInertialSensorService::ChangeNumberConsumers(
     49     ConsumerType consumer_type, int delta) {
     50   DCHECK(thread_checker_.CalledOnValidThread());
     51   if (is_shutdown_)
     52     return false;
     53 
     54   switch (consumer_type) {
     55     case CONSUMER_TYPE_MOTION:
     56       num_motion_readers_ += delta;
     57       DCHECK_GE(num_motion_readers_, 0);
     58       return true;
     59     case CONSUMER_TYPE_ORIENTATION:
     60       num_orientation_readers_ += delta;
     61       DCHECK_GE(num_orientation_readers_ , 0);
     62       return true;
     63     case CONSUMER_TYPE_LIGHT:
     64       num_light_readers_ += delta;
     65       DCHECK_GE(num_light_readers_, 0);
     66       return true;
     67     default:
     68       NOTREACHED();
     69   }
     70   return false;
     71 }
     72 
     73 int DeviceInertialSensorService::GetNumberConsumers(
     74     ConsumerType consumer_type) const {
     75   switch (consumer_type) {
     76     case CONSUMER_TYPE_MOTION:
     77       return num_motion_readers_;
     78     case CONSUMER_TYPE_ORIENTATION:
     79       return num_orientation_readers_;
     80     case CONSUMER_TYPE_LIGHT:
     81       return num_light_readers_;
     82     default:
     83       NOTREACHED();
     84   }
     85   return 0;
     86 }
     87 
     88 base::SharedMemoryHandle
     89 DeviceInertialSensorService::GetSharedMemoryHandleForProcess(
     90     ConsumerType consumer_type, base::ProcessHandle handle) {
     91   DCHECK(thread_checker_.CalledOnValidThread());
     92   return data_fetcher_->GetSharedMemoryHandleForProcess(consumer_type, handle);
     93 }
     94 
     95 void DeviceInertialSensorService::Shutdown() {
     96   if (data_fetcher_) {
     97     data_fetcher_->StopFetchingAllDeviceData();
     98     data_fetcher_.reset();
     99   }
    100   is_shutdown_ = true;
    101 }
    102 
    103 void DeviceInertialSensorService::SetDataFetcherForTesting(
    104     DataFetcherSharedMemory* test_data_fetcher) {
    105   if (data_fetcher_)
    106     data_fetcher_->StopFetchingAllDeviceData();
    107   data_fetcher_.reset(test_data_fetcher);
    108 }
    109 
    110 }  // namespace content
    111