You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.2 KiB
C++
66 lines
1.2 KiB
C++
#ifndef WEBCC_QUEUE_H_
|
|
#define WEBCC_QUEUE_H_
|
|
|
|
// A general message queue.
|
|
|
|
#include <condition_variable>
|
|
#include <list>
|
|
#include <mutex>
|
|
#include <thread>
|
|
|
|
namespace webcc {
|
|
|
|
template <typename T>
|
|
class Queue {
|
|
public:
|
|
Queue() = default;
|
|
|
|
Queue(const Queue&) = delete;
|
|
Queue& operator=(const Queue&) = delete;
|
|
|
|
T PopOrWait() {
|
|
std::unique_lock<std::mutex> lock(mutex_);
|
|
|
|
// Wait for a message.
|
|
not_empty_cv_.wait(lock, [this] { return !message_list_.empty(); });
|
|
|
|
T message = message_list_.front();
|
|
message_list_.pop_front();
|
|
return message;
|
|
}
|
|
|
|
T Pop() {
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
|
|
if (message_list_.empty()) {
|
|
return T();
|
|
}
|
|
|
|
T message = message_list_.front();
|
|
message_list_.pop_front();
|
|
return message;
|
|
}
|
|
|
|
void Clear() {
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
message_list_.clear();
|
|
}
|
|
|
|
void Push(const T& message) {
|
|
{
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
message_list_.push_back(message);
|
|
}
|
|
not_empty_cv_.notify_one();
|
|
}
|
|
|
|
private:
|
|
std::list<T> message_list_;
|
|
std::mutex mutex_;
|
|
std::condition_variable not_empty_cv_;
|
|
};
|
|
|
|
} // namespace webcc
|
|
|
|
#endif // WEBCC_QUEUE_H_
|