diff --git a/src/util.h b/src/util.h index a548982..50128bb 100644 --- a/src/util.h +++ b/src/util.h @@ -153,7 +153,7 @@ template class BlockingQueue { public: - std::deque q; + std::deque> q; std::condition_variable post_cv; std::condition_variable get_cv; mutable std::mutex mutex; @@ -171,7 +171,7 @@ public: post_cv.wait(lock, [&]() { return unlocked | (q.size() < Max); }); if (q.size() >= Max) return; } - q.push_back(pkt); + q.push_back({ pkt, false }); get_cv.notify_one(); } void PostUnique(T pkt, bool top) @@ -182,8 +182,20 @@ public: post_cv.wait(lock, [&]() { return unlocked | (q.size() < Max); }); if (q.size() >= Max) return; } - if (std::find(q.begin(), q.end(), pkt) == q.end()) - top ? q.push_front(pkt) : q.push_back(pkt); + auto search = std::make_pair(pkt, top); + if (std::find(q.begin(), q.end(), search) == q.end()) + { + if (top) + { + // find the first low priority + auto low = std::find_if(q.begin(), q.end(), [](auto const& x) { return x.second == false; }); + q.insert(low, { pkt, top }); + } + else + { + q.push_back({ pkt, top }); + } + } get_cv.notify_one(); } T Get() @@ -193,10 +205,10 @@ public: get_cv.wait(lock, [&]() { return unlocked | (q.size() > 0); }); if (q.empty()) return std::move(emptyT); - T tmp = std::move(q.front()); + auto tmp = std::move(q.front()); q.pop_front(); if (Max > 0) post_cv.notify_all(); - return std::move(tmp); + return std::move(tmp.first); } void UnlockGetters() {