add simple mt queue

This commit is contained in:
2019-06-30 00:42:17 +07:00
parent 5ebd578717
commit b957c51eb6

View File

@@ -11,6 +11,7 @@
#include <cstring>
#include <mutex>
#include <queue>
#include <algorithm>
#include <functional>
#include <condition_variable>
@@ -98,6 +99,38 @@ namespace
{
using namespace curly_hpp;
template < typename T >
class mt_queue final {
public:
void enqueue(T v) {
std::lock_guard<std::mutex> guard(mutex_);
queue_.push(std::move(v));
cvar_.notify_all();
}
bool try_dequeue(T& v) {
std::lock_guard<std::mutex> guard(mutex_);
if ( queue_.empty() ) {
return false;
}
v = queue_.front();
queue_.pop();
return true;
}
void wait_content_for(time_ms_t ms) const noexcept {
std::unique_lock<std::mutex> lock(mutex_);
cvar_.wait_for(lock, ms, [this](){
return !queue_.empty();
});
}
private:
std::queue<T> queue_;
private:
mutable std::mutex mutex_;
mutable std::condition_variable cvar_;
};
slist_t make_header_slist(const headers_t& headers) {
std::string header_builder;
curl_slist* result = nullptr;