parent
689cf27fe9
commit
23d4263c71
@ -1,83 +1,75 @@ |
|||||||
|
|
||||||
#ifndef SAFE_QUEUE_H |
#ifndef PACKET_QUEUE_H |
||||||
#define SAFE_QUEUE_H |
#define PACKET_QUEUE_H |
||||||
|
|
||||||
#include <queue> |
#include <queue> |
||||||
#include <thread> |
#include <thread> |
||||||
|
|
||||||
using namespace std; |
|
||||||
|
|
||||||
template<typename T> |
template<typename T> |
||||||
class PacketQueue { |
class PacketQueue { |
||||||
typedef void (*ReleaseCallback)(T &); |
typedef void (*ReleaseCallback)(T &); |
||||||
|
|
||||||
typedef void (*SyncHandle)(queue<T> &); |
|
||||||
|
|
||||||
public: |
public: |
||||||
|
|
||||||
void push(T new_value) { |
void push(T new_value) { |
||||||
lock_guard<mutex> lk(mt); |
std::lock_guard<std::mutex> lk(m_mutex); |
||||||
if (running) { |
if (m_running) { |
||||||
q.push(new_value); |
m_queue.push(new_value); |
||||||
cv.notify_one(); |
m_cond.notify_one(); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
int pop(T &value) { |
int pop(T &value) { |
||||||
int ret = 0; |
int ret = 0; |
||||||
unique_lock<mutex> lk(mt); |
std::unique_lock<std::mutex> lk(m_mutex); |
||||||
if (!running) { |
if (!m_running) { |
||||||
return ret; |
return ret; |
||||||
} |
} |
||||||
if (!q.empty()) { |
if (!m_queue.empty()) { |
||||||
value = q.front(); |
value = m_queue.front(); |
||||||
q.pop(); |
m_queue.pop(); |
||||||
ret = 1; |
ret = 1; |
||||||
} |
} |
||||||
return ret; |
return ret; |
||||||
} |
} |
||||||
|
|
||||||
void setRunning(bool run) { |
void setRunning(bool run) { |
||||||
lock_guard<mutex> lk(mt); |
std::lock_guard<std::mutex> lk(m_mutex); |
||||||
this->running = run; |
m_running = run; |
||||||
} |
} |
||||||
|
|
||||||
int empty() { |
int empty() { |
||||||
return q.empty(); |
std::lock_guard<std::mutex> lk(m_mutex); |
||||||
|
return m_queue.empty(); |
||||||
} |
} |
||||||
|
|
||||||
int size() { |
int size() { |
||||||
return static_cast<int>(q.size()); |
std::lock_guard<std::mutex> lk(m_mutex); |
||||||
|
return static_cast<int>(m_queue.size()); |
||||||
} |
} |
||||||
|
|
||||||
void clear() { |
void clear() { |
||||||
lock_guard<mutex> lk(mt); |
std::lock_guard<std::mutex> lk(m_mutex); |
||||||
int size = q.size(); |
int size = m_queue.size(); |
||||||
for (int i = 0; i < size; ++i) { |
for (int i = 0; i < size; ++i) { |
||||||
T value = q.front(); |
T value = m_queue.front(); |
||||||
releaseCallback(value); |
releaseCallback(value); |
||||||
q.pop(); |
m_queue.pop(); |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
void sync() { |
void setReleaseCallback(ReleaseCallback callback) { |
||||||
lock_guard<mutex> lk(mt); |
releaseCallback = callback; |
||||||
syncHandle(q); |
|
||||||
} |
|
||||||
|
|
||||||
void setReleaseCallback(ReleaseCallback r) { |
|
||||||
releaseCallback = r; |
|
||||||
} |
} |
||||||
|
|
||||||
private: |
private: |
||||||
|
|
||||||
mutex mt; |
std::mutex m_mutex; |
||||||
condition_variable cv; |
std::condition_variable m_cond; |
||||||
|
std::queue<T> m_queue; |
||||||
|
bool m_running; |
||||||
|
|
||||||
queue<T> q; |
|
||||||
bool running; |
|
||||||
ReleaseCallback releaseCallback; |
ReleaseCallback releaseCallback; |
||||||
SyncHandle syncHandle; |
|
||||||
}; |
}; |
||||||
|
|
||||||
#endif |
#endif // PACKET_QUEUE_H
|
||||||
|
Loading…
Reference in new issue