1 /*
2  * Copyright (C) 2014 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 LINKEDBLOCKINGQUEUE_H_
18 #define LINKEDBLOCKINGQUEUE_H_
19 
20 #include <utils/List.h>
21 #include <utils/Mutex.h>
22 #include <utils/Condition.h>
23 
24 namespace android {
25 
26 template<typename T>
27 class LinkedBlockingQueue {
28     List<T> mList;
29     Mutex mLock;
30     Condition mContentAvailableCondition;
31 
front(bool remove)32     T front(bool remove) {
33         Mutex::Autolock autolock(mLock);
34         while (mList.empty()) {
35             mContentAvailableCondition.wait(mLock);
36         }
37         T e = *(mList.begin());
38         if (remove) {
39             mList.erase(mList.begin());
40         }
41         return e;
42     }
43 
44     DISALLOW_EVIL_CONSTRUCTORS(LinkedBlockingQueue);
45 
46 public:
LinkedBlockingQueue()47     LinkedBlockingQueue() {
48     }
49 
~LinkedBlockingQueue()50     ~LinkedBlockingQueue() {
51     }
52 
empty()53     bool empty() {
54         Mutex::Autolock autolock(mLock);
55         return mList.empty();
56     }
57 
clear()58     void clear() {
59         Mutex::Autolock autolock(mLock);
60         mList.clear();
61     }
62 
peek()63     T peek() {
64         return front(false);
65     }
66 
take()67     T take() {
68         return front(true);
69     }
70 
push(T e)71     void push(T e) {
72         Mutex::Autolock autolock(mLock);
73         mList.push_back(e);
74         mContentAvailableCondition.signal();
75     }
76 };
77 
78 } /* namespace android */
79 #endif /* LINKEDBLOCKINGQUEUE_H_ */
80