Queue optimizations

This commit is contained in:
Matthias Schiffer 2013-07-26 21:06:05 +02:00
parent cc1a4b9493
commit f97d1e1569

View file

@ -29,9 +29,8 @@
#include "types.hpp"
#include <deque>
#include <list>
#include <memory>
#include <queue>
namespace MMSS {
@ -40,30 +39,36 @@ template<typename T> class timeout_queue_t {
std::shared_ptr<T> data;
uint64_t timeout;
element_t(std::shared_ptr<T> data0, uint64_t timeout0) : data(data0), timeout(timeout0) {}
bool operator<(const element_t &e) const {
return timeout > e.timeout;
}
element_t(const std::shared_ptr<T> &data0, uint64_t timeout0) : data(data0), timeout(timeout0) {}
};
context_t *mmss;
std::priority_queue<element_t, std::deque<element_t>> queue;
std::list<element_t> queue;
public:
timeout_queue_t(context_t *mmss0) : mmss(mmss0) {}
void put(std::shared_ptr<T> data, uint64_t timeout) {
queue.push(element_t(data, timeout));
void put(const std::shared_ptr<T> &data, uint64_t 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() {
if (queue.empty() || queue.top().timeout > now(mmss))
if (queue.empty())
return std::shared_ptr<T>();
std::shared_ptr<T> ret = queue.top().data;
queue.pop();
element_t &el = queue.front();
if (el.timeout > now(mmss))
return std::shared_ptr<T>();
std::shared_ptr<T> ret(std::move(el.data));
queue.pop_front();
return ret;
}
@ -71,7 +76,7 @@ public:
if (queue.empty())
return -1;
int diff = queue.top().timeout - now(mmss);
int diff = queue.front().timeout - now(mmss);
if (diff < 0)
return 0;