Queue optimizations
This commit is contained in:
parent
cc1a4b9493
commit
f97d1e1569
1 changed files with 19 additions and 14 deletions
|
@ -29,9 +29,8 @@
|
||||||
|
|
||||||
#include "types.hpp"
|
#include "types.hpp"
|
||||||
|
|
||||||
#include <deque>
|
#include <list>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <queue>
|
|
||||||
|
|
||||||
namespace MMSS {
|
namespace MMSS {
|
||||||
|
|
||||||
|
@ -40,30 +39,36 @@ template<typename T> class timeout_queue_t {
|
||||||
std::shared_ptr<T> data;
|
std::shared_ptr<T> data;
|
||||||
uint64_t timeout;
|
uint64_t timeout;
|
||||||
|
|
||||||
element_t(std::shared_ptr<T> data0, uint64_t timeout0) : data(data0), timeout(timeout0) {}
|
element_t(const std::shared_ptr<T> &data0, uint64_t timeout0) : data(data0), timeout(timeout0) {}
|
||||||
|
|
||||||
bool operator<(const element_t &e) const {
|
|
||||||
return timeout > e.timeout;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
context_t *mmss;
|
context_t *mmss;
|
||||||
|
|
||||||
std::priority_queue<element_t, std::deque<element_t>> queue;
|
std::list<element_t> queue;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
timeout_queue_t(context_t *mmss0) : mmss(mmss0) {}
|
timeout_queue_t(context_t *mmss0) : mmss(mmss0) {}
|
||||||
|
|
||||||
void put(std::shared_ptr<T> data, uint64_t timeout) {
|
void put(const std::shared_ptr<T> &data, uint64_t timeout) {
|
||||||
queue.push(element_t(data, timeout));
|
auto it = queue.begin(), end = queue.end();
|
||||||
|
|
||||||
|
while (it != end && it->timeout < timeout)
|
||||||
|
++it;
|
||||||
|
|
||||||
|
queue.insert(it, element_t(data, timeout));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<T> get() {
|
std::shared_ptr<T> get() {
|
||||||
if (queue.empty() || queue.top().timeout > now(mmss))
|
if (queue.empty())
|
||||||
return std::shared_ptr<T>();
|
return std::shared_ptr<T>();
|
||||||
|
|
||||||
std::shared_ptr<T> ret = queue.top().data;
|
element_t &el = queue.front();
|
||||||
queue.pop();
|
|
||||||
|
if (el.timeout > now(mmss))
|
||||||
|
return std::shared_ptr<T>();
|
||||||
|
|
||||||
|
std::shared_ptr<T> ret(std::move(el.data));
|
||||||
|
queue.pop_front();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +76,7 @@ public:
|
||||||
if (queue.empty())
|
if (queue.empty())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int diff = queue.top().timeout - now(mmss);
|
int diff = queue.front().timeout - now(mmss);
|
||||||
|
|
||||||
if (diff < 0)
|
if (diff < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Reference in a new issue