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