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