event_loop.h revision 09a4783208b5ba1e14d0f0102eb31e688caca28d
1e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/*
2e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Copyright (C) 2016 The Android Open Source Project
3e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
4e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Licensed under the Apache License, Version 2.0 (the "License");
5e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * you may not use this file except in compliance with the License.
6e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * You may obtain a copy of the License at
7e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
8e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *      http://www.apache.org/licenses/LICENSE-2.0
9e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie *
10e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Unless required by applicable law or agreed to in writing, software
11e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * distributed under the License is distributed on an "AS IS" BASIS,
12e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * See the License for the specific language governing permissions and
14e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * limitations under the License.
15e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */
16e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
17e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#ifndef CHRE_CORE_EVENT_LOOP_H_
18e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#define CHRE_CORE_EVENT_LOOP_H_
19e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/event.h"
21e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/nanoapp.h"
22fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol#include "chre/core/timer_pool.h"
23977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie#include "chre/platform/mutex.h"
242de17c9c5c541d72248f8371dfb4d7e402dc93e8Andrew Rossignol#include "chre/platform/platform_nanoapp.h"
25c03d7df169f13195652de29f4452830130a0c53fAndrew Rossignol#include "chre/util/dynamic_vector.h"
26022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#include "chre/util/fixed_size_blocking_queue.h"
27e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/util/non_copyable.h"
28a1d5686c7513f6b8a436efd9f554d8c2227a2291Brian Duddie#include "chre/util/synchronized_memory_pool.h"
292de17c9c5c541d72248f8371dfb4d7e402dc93e8Andrew Rossignol#include "chre/util/unique_ptr.h"
30e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
31e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddienamespace chre {
32e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
33e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/**
34977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * The EventLoop represents a single thread of execution that is shared among
35977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * zero or more nanoapps. As the name implies, the EventLoop is built around a
36977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * loop that delivers events to the nanoapps managed within for processing.
37e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */
38e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieclass EventLoop : public NonCopyable {
39e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie public:
40fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol  /**
41fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol   * Setup the event loop.
42fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol   */
43fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol  EventLoop();
44fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol
45977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  /**
46a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * Synchronous callback used with forEachNanoapp
47a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   */
48a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie  typedef void (NanoappCallbackFunction)(const Nanoapp *nanoapp, void *data);
49a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie
50a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie  /**
51977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * Searches the set of nanoapps managed by this EventLoop for one with the
52977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * given app ID. If found, provides its instance ID, which can be used to send
53977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * events to the app.
54977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   *
55977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * This function is safe to call from any thread.
56977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   *
57977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * @param appId The nanoapp identifier to search for.
58977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * @param instanceId If this function returns true, will be populated with the
59977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   *        instanceId associated with the given appId; otherwise unmodified.
60977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   *        Must not be null.
61977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * @return true if the given app ID was found and instanceId was populated
62977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   */
63977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  bool findNanoappInstanceIdByAppId(uint64_t appId, uint32_t *instanceId);
64e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
65e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  /**
66a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * Iterates over the list of Nanoapps managed by this EventLoop, and invokes
67a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * the supplied callback for each one. This holds a lock if necessary, so it
68a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * is safe to call from any thread.
69a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   *
70a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * @param callback Function to invoke on each Nanoapp (synchronously)
71a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * @param data Arbitrary data to pass to the callback
72a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   */
73a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie  void forEachNanoapp(NanoappCallbackFunction *callback, void *data);
74a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie
75a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie  /**
7609a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * Invokes a message to host free callback supplied by the given nanoapp
7709a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * (identified by app ID). Ensures that the calling context is updated
7809a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * appropriately.
7909a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   *
8009a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * @param appId Identifies the nanoapp that sent this message and supplied the
8109a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   *        free callback
8209a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * @param freeFunction The non-null message free callback given by the nanoapp
8309a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * @param message Pointer to the message data
8409a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * @param messageSize Size of the message
8509a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   */
8609a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie  void invokeMessageFreeFunction(
8709a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie      uint64_t appId, chreMessageFreeFunction *freeFunction, void *message,
8809a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie      size_t messageSize);
8909a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie
9009a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie  /**
919d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   * Invokes the Nanoapp's start callback, and if successful, adds it to the
929d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   * set of Nanoapps managed by this EventLoop. This function must only be
939d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   * called from the context of the thread that runs this event loop (i.e. from
949d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   * the same thread that will call run() or from a callback invoked within
959d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   * run()).
96e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   *
979d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   * @param nanoapp The nanoapp that will be started. Upon success, this
989d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   *        UniquePtr will become invalid, as the underlying Nanoapp instance
999d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   *        will have been transferred to be managed by this EventLoop.
1009d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie   * @return true if the app was started successfully
101e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   */
1029d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie  bool startNanoapp(UniquePtr<Nanoapp>& nanoapp);
103e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
104e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  /**
105e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   * Stops a nanoapp by invoking the stop entry point. The nanoapp passed in
1065d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * must have been previously started by the startNanoapp method. After this
1075d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * function returns, all references to the Nanoapp are invalid.
108e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   *
1095d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @param nanoapp A pointer to the nanoapp to stop.
110e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   */
111e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  void stopNanoapp(Nanoapp *nanoapp);
112e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
113e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  /**
114977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * Executes the loop that blocks on the event queue and delivers received
115977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * events to nanoapps. Only returns after stop() is called (from another
116977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * context).
117e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   */
118e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  void run();
119e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
120e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  /**
121e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   * Signals the event loop currently executing in run() to exit gracefully at
122f80ea015d077330cfdbd619680b250915ffcf1d2Brian Duddie   * the next available opportunity. This function is thread-safe.
123e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   */
124e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  void stop();
125e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
1264927ee586656424c827920876673228fbdcf27c3Andrew Rossignol  /**
1274927ee586656424c827920876673228fbdcf27c3Andrew Rossignol   * Posts an event to a nanoapp that is currently running (or all nanoapps if
128042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie   * the target instance ID is kBroadcastInstanceId).
129042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie   *
130042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie   * This function is safe to call from any thread.
1314927ee586656424c827920876673228fbdcf27c3Andrew Rossignol   *
1325d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @param eventType The type of data being posted.
1335d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @param eventData The data being posted.
1345d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @param freeCallback The callback to invoke when the event is no longer
1355d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   *        needed.
1365d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @param senderInstanceId The instance ID of the sender of this event.
1375d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @param targetInstanceId The instance ID of the destination of this event.
1384927ee586656424c827920876673228fbdcf27c3Andrew Rossignol   *
139a12d05f5b1b8bd8d953a328758426b7ca8b5e6deBrian Duddie   * @return true if the event was successfully added to the queue. Note that
140a12d05f5b1b8bd8d953a328758426b7ca8b5e6deBrian Duddie   *         unlike chreSendEvent, this does *not* invoke the free callback if
141a12d05f5b1b8bd8d953a328758426b7ca8b5e6deBrian Duddie   *         it failed to post the event.
1425d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   *
1435d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @see chreSendEvent
1444927ee586656424c827920876673228fbdcf27c3Andrew Rossignol   */
145042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie  bool postEvent(uint16_t eventType, void *eventData,
1464927ee586656424c827920876673228fbdcf27c3Andrew Rossignol                 chreEventCompleteFunction *freeCallback,
1474927ee586656424c827920876673228fbdcf27c3Andrew Rossignol                 uint32_t senderInstanceId = kSystemInstanceId,
1484927ee586656424c827920876673228fbdcf27c3Andrew Rossignol                 uint32_t targetInstanceId = kBroadcastInstanceId);
149e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
150e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  /**
151e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   * Returns a pointer to the currently executing Nanoapp, or nullptr if none is
152977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * currently executing. Must only be called from within the thread context
153977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * associated with this EventLoop.
154e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   *
155977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * @return the currently executing nanoapp, or nullptr
156e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie   */
1577983050d7cd84f1d5736f220ef9fd49be716b2c8Andrew Rossignol  Nanoapp *getCurrentNanoapp() const;
158e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
159e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  /**
160a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * Gets the number of nanoapps currently associated with this event loop. Must
161a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * only be called within the context of this EventLoop.
162a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   *
163a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   * @return The number of nanoapps managed by this event loop
164a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie   */
165a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie  size_t getNanoappCount() const;
166a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie
167a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie  /**
168725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol   * Obtains the TimerPool associated with this event loop.
169725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol   *
170725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol   * @return The timer pool owned by this event loop.
171725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol   */
172725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol  TimerPool& getTimerPool();
173725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol
17430f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol  /**
17530f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   * Searches the set of nanoapps managed by this EventLoop for one with the
17630f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   * given instance ID.
17730f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   *
17830f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   * This function is safe to call from any thread.
17930f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   *
18030f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   * @param instanceId The nanoapp instance ID to search for.
18130f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   * @return a pointer to the found nanoapp or nullptr if no match was found.
18230f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol   */
18330f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol  Nanoapp *findNanoappByInstanceId(uint32_t instanceId);
18430f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol
185e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie private:
1864927ee586656424c827920876673228fbdcf27c3Andrew Rossignol  //! The maximum number of events that can be active in the system.
1874927ee586656424c827920876673228fbdcf27c3Andrew Rossignol  static constexpr size_t kMaxEventCount = 1024;
1884927ee586656424c827920876673228fbdcf27c3Andrew Rossignol
189022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol  //! The maximum number of events that are awaiting to be scheduled. These
190022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol  //! events are in a queue to be distributed to apps.
191022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol  static constexpr size_t kMaxUnscheduledEventCount = 1024;
192022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol
1934927ee586656424c827920876673228fbdcf27c3Andrew Rossignol  //! The memory pool to allocate incoming events from.
194f7914d0fbadf2644c0c4096380c741bee2a026e0Andrew Rossignol  SynchronizedMemoryPool<Event, kMaxEventCount> mEventPool;
1954927ee586656424c827920876673228fbdcf27c3Andrew Rossignol
196fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol  //! The timer used schedule timed events for tasks running in this event loop.
197fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol  TimerPool mTimerPool;
198fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol
199c03d7df169f13195652de29f4452830130a0c53fAndrew Rossignol  //! The list of nanoapps managed by this event loop.
2002de17c9c5c541d72248f8371dfb4d7e402dc93e8Andrew Rossignol  DynamicVector<UniquePtr<Nanoapp>> mNanoapps;
201725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol
202977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  //! This lock *must* be held whenever we:
203977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  //!   (1) make changes to the mNanoapps vector, or
204977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  //!   (2) read the mNanoapps vector from a thread other than the one
205977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  //!       associated with this EventLoop
206977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  //! It is not necessary to acquire the lock when reading mNanoapps from within
207977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  //! the thread context of this EventLoop.
208977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  Mutex mNanoappsLock;
209977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie
210c03d7df169f13195652de29f4452830130a0c53fAndrew Rossignol  //! The blocking queue of incoming events from the system that have not been
211c03d7df169f13195652de29f4452830130a0c53fAndrew Rossignol  //!  distributed out to apps yet.
2121795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol  FixedSizeBlockingQueue<Event *, kMaxUnscheduledEventCount> mEvents;
213e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
214977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  // TODO: should probably be atomic to be fully correct
2158c56d08e149720fcb99e6ddc71289ebb5ee594e6Brian Duddie  volatile bool mRunning = true;
216e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
217e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  Nanoapp *mCurrentApp = nullptr;
218e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
219977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  /**
2205d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * Delivers the next event pending in the Nanoapp's queue, and takes care of
2215d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * freeing events once they have been delivered to all nanoapps. Must only be
2225d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * called after confirming that the app has at least 1 pending event.
2235d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   *
2245d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * @return true if the nanoapp has another event pending in its queue
2255d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   */
2265d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie  bool deliverNextEvent(const UniquePtr<Nanoapp>& app);
2275d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie
2285d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie  /**
229977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * Call after when an Event has been delivered to all intended recipients.
230977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * Invokes the event's free callback (if given) and releases resources.
231977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   *
232977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * @param event The event to be freed
233977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   */
234e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie  void freeEvent(Event *event);
235e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
236977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  /**
23709a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * Finds a Nanoapp with the given 64-bit appId.
23809a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   *
23909a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * Only safe to call within this EventLoop's thread.
24009a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   *
24109a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * @param appId Nanoapp ID
24209a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   * @return Pointer to Nanoapp instance in this EventLoop with the given app
24309a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   *         ID, or nullptr if not found
24409a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie   */
24509a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie  Nanoapp *lookupAppByAppId(uint64_t appId);
24609a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie
24709a4783208b5ba1e14d0f0102eb31e688caca28dBrian Duddie  /**
248977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * Finds a Nanoapp with the given instanceId.
249977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   *
250977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * Only safe to call within this EventLoop's thread.
251977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   *
252977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * @param instanceId Nanoapp instance identifier
253977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   * @return Nanoapp with the given instanceId, or nullptr if not found
254977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie   */
255977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie  Nanoapp *lookupAppByInstanceId(uint32_t instanceId);
2565d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie
2575d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie  /**
2585d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   * Stops the Nanoapp at the given index in mNanoapps
2595d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie   */
2605d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie  void stopNanoapp(size_t index);
261e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie};
262e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
263e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie}  // namespace chre
264e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
265e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#endif  // CHRE_CORE_EVENT_LOOP_H_
266