fixed_size_blocking_queue.h revision a7a83ccc5af22dd87d35ce737c38ac267d54005c
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_H_
18#define CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_H_
19
20#include <deque>
21
22#include "chre/platform/condition_variable.h"
23#include "chre/platform/mutex.h"
24#include "chre/util/array_queue.h"
25#include "chre/util/non_copyable.h"
26
27namespace chre {
28
29/**
30 * Implements a thread-safe blocking queue that blocks when popping an element
31 * if necessary.
32 */
33template <typename ElementType, size_t kSize>
34class FixedSizeBlockingQueue : public NonCopyable {
35 public:
36  /**
37   * Pushes an element into the queue and notifies any waiting threads that an
38   * element is available.
39   *
40   * @param The element to be pushed.
41   *
42   * @return true if the element is pushed successfully.
43   */
44  bool push(const ElementType& element);
45  bool push(ElementType&& element);
46
47  /**
48   * Pops one element from the queue. If the queue is empty, the thread will
49   * block until an element has been pushed.
50   *
51   * @return The element that was popped.
52   */
53  ElementType pop();
54
55  /**
56   * Determines whether or not the BlockingQueue is empty.
57   */
58  bool empty();
59
60  /**
61   * Determines the current size of the BlockingQueue.
62   */
63  size_t size();
64
65  /**
66   * Removes an element from the array queue given an index. It returns false if
67   * the index is out of bounds of the underlying array queue.
68   *
69   * @param index Requested index in range [0,size()-1]
70   * @return true if the indexed element has been removed successfully.
71   */
72  bool remove(size_t index);
73
74  /**
75   * Obtains an element of the array queue given an index. It is illegal to
76   * index this array queue out of bounds and the user of the API must check the
77   * size() function prior to indexing this array queue to ensure that they will
78   * not read out of bounds.
79   *
80   * @param index Requested index in range [0,size()-1]
81   * @return The element.
82   */
83  ElementType& operator[](size_t index);
84
85  /**
86   * Obtains a const element of the queue given an index. It is illegal to index
87   * this queue out of bounds and the user of the API must check the size()
88   * function prior to indexing this queue to ensure that they will not read out
89   * of bounds.
90   *
91   * @param index Requested index in the rante [0,size()-1]
92   * @return The element.
93   */
94  const ElementType& operator[](size_t index) const;
95
96 private:
97  //! The mutex used to ensure thread-safety.
98  Mutex mMutex;
99
100  //! The condition variable used to implement the blocking behavior of the
101  //! queue.
102  ConditionVariable mConditionVariable;
103
104  //! The underlying fixed size container backing the queue.
105  ArrayQueue<ElementType, kSize> mQueue;
106};
107
108}  // namespace chre
109
110#include "chre/util/fixed_size_blocking_queue_impl.h"
111
112#endif  // CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_H_
113