Added threadsafe queue.

Change-Id: I431d286b34009c91194d22b5bef416f842e555b4
diff --git a/include/hidl/SynchronizedQueue.h b/include/hidl/SynchronizedQueue.h
new file mode 100644
index 0000000..4095c56
--- /dev/null
+++ b/include/hidl/SynchronizedQueue.h
@@ -0,0 +1,60 @@
+#include <condition_variable>
+#include <mutex>
+#include <queue>
+#include <thread>
+
+/* Threadsafe queue.
+ */
+template <typename T>
+struct SynchronizedQueue {
+
+    /* Gets an item from the front of the queue.
+     *
+     * Blocks until the item is available.
+     */
+    T wait_pop();
+
+    /* Puts an item onto the end of the queue.
+     */
+    void push(const T& item);
+
+    /* Gets the size of the array.
+     */
+    size_t size();
+
+private:
+    std::condition_variable mCondition;
+    std::mutex mMutex;
+    std::queue<T> mQueue;
+};
+
+template <typename T>
+T SynchronizedQueue<T>::wait_pop() {
+    std::unique_lock<std::mutex> lock(mMutex);
+
+    mCondition.wait(lock, [this]{
+        return !this->mQueue.empty();
+    });
+
+    T item = mQueue.front();
+    mQueue.pop();
+
+    return item;
+}
+
+template <typename T>
+void SynchronizedQueue<T>::push(const T &item) {
+    {
+        std::unique_lock<std::mutex> lock(mMutex);
+        mQueue.push(item);
+    }
+
+    mCondition.notify_one();
+}
+
+template <typename T>
+size_t SynchronizedQueue<T>::size() {
+    std::unique_lock<std::mutex> lock(mMutex);
+
+    return mQueue.size();
+}
\ No newline at end of file