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