event_loop.h revision 8c56d08e149720fcb99e6ddc71289ebb5ee594e6
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 /** 769d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * Invokes the Nanoapp's start callback, and if successful, adds it to the 779d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * set of Nanoapps managed by this EventLoop. This function must only be 789d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * called from the context of the thread that runs this event loop (i.e. from 799d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * the same thread that will call run() or from a callback invoked within 809d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * run()). 81e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 829d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * @param nanoapp The nanoapp that will be started. Upon success, this 839d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * UniquePtr will become invalid, as the underlying Nanoapp instance 849d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * will have been transferred to be managed by this EventLoop. 859d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie * @return true if the app was started successfully 86e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 879d5b500a223ef73560f0dce38f50b809bde5dd0dBrian Duddie bool startNanoapp(UniquePtr<Nanoapp>& nanoapp); 88e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 89e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie /** 90e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Stops a nanoapp by invoking the stop entry point. The nanoapp passed in 915d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * must have been previously started by the startNanoapp method. After this 925d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * function returns, all references to the Nanoapp are invalid. 93e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 945d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @param nanoapp A pointer to the nanoapp to stop. 95e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 96e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie void stopNanoapp(Nanoapp *nanoapp); 97e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 98e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie /** 99977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * Executes the loop that blocks on the event queue and delivers received 100977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * events to nanoapps. Only returns after stop() is called (from another 101977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * context). 102e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 103e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie void run(); 104e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 105e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie /** 106e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Signals the event loop currently executing in run() to exit gracefully at 107f80ea015d077330cfdbd619680b250915ffcf1d2Brian Duddie * the next available opportunity. This function is thread-safe. 108e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 109e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie void stop(); 110e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 1114927ee586656424c827920876673228fbdcf27c3Andrew Rossignol /** 1124927ee586656424c827920876673228fbdcf27c3Andrew Rossignol * Posts an event to a nanoapp that is currently running (or all nanoapps if 113042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie * the target instance ID is kBroadcastInstanceId). 114042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie * 115042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie * This function is safe to call from any thread. 1164927ee586656424c827920876673228fbdcf27c3Andrew Rossignol * 1175d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @param eventType The type of data being posted. 1185d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @param eventData The data being posted. 1195d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @param freeCallback The callback to invoke when the event is no longer 1205d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * needed. 1215d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @param senderInstanceId The instance ID of the sender of this event. 1225d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @param targetInstanceId The instance ID of the destination of this event. 1234927ee586656424c827920876673228fbdcf27c3Andrew Rossignol * 124a12d05f5b1b8bd8d953a328758426b7ca8b5e6deBrian Duddie * @return true if the event was successfully added to the queue. Note that 125a12d05f5b1b8bd8d953a328758426b7ca8b5e6deBrian Duddie * unlike chreSendEvent, this does *not* invoke the free callback if 126a12d05f5b1b8bd8d953a328758426b7ca8b5e6deBrian Duddie * it failed to post the event. 1275d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * 1285d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @see chreSendEvent 1294927ee586656424c827920876673228fbdcf27c3Andrew Rossignol */ 130042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie bool postEvent(uint16_t eventType, void *eventData, 1314927ee586656424c827920876673228fbdcf27c3Andrew Rossignol chreEventCompleteFunction *freeCallback, 1324927ee586656424c827920876673228fbdcf27c3Andrew Rossignol uint32_t senderInstanceId = kSystemInstanceId, 1334927ee586656424c827920876673228fbdcf27c3Andrew Rossignol uint32_t targetInstanceId = kBroadcastInstanceId); 134e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 135e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie /** 136e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * Returns a pointer to the currently executing Nanoapp, or nullptr if none is 137977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * currently executing. Must only be called from within the thread context 138977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * associated with this EventLoop. 139e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie * 140977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * @return the currently executing nanoapp, or nullptr 141e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 1427983050d7cd84f1d5736f220ef9fd49be716b2c8Andrew Rossignol Nanoapp *getCurrentNanoapp() const; 143e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 144e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie /** 145a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie * Gets the number of nanoapps currently associated with this event loop. Must 146a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie * only be called within the context of this EventLoop. 147a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie * 148a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie * @return The number of nanoapps managed by this event loop 149a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie */ 150a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie size_t getNanoappCount() const; 151a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie 152a2f5add27054c406f36528cf8a5cbc6d4c79d246Brian Duddie /** 153725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol * Obtains the TimerPool associated with this event loop. 154725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol * 155725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol * @return The timer pool owned by this event loop. 156725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol */ 157725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol TimerPool& getTimerPool(); 158725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol 15930f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol /** 16030f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol * Searches the set of nanoapps managed by this EventLoop for one with the 16130f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol * given instance ID. 16230f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol * 16330f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol * This function is safe to call from any thread. 16430f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol * 16530f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol * @param instanceId The nanoapp instance ID to search for. 16630f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol * @return a pointer to the found nanoapp or nullptr if no match was found. 16730f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol */ 16830f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol Nanoapp *findNanoappByInstanceId(uint32_t instanceId); 16930f18903edc1dfe46e12b9989760ef7a56cb31d3Andrew Rossignol 170e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie private: 1714927ee586656424c827920876673228fbdcf27c3Andrew Rossignol //! The maximum number of events that can be active in the system. 1724927ee586656424c827920876673228fbdcf27c3Andrew Rossignol static constexpr size_t kMaxEventCount = 1024; 1734927ee586656424c827920876673228fbdcf27c3Andrew Rossignol 174022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol //! The maximum number of events that are awaiting to be scheduled. These 175022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol //! events are in a queue to be distributed to apps. 176022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol static constexpr size_t kMaxUnscheduledEventCount = 1024; 177022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol 1784927ee586656424c827920876673228fbdcf27c3Andrew Rossignol //! The memory pool to allocate incoming events from. 179f7914d0fbadf2644c0c4096380c741bee2a026e0Andrew Rossignol SynchronizedMemoryPool<Event, kMaxEventCount> mEventPool; 1804927ee586656424c827920876673228fbdcf27c3Andrew Rossignol 181fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol //! The timer used schedule timed events for tasks running in this event loop. 182fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol TimerPool mTimerPool; 183fbb213b072fec0a14f437ad55685c4d95eec829eAndrew Rossignol 184c03d7df169f13195652de29f4452830130a0c53fAndrew Rossignol //! The list of nanoapps managed by this event loop. 1852de17c9c5c541d72248f8371dfb4d7e402dc93e8Andrew Rossignol DynamicVector<UniquePtr<Nanoapp>> mNanoapps; 186725bef45ca127971b3ea798cd1f4e4b2c0d8fe9dAndrew Rossignol 187977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie //! This lock *must* be held whenever we: 188977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie //! (1) make changes to the mNanoapps vector, or 189977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie //! (2) read the mNanoapps vector from a thread other than the one 190977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie //! associated with this EventLoop 191977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie //! It is not necessary to acquire the lock when reading mNanoapps from within 192977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie //! the thread context of this EventLoop. 193977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie Mutex mNanoappsLock; 194977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie 195c03d7df169f13195652de29f4452830130a0c53fAndrew Rossignol //! The blocking queue of incoming events from the system that have not been 196c03d7df169f13195652de29f4452830130a0c53fAndrew Rossignol //! distributed out to apps yet. 1971795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol FixedSizeBlockingQueue<Event *, kMaxUnscheduledEventCount> mEvents; 198e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 199977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie // TODO: should probably be atomic to be fully correct 2008c56d08e149720fcb99e6ddc71289ebb5ee594e6Brian Duddie volatile bool mRunning = true; 201e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 202e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie Nanoapp *mCurrentApp = nullptr; 203e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 204977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie /** 2055d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * Delivers the next event pending in the Nanoapp's queue, and takes care of 2065d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * freeing events once they have been delivered to all nanoapps. Must only be 2075d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * called after confirming that the app has at least 1 pending event. 2085d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * 2095d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * @return true if the nanoapp has another event pending in its queue 2105d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie */ 2115d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie bool deliverNextEvent(const UniquePtr<Nanoapp>& app); 2125d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie 2135d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie /** 214977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * Call after when an Event has been delivered to all intended recipients. 215977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * Invokes the event's free callback (if given) and releases resources. 216977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * 217977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * @param event The event to be freed 218977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie */ 219e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie void freeEvent(Event *event); 220e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 221977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie /** 222977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * Finds a Nanoapp with the given instanceId. 223977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * 224977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * Only safe to call within this EventLoop's thread. 225977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * 226977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * @param instanceId Nanoapp instance identifier 227977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie * @return Nanoapp with the given instanceId, or nullptr if not found 228977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie */ 229977321d9ad051d4d6519a5fa8c2ca914f4d1424fBrian Duddie Nanoapp *lookupAppByInstanceId(uint32_t instanceId); 2305d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie 2315d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie /** 2325d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie * Stops the Nanoapp at the given index in mNanoapps 2335d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie */ 2345d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie void stopNanoapp(size_t index); 235e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie}; 236e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 237e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie} // namespace chre 238e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 239e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#endif // CHRE_CORE_EVENT_LOOP_H_ 240