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