diff options
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_ */ |