1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIBRARIES_SDK_UTIL_THREAD_SAFE_QUEUE_H_
6#define LIBRARIES_SDK_UTIL_THREAD_SAFE_QUEUE_H_
7
8#include <pthread.h>
9
10#include <list>
11
12#include "sdk_util/auto_lock.h"
13#include "sdk_util/macros.h"
14
15namespace sdk_util {
16
17// ThreadSafeQueue
18//
19// A simple template to support multithreaded and optionally blocking access
20// to a Queue of object pointers.
21//
22template<class T> class ThreadSafeQueue {
23 public:
24  ThreadSafeQueue() {
25    pthread_cond_init(&cond_, NULL);
26  }
27
28  ~ThreadSafeQueue() {
29    pthread_cond_destroy(&cond_);
30  }
31
32  void Enqueue(T* item) {
33    AUTO_LOCK(lock_);
34    list_.push_back(item);
35
36    pthread_cond_signal(&cond_);
37  }
38
39  T* Dequeue(bool block) {
40    AUTO_LOCK(lock_);
41
42    // If blocking enabled, wait until we queue is non-empty
43    if (block) {
44      while (list_.empty()) pthread_cond_wait(&cond_, lock_.mutex());
45    }
46
47    if (list_.empty()) return NULL;
48
49    T* item = list_.front();
50    list_.pop_front();
51    return item;
52  }
53
54 private:
55  std::list<T*> list_;
56  pthread_cond_t  cond_;
57  SimpleLock lock_;
58  DISALLOW_COPY_AND_ASSIGN(ThreadSafeQueue);
59};
60
61}  // namespace sdk_util
62
63#endif  // LIBRARIES_SDK_UTIL_THREAD_SAFE_QUEUE_H_
64
65