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#ifndef CONTENT_BROWSER_DEVICE_SENSORS_DATA_FETCHER_SHARED_MEMORY_BASE_H_ 6#define CONTENT_BROWSER_DEVICE_SENSORS_DATA_FETCHER_SHARED_MEMORY_BASE_H_ 7 8#include <map> 9 10#include "base/memory/scoped_ptr.h" 11#include "base/memory/shared_memory.h" 12#include "base/message_loop/message_loop.h" 13#include "content/browser/device_sensors/inertial_sensor_consts.h" 14#include "content/common/content_export.h" 15 16namespace content { 17 18// Sensor data fetchers should derive from this base class and implement 19// the abstract Start() and Stop() methods. 20// If the fetcher requires polling it should also implement IsPolling() 21// to return true and the Fetch() method which will be called from the 22// polling thread to fetch data at regular intervals. 23class CONTENT_EXPORT DataFetcherSharedMemoryBase { 24 public: 25 // Starts updating the shared memory buffer with sensor data at 26 // regular intervals. Returns true if the relevant sensors could 27 // be successfully activated. 28 bool StartFetchingDeviceData(ConsumerType consumer_type); 29 30 // Stops updating the shared memory buffer. Returns true if the 31 // relevant sensors could be successfully deactivated. 32 bool StopFetchingDeviceData(ConsumerType consumer_type); 33 34 // Should be called before destruction to make sure all active 35 // sensors are unregistered. 36 void StopFetchingAllDeviceData(); 37 38 // Returns the shared memory handle of the device sensor data 39 // duplicated into the given process. This method should only be 40 // called after a call to StartFetchingDeviceData method with 41 // corresponding |consumer_type| parameter. 42 base::SharedMemoryHandle GetSharedMemoryHandleForProcess( 43 ConsumerType consumer_type, base::ProcessHandle process); 44 45 enum FetcherType { 46 // Fetcher runs on the same thread as its creator. 47 FETCHER_TYPE_DEFAULT, 48 // Fetcher runs on a separate thread calling |Fetch()| at regular intervals. 49 FETCHER_TYPE_POLLING_CALLBACK, 50 // Fetcher runs on a separate thread, but no callbacks are executed. 51 FETCHER_TYPE_SEPARATE_THREAD 52 }; 53 54 protected: 55 class PollingThread; 56 57 DataFetcherSharedMemoryBase(); 58 virtual ~DataFetcherSharedMemoryBase(); 59 60 // Returns the message loop of the polling thread. 61 // Returns NULL if there is no polling thread. 62 base::MessageLoop* GetPollingMessageLoop() const; 63 64 // If IsPolling() is true this method is called from the |polling_thread_| 65 // at regular intervals. 66 virtual void Fetch(unsigned consumer_bitmask); 67 68 // Returns the type of thread this fetcher runs on. 69 virtual FetcherType GetType() const; 70 71 // Returns the sensor sampling interval. In particular if this fetcher 72 // GetType() == FETCHER_TYPE_POLLING_CALLBACK the interval between 73 // successive calls to Fetch(). 74 virtual base::TimeDelta GetInterval() const; 75 76 // Start() method should call InitSharedMemoryBuffer() to get the shared 77 // memory pointer. If IsPolling() is true both Start() and Stop() methods 78 // are called from the |polling_thread_|. 79 virtual bool Start(ConsumerType consumer_type, void* buffer) = 0; 80 virtual bool Stop(ConsumerType consumer_type) = 0; 81 82 bool IsPollingTimerRunningForTesting() const; 83 84 private: 85 bool InitAndStartPollingThreadIfNecessary(); 86 base::SharedMemory* GetSharedMemory(ConsumerType consumer_type); 87 void* GetSharedMemoryBuffer(ConsumerType consumer_type); 88 89 unsigned started_consumers_; 90 91 scoped_ptr<PollingThread> polling_thread_; 92 93 // Owning pointers. Objects in the map are deleted in dtor. 94 typedef std::map<ConsumerType, base::SharedMemory*> SharedMemoryMap; 95 SharedMemoryMap shared_memory_map_; 96 97 DISALLOW_COPY_AND_ASSIGN(DataFetcherSharedMemoryBase); 98}; 99 100} // namespace content 101 102#endif // CONTENT_BROWSER_DEVICE_SENSORS_DATA_FETCHER_SHARED_MEMORY_BASE_H_ 103