source: icGREP/icgrep-devel/icgrep/toolchain/workqueue.h @ 5456

Last change on this file since 5456 was 5454, checked in by nmedfort, 2 years ago

Bug fix check in for DumpTrace?, compilation of DoBlock? / DoFinalBlock? functions. Pablo CodeMotionPass? optimized and enabled by default.

File size: 1.3 KB
Line 
1#ifndef WORKQUEUE_H
2#define WORKQUEUE_H
3
4#include <thread>
5#include <mutex>
6#include <condition_variable>
7#include <queue>
8
9template <typename T>
10class WorkQueue {
11public:
12
13    WorkQueue(unsigned size)
14    : mDone(false) {
15
16    }
17
18    bool pop(T & item) {
19        std::unique_lock<std::mutex> lock(mMutex);
20        while (empty()) {
21            if (BOOST_UNLIKELY(mDone)) {
22                item = nullptr;
23                return false;
24            }
25            mCond.wait(lock);
26        }
27        item = mQueue.front();
28        mQueue.pop();
29        return true;
30    }
31
32    bool empty() const {
33        return mQueue.empty();
34    }
35
36    bool try_pop(T & item) {
37        std::unique_lock<std::mutex> lock(mMutex, std::defer_lock);
38        if (lock.try_lock()) {
39            item = mQueue.front();
40            mQueue.pop();
41            return true;
42        }
43        return false;
44    }
45
46    void push(T item) {
47        std::unique_lock<std::mutex> lock(mMutex);
48        mQueue.push(std::move(item));
49        lock.unlock();
50        mCond.notify_one();
51    }
52
53    void notify_all() {
54        mDone = true;
55        mCond.notify_all();
56    }
57
58private:
59    bool                        mDone;
60    std::queue<T>               mQueue;
61    std::mutex                  mMutex;
62    std::condition_variable     mCond;
63};
64
65
66
67
68#endif // WORKQUEUE_H
Note: See TracBrowser for help on using the repository browser.