summaryrefslogtreecommitdiffstats
path: root/mmss/queue.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'mmss/queue.hpp')
-rw-r--r--mmss/queue.hpp58
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_ */