1aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol/* 2aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * Copyright (C) 2016 The Android Open Source Project 3aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * 4aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License"); 5aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * you may not use this file except in compliance with the License. 6aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * You may obtain a copy of the License at 7aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * 8aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * http://www.apache.org/licenses/LICENSE-2.0 9aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * 10aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * Unless required by applicable law or agreed to in writing, software 11aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS, 12aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * See the License for the specific language governing permissions and 14aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol * limitations under the License. 15aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol */ 16aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 17022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#ifndef CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_IMPL_H_ 18022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#define CHRE_UTIL_FIXED_SIZE_BLOCKING_QUEUE_IMPL_H_ 19aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 20022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol#include "chre/util/fixed_size_blocking_queue.h" 21af8a810ee31e82fb1a5b18d3caef98633ba22799Andrew Rossignol#include "chre/util/lock_guard.h" 22aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 23aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignolnamespace chre { 24aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 25022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignoltemplate<typename ElementType, size_t kSize> 26042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddiebool FixedSizeBlockingQueue<ElementType, kSize>::push( 27022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol const ElementType& element) { 28042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie bool success; 29aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol { 30af8a810ee31e82fb1a5b18d3caef98633ba22799Andrew Rossignol LockGuard<Mutex> lock(mMutex); 31042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie success = mQueue.push(element); 32aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol } 33042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie if (success) { 34042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie mConditionVariable.notify_one(); 35042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie } 36042f73e3b7f019c818f69b2c097c4b6f9db839b5Brian Duddie return success; 37aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol} 38aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 39022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignoltemplate<typename ElementType, size_t kSize> 40a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishigurobool FixedSizeBlockingQueue<ElementType, kSize>::push(ElementType&& element) { 41a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro bool success; 42a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro { 43a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro LockGuard<Mutex> lock(mMutex); 44a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro success = mQueue.push(std::move(element)); 45a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro } 46a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro if (success) { 47a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro mConditionVariable.notify_one(); 48a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro } 49a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro return success; 50a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro} 51a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishiguro 52a7a83ccc5af22dd87d35ce737c38ac267d54005cArthur Ishigurotemplate<typename ElementType, size_t kSize> 53022cc6c770c299bb364e35377a2661791475bbceAndrew RossignolElementType FixedSizeBlockingQueue<ElementType, kSize>::pop() { 54af8a810ee31e82fb1a5b18d3caef98633ba22799Andrew Rossignol LockGuard<Mutex> lock(mMutex); 55aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol while (mQueue.empty()) { 56aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol mConditionVariable.wait(mMutex); 57aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol } 58aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 59aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol ElementType element(std::move(mQueue.front())); 60022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignol mQueue.pop(); 61aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol return element; 62aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol} 63aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 64022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignoltemplate<typename ElementType, size_t kSize> 65022cc6c770c299bb364e35377a2661791475bbceAndrew Rossignolbool FixedSizeBlockingQueue<ElementType, kSize>::empty() { 66af8a810ee31e82fb1a5b18d3caef98633ba22799Andrew Rossignol LockGuard<Mutex> lock(mMutex); 67aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol return mQueue.empty(); 68aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol} 69aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 70ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishigurotemplate<typename ElementType, size_t kSize> 71ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishigurosize_t FixedSizeBlockingQueue<ElementType, kSize>::size() { 72ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro LockGuard<Mutex> lock(mMutex); 73ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro return mQueue.size(); 74ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro} 75ff1c1a2ab3ff2614bb6cea1f1d6f6e9c44a87464Arthur Ishiguro 768a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignoltemplate<typename ElementType, size_t kSize> 778a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignolbool FixedSizeBlockingQueue<ElementType, kSize>::remove(size_t index) { 788a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol LockGuard<Mutex> lock(mMutex); 798a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol return mQueue.remove(index); 808a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol} 818a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol 828a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 838a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew RossignolElementType& FixedSizeBlockingQueue<ElementType, kCapacity>::operator[]( 848a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol size_t index) { 858a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol LockGuard<Mutex> lock(mMutex); 868a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol return mQueue[index]; 878a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol} 888a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol 898a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignoltemplate<typename ElementType, size_t kCapacity> 908a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignolconst ElementType& FixedSizeBlockingQueue<ElementType, kCapacity>::operator[]( 918a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol size_t index) const { 928a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol LockGuard<Mutex> lock(mMutex); 938a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol return mQueue[index]; 948a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol} 958a6e33be3c2c1faa1b2b1cedb1df46342884c3abAndrew Rossignol 96aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol} // namespace chre 97aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol 98aa718a9536c0547620c183d90195bfb0f76f8284Andrew Rossignol#endif // CHRE_UTIL_BLOCKING_QUEUE_IMPL_H_ 99