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 17161e2e84682b0b70467f96d572565149c292592eBrian Duddie#ifndef CHRE_EVENT_REF_QUEUE_H 18161e2e84682b0b70467f96d572565149c292592eBrian Duddie#define CHRE_EVENT_REF_QUEUE_H 19e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include "chre/core/event.h" 21b91f554c4e2b4a65800457cdf62af50b993ff24bAndrew Rossignol#include "chre/util/array_queue.h" 22e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 23e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddienamespace chre { 24e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 25e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie/** 26161e2e84682b0b70467f96d572565149c292592eBrian Duddie * A non-thread-safe, non-blocking wrapper around ArrayQueue that stores Event* 27161e2e84682b0b70467f96d572565149c292592eBrian Duddie * and manages the Event reference counter. 28161e2e84682b0b70467f96d572565149c292592eBrian Duddie * TODO: make this a template specialization? Or rework the ref count design? 29e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie */ 30e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddieclass EventRefQueue { 31e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie public: 325d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie ~EventRefQueue(); 335d9b2d68940f7dac47bf2fbad6f6069ed3b2faaaBrian Duddie 34161e2e84682b0b70467f96d572565149c292592eBrian Duddie /** 35161e2e84682b0b70467f96d572565149c292592eBrian Duddie * @return true if there are no events in the queue 36161e2e84682b0b70467f96d572565149c292592eBrian Duddie */ 37b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol bool empty() const { 38b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol return mQueue.empty(); 39b75315a3e185b4559d73c69eea3b30679239fac1Andrew Rossignol } 40e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 41161e2e84682b0b70467f96d572565149c292592eBrian Duddie /** 42161e2e84682b0b70467f96d572565149c292592eBrian Duddie * Adds an event to the queue, and increments its reference counter 43161e2e84682b0b70467f96d572565149c292592eBrian Duddie * 44161e2e84682b0b70467f96d572565149c292592eBrian Duddie * @param event The event to add 45161e2e84682b0b70467f96d572565149c292592eBrian Duddie * @return true on success 46161e2e84682b0b70467f96d572565149c292592eBrian Duddie */ 47161e2e84682b0b70467f96d572565149c292592eBrian Duddie bool push(Event *event); 48e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 49161e2e84682b0b70467f96d572565149c292592eBrian Duddie /** 50161e2e84682b0b70467f96d572565149c292592eBrian Duddie * Removes the oldest event from the queue, and decrements its reference 51161e2e84682b0b70467f96d572565149c292592eBrian Duddie * counter. Does not trigger freeing of the event if the reference count 52161e2e84682b0b70467f96d572565149c292592eBrian Duddie * reaches 0 as a result of this function call. The queue must be non-empty as 53161e2e84682b0b70467f96d572565149c292592eBrian Duddie * a precondition to calling this function, or undefined behavior will result. 54161e2e84682b0b70467f96d572565149c292592eBrian Duddie * 55161e2e84682b0b70467f96d572565149c292592eBrian Duddie * @return Pointer to the next event in the queue 56161e2e84682b0b70467f96d572565149c292592eBrian Duddie */ 57161e2e84682b0b70467f96d572565149c292592eBrian Duddie Event *pop(); 58e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 59e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie private: 60b91f554c4e2b4a65800457cdf62af50b993ff24bAndrew Rossignol //! The maximum number of events that can be outstanding for an app. 61b91f554c4e2b4a65800457cdf62af50b993ff24bAndrew Rossignol static constexpr size_t kMaxPendingEvents = 16; 62b91f554c4e2b4a65800457cdf62af50b993ff24bAndrew Rossignol 63b91f554c4e2b4a65800457cdf62af50b993ff24bAndrew Rossignol //! The queue of incoming events. 64b91f554c4e2b4a65800457cdf62af50b993ff24bAndrew Rossignol ArrayQueue<Event *, kMaxPendingEvents> mQueue; 65e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie}; 66e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 67e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie} // namespace chre 68e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie 69161e2e84682b0b70467f96d572565149c292592eBrian Duddie#endif // CHRE_EVENT_REF_QUEUE_H 70