diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-07-26 17:45:15 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-07-26 17:47:35 +0200 |
commit | 1f67abe0f324a226de619ba9de44dbd5eb54ecaa (patch) | |
tree | 493fd3d7b7a0dcdd12e199f3db8b9285d88823f8 /mmss/queue.hpp | |
parent | 0ffde34faac958a28842a952157852fd072834a5 (diff) | |
download | gmrf-1f67abe0f324a226de619ba9de44dbd5eb54ecaa.tar gmrf-1f67abe0f324a226de619ba9de44dbd5eb54ecaa.zip |
Clean up queue implementation, fix namespaces
Diffstat (limited to 'mmss/queue.hpp')
-rw-r--r-- | mmss/queue.hpp | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/mmss/queue.hpp b/mmss/queue.hpp index d24bff6..d3f8860 100644 --- a/mmss/queue.hpp +++ b/mmss/queue.hpp @@ -24,19 +24,61 @@ */ -#ifndef _GMRF_MMSS_QUEUE_H_ -#define _GMRF_MMSS_QUEUE_H_ +#ifndef _GMRF_MMSS_QUEUE_HPP_ +#define _GMRF_MMSS_QUEUE_HPP_ #include "types.hpp" -#include <cstdint> +#include <memory> +#include <queue> +namespace MMSS { -typedef struct mmss_queue_entry *mmss_queue_t; +template<typename T> class timeout_queue_t { + struct element_t { + std::shared_ptr<T> data; + uint64_t timeout; + element_t(std::shared_ptr<T> data0, uint64_t timeout0) : data(data0), timeout(timeout0) {} -void mmss_queue_put(mmss_t *mmss, mmss_queue_t *queue, void *data, uint64_t timeout); -void* mmss_queue_get(mmss_t *mmss, mmss_queue_t *queue); -int mmss_queue_timeout(const mmss_t *mmss, const mmss_queue_t *const queue); + bool operator<(const element_t &e) const { + return timeout < e.timeout; + } + }; -#endif /* _GMRF_MMSS_QUEUE_H_ */ + context_t *mmss; + + std::priority_queue<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)); + } + + std::shared_ptr<T> get() { + if (queue.empty() || queue.top().timeout > now(mmss)) + return std::shared_ptr<T>(); + + std::shared_ptr<T> ret = queue.top().data; + queue.pop(); + return ret; + } + + int timeout() const { + if (queue.empty()) + return -1; + + int diff = queue.top().timeout - now(mmss); + + if (diff < 0) + return 0; + else + return diff; + } +}; + +} + +#endif /* _GMRF_MMSS_QUEUE_HPP_ */ |