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 12namespace content { 13 14DeviceInertialSensorService::DeviceInertialSensorService() 15 : num_light_readers_(0), 16 num_motion_readers_(0), 17 num_orientation_readers_(0), 18 is_shutdown_(false) { 19} 20 21DeviceInertialSensorService::~DeviceInertialSensorService() { 22} 23 24DeviceInertialSensorService* DeviceInertialSensorService::GetInstance() { 25 return Singleton<DeviceInertialSensorService, 26 LeakySingletonTraits<DeviceInertialSensorService> >::get(); 27} 28 29void 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 40void 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 48bool 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 73int 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 88base::SharedMemoryHandle 89DeviceInertialSensorService::GetSharedMemoryHandleForProcess( 90 ConsumerType consumer_type, base::ProcessHandle handle) { 91 DCHECK(thread_checker_.CalledOnValidThread()); 92 return data_fetcher_->GetSharedMemoryHandleForProcess(consumer_type, handle); 93} 94 95void DeviceInertialSensorService::Shutdown() { 96 if (data_fetcher_) { 97 data_fetcher_->StopFetchingAllDeviceData(); 98 data_fetcher_.reset(); 99 } 100 is_shutdown_ = true; 101} 102 103void 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