| OLD | NEW |
| (Empty) |
| 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 "device/sensors/device_sensor_service.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/logging.h" | |
| 9 #include "base/memory/singleton.h" | |
| 10 #include "base/trace_event/trace_event.h" | |
| 11 #include "device/sensors/data_fetcher_shared_memory.h" | |
| 12 | |
| 13 namespace device { | |
| 14 | |
| 15 DeviceSensorService::DeviceSensorService() | |
| 16 : num_light_readers_(0), | |
| 17 num_motion_readers_(0), | |
| 18 num_orientation_readers_(0), | |
| 19 num_orientation_absolute_readers_(0), | |
| 20 is_shutdown_(false) { | |
| 21 base::MessageLoop::current()->AddDestructionObserver(this); | |
| 22 } | |
| 23 | |
| 24 DeviceSensorService::~DeviceSensorService() {} | |
| 25 | |
| 26 DeviceSensorService* DeviceSensorService::GetInstance() { | |
| 27 return base::Singleton<DeviceSensorService, base::LeakySingletonTraits< | |
| 28 DeviceSensorService>>::get(); | |
| 29 } | |
| 30 | |
| 31 void DeviceSensorService::AddConsumer(ConsumerType consumer_type) { | |
| 32 if (!ChangeNumberConsumers(consumer_type, 1)) | |
| 33 return; | |
| 34 | |
| 35 DCHECK(GetNumberConsumers(consumer_type)); | |
| 36 | |
| 37 if (!data_fetcher_) | |
| 38 data_fetcher_.reset(new DataFetcherSharedMemory); | |
| 39 data_fetcher_->StartFetchingDeviceData(consumer_type); | |
| 40 } | |
| 41 | |
| 42 void DeviceSensorService::RemoveConsumer(ConsumerType consumer_type) { | |
| 43 if (!ChangeNumberConsumers(consumer_type, -1)) | |
| 44 return; | |
| 45 | |
| 46 if (GetNumberConsumers(consumer_type) == 0) | |
| 47 data_fetcher_->StopFetchingDeviceData(consumer_type); | |
| 48 } | |
| 49 | |
| 50 bool DeviceSensorService::ChangeNumberConsumers(ConsumerType consumer_type, | |
| 51 int delta) { | |
| 52 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 53 if (is_shutdown_) | |
| 54 return false; | |
| 55 | |
| 56 switch (consumer_type) { | |
| 57 case CONSUMER_TYPE_MOTION: | |
| 58 num_motion_readers_ += delta; | |
| 59 DCHECK_GE(num_motion_readers_, 0); | |
| 60 return true; | |
| 61 case CONSUMER_TYPE_ORIENTATION: | |
| 62 num_orientation_readers_ += delta; | |
| 63 DCHECK_GE(num_orientation_readers_, 0); | |
| 64 return true; | |
| 65 case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: | |
| 66 num_orientation_absolute_readers_ += delta; | |
| 67 DCHECK_GE(num_orientation_absolute_readers_, 0); | |
| 68 return true; | |
| 69 case CONSUMER_TYPE_LIGHT: | |
| 70 num_light_readers_ += delta; | |
| 71 DCHECK_GE(num_light_readers_, 0); | |
| 72 return true; | |
| 73 default: | |
| 74 NOTREACHED(); | |
| 75 } | |
| 76 return false; | |
| 77 } | |
| 78 | |
| 79 int DeviceSensorService::GetNumberConsumers(ConsumerType consumer_type) const { | |
| 80 switch (consumer_type) { | |
| 81 case CONSUMER_TYPE_MOTION: | |
| 82 return num_motion_readers_; | |
| 83 case CONSUMER_TYPE_ORIENTATION: | |
| 84 return num_orientation_readers_; | |
| 85 case CONSUMER_TYPE_ORIENTATION_ABSOLUTE: | |
| 86 return num_orientation_absolute_readers_; | |
| 87 case CONSUMER_TYPE_LIGHT: | |
| 88 return num_light_readers_; | |
| 89 default: | |
| 90 NOTREACHED(); | |
| 91 } | |
| 92 return 0; | |
| 93 } | |
| 94 | |
| 95 mojo::ScopedSharedBufferHandle DeviceSensorService::GetSharedMemoryHandle( | |
| 96 ConsumerType consumer_type) { | |
| 97 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 98 return data_fetcher_->GetSharedMemoryHandle(consumer_type); | |
| 99 } | |
| 100 | |
| 101 void DeviceSensorService::WillDestroyCurrentMessageLoop() { | |
| 102 base::MessageLoop::current()->RemoveDestructionObserver(this); | |
| 103 TRACE_EVENT0("shutdown", "DeviceSensorService::Subsystem:SensorService"); | |
| 104 Shutdown(); | |
| 105 } | |
| 106 | |
| 107 void DeviceSensorService::Shutdown() { | |
| 108 if (data_fetcher_) { | |
| 109 data_fetcher_->Shutdown(); | |
| 110 data_fetcher_.reset(); | |
| 111 } | |
| 112 is_shutdown_ = true; | |
| 113 } | |
| 114 | |
| 115 void DeviceSensorService::SetDataFetcherForTesting( | |
| 116 DataFetcherSharedMemory* test_data_fetcher) { | |
| 117 if (data_fetcher_) | |
| 118 data_fetcher_->Shutdown(); | |
| 119 data_fetcher_.reset(test_data_fetcher); | |
| 120 is_shutdown_ = false; | |
| 121 } | |
| 122 | |
| 123 } // namespace device | |
| OLD | NEW |