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
17022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#ifndef CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_H_
18022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#define CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_H_
19e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
20e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie#include <deque>
21e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
22aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol#include "chre/platform/condition_variable.h"
23aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol#include "chre/platform/mutex.h"
24022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#include "chre/util/array_queue.h"
25aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol#include "chre/util/non_copyable.h"
26aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
27aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignolnamespace chre {
28aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
29aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol/**
30aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * Implements a thread-safe blocking queue that blocks when popping an element
31aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * if necessary.
32aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol */
33022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignoltemplate <typename ElementType, size_t kSize>
34022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignolclass FixedSizeBlockingQueue : public NonCopyable {
35e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie public:
36aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  /**
37aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   * Pushes an element into the queue and notifies any waiting threads that an
38aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   * element is available.
39aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   *
40aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   * @param The element to be pushed.
41042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie   *
42042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie   * @return true if the element is pushed successfully.
43aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   */
44042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie  bool push(const ElementType& element);
45aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
46aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  /**
47aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   * Pops one element from the queue. If the queue is empty, the thread will
48aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   * block until an element has been pushed.
49aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   *
50aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   * @return The element that was popped.
51aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   */
52aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  ElementType pop();
53aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
54aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  /**
55aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   * Determines whether or not the BlockingQueue is empty.
56aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol   */
57aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  bool empty();
58e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
59ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro  /**
60ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro   * Determines the current size of the BlockingQueue.
61ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro   */
62ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro  size_t size();
63ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro
64e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie private:
65aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  //! The mutex used to ensure thread-safety.
66aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  Mutex mMutex;
67aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
68aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  //! The condition variable used to implement the blocking behavior of the
69aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  //! queue.
70aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol  ConditionVariable mConditionVariable;
71aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
72022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol  //! The underlying fixed size container backing the queue.
73022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol  ArrayQueue<ElementType, kSize> mQueue;
74e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie};
75e64f180233e64c40b56993cfea3696c5b4b16395Brian Duddie
76aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol}  // namespace chre
77aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
78022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#include "chre/util/fixed_size_blocking_queue_impl.h"
79aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol
80022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#endif  // CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_H_
81