• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 namespace 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.
23 class 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   // Returns the shared memory handle of the device sensor data
35   // duplicated into the given process. This method should only be
36   // called after a call to StartFetchingDeviceData method with
37   // corresponding |consumer_type| parameter.
38   base::SharedMemoryHandle GetSharedMemoryHandleForProcess(
39       ConsumerType consumer_type, base::ProcessHandle process);
40 
41   enum FetcherType {
42     // Fetcher runs on the same thread as its creator.
43     FETCHER_TYPE_DEFAULT,
44     // Fetcher runs on a separate thread calling |Fetch()| at regular intervals.
45     FETCHER_TYPE_POLLING_CALLBACK,
46     // Fetcher runs on a separate thread, but no callbacks are executed.
47     FETCHER_TYPE_SEPARATE_THREAD
48   };
49 
50  protected:
51   class PollingThread;
52 
53   DataFetcherSharedMemoryBase();
54   virtual ~DataFetcherSharedMemoryBase();
55 
56   // Returns the message loop of the polling thread.
57   // Returns NULL if there is no polling thread.
58   base::MessageLoop* GetPollingMessageLoop() const;
59 
60   // If IsPolling() is true this method is called from the |polling_thread_|
61   // at regular intervals.
62   virtual void Fetch(unsigned consumer_bitmask);
63 
64   // Returns the type of thread this fetcher runs on.
65   virtual FetcherType GetType() const;
66 
67   // Returns the sensor sampling interval. In particular if this fetcher
68   // GetType() == FETCHER_TYPE_POLLING_CALLBACK the interval between
69   // successive calls to Fetch().
70   virtual base::TimeDelta GetInterval() const;
71 
72   // Start() method should call InitSharedMemoryBuffer() to get the shared
73   // memory pointer. If IsPolling() is true both Start() and Stop() methods
74   // are called from the |polling_thread_|.
75   virtual bool Start(ConsumerType consumer_type, void* buffer) = 0;
76   virtual bool Stop(ConsumerType consumer_type) = 0;
77 
78   bool IsPollingTimerRunningForTesting() const;
79 
80  private:
81   bool InitAndStartPollingThreadIfNecessary();
82   base::SharedMemory* GetSharedMemory(ConsumerType consumer_type);
83   void* GetSharedMemoryBuffer(ConsumerType consumer_type);
84 
85   unsigned started_consumers_;
86 
87   scoped_ptr<PollingThread> polling_thread_;
88 
89   // Owning pointers. Objects in the map are deleted in dtor.
90   typedef std::map<ConsumerType, base::SharedMemory*> SharedMemoryMap;
91   SharedMemoryMap shared_memory_map_;
92 
93   DISALLOW_COPY_AND_ASSIGN(DataFetcherSharedMemoryBase);
94 };
95 
96 }  // namespace content
97 
98 #endif  // CONTENT_BROWSER_DEVICE_SENSORS_DATA_FETCHER_SHARED_MEMORY_BASE_H_
99