fix stroke preview priority
This commit is contained in:
24
src/util.h
24
src/util.h
@@ -153,7 +153,7 @@ template<typename T, int Max = 0>
|
||||
class BlockingQueue
|
||||
{
|
||||
public:
|
||||
std::deque<T> q;
|
||||
std::deque<std::pair<T, bool>> 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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user