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