From 1f67abe0f324a226de619ba9de44dbd5eb54ecaa Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 26 Jul 2013 17:45:15 +0200 Subject: Clean up queue implementation, fix namespaces --- mmss/queue.hpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 8 deletions(-) (limited to 'mmss/queue.hpp') 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 +#include +#include +namespace MMSS { -typedef struct mmss_queue_entry *mmss_queue_t; +template class timeout_queue_t { + struct element_t { + std::shared_ptr data; + uint64_t timeout; + element_t(std::shared_ptr 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 queue; + +public: + timeout_queue_t(context_t *mmss0) : mmss(mmss0) {} + + void put(std::shared_ptr data, uint64_t timeout) { + queue.push(element_t(data, timeout)); + } + + std::shared_ptr get() { + if (queue.empty() || queue.top().timeout > now(mmss)) + return std::shared_ptr(); + + std::shared_ptr 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_ */ -- cgit v1.2.3