Some minor API improvements
This commit is contained in:
parent
cb5d5a9397
commit
1880d6addc
9 changed files with 69 additions and 55 deletions
|
@ -92,11 +92,11 @@ void gmrf_schedule(gmrf_t *gmrf, gmrf_scheduled_func f, void *arg, unsigned dela
|
||||||
scheduled->f = f;
|
scheduled->f = f;
|
||||||
scheduled->arg = arg;
|
scheduled->arg = arg;
|
||||||
|
|
||||||
gmrf->mmss->scheduled_queue.put(std::move(scheduled), gmrf->mmss->now+delay);
|
gmrf->mmss->scheduled_queue.put(std::move(scheduled), gmrf->mmss->now()+delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
gmrf_time_t gmrf_now(gmrf_t *gmrf) {
|
gmrf_time_t gmrf_now(gmrf_t *gmrf) {
|
||||||
return gmrf->mmss->now;
|
return gmrf->mmss->now();
|
||||||
}
|
}
|
||||||
|
|
||||||
void gmrf_random_bytes(gmrf_t *gmrf, void *buffer, size_t len) {
|
void gmrf_random_bytes(gmrf_t *gmrf, void *buffer, size_t len) {
|
||||||
|
|
|
@ -62,7 +62,7 @@ void add_iface(const std::shared_ptr<node_t> &node, const std::shared_ptr<networ
|
||||||
void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &source, const std::shared_ptr<iface_t> &dest, const void *data, size_t len) {
|
void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &source, const std::shared_ptr<iface_t> &dest, const void *data, size_t len) {
|
||||||
std::shared_ptr<packet_t> packet = std::make_shared<packet_t>();
|
std::shared_ptr<packet_t> packet = std::make_shared<packet_t>();
|
||||||
|
|
||||||
packet->sent = mmss->now;
|
packet->sent = mmss->now();
|
||||||
packet->source = source;
|
packet->source = source;
|
||||||
packet->dest = dest;
|
packet->dest = dest;
|
||||||
packet->len = len;
|
packet->len = len;
|
||||||
|
@ -70,7 +70,7 @@ void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &source, const std:
|
||||||
packet->data.reset(new uint8_t[len]);
|
packet->data.reset(new uint8_t[len]);
|
||||||
std::memcpy(packet->data.get(), data, len);
|
std::memcpy(packet->data.get(), data, len);
|
||||||
|
|
||||||
mmss->packet_queue.put(std::move(packet), mmss->now+1);
|
mmss->packet_queue.put(std::move(packet), mmss->now()+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ void logf(context_t *mmss, int priority, const char *format, ...) {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
|
|
||||||
pos += snprintf_safe(buf, sizeof(buf), "[% 5u.%03u] ", mmss->now/1000, mmss->now%1000);
|
pos += snprintf_safe(buf, sizeof(buf), "[% 5u.%03u] ", mmss->now()/1000, mmss->now()%1000);
|
||||||
|
|
||||||
std::va_list ap;
|
std::va_list ap;
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
|
|
||||||
#include "mmss.hpp"
|
#include "mmss.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
|
@ -44,7 +45,7 @@ static inline int timeout_min(int a, int b) {
|
||||||
else if (b < 0)
|
else if (b < 0)
|
||||||
return a;
|
return a;
|
||||||
else
|
else
|
||||||
return min(a, b);
|
return std::min(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,10 +53,6 @@ static int get_queue_timeout(const context_t *mmss) {
|
||||||
return timeout_min(mmss->packet_queue.timeout(), mmss->scheduled_queue.timeout());
|
return timeout_min(mmss->packet_queue.timeout(), mmss->scheduled_queue.timeout());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t now(const context_t *mmss) {
|
|
||||||
return mmss->now;
|
|
||||||
}
|
|
||||||
|
|
||||||
void main(int argc, char *argv[]) {
|
void main(int argc, char *argv[]) {
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
std::fprintf(stderr, "usage: %s protocol_module\n", argv[0]);
|
std::fprintf(stderr, "usage: %s protocol_module\n", argv[0]);
|
||||||
|
@ -96,7 +93,7 @@ void main(int argc, char *argv[]) {
|
||||||
add_iface(node3, net1, "mmss1", &addr4);
|
add_iface(node3, net1, "mmss1", &addr4);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (mmss.now > 1000000000)
|
if (mmss.now() > 1000000000)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
int timeout = get_queue_timeout(&mmss);
|
int timeout = get_queue_timeout(&mmss);
|
||||||
|
@ -110,7 +107,7 @@ void main(int argc, char *argv[]) {
|
||||||
assert(!mmss.packet_queue.get());
|
assert(!mmss.packet_queue.get());
|
||||||
assert(!mmss.scheduled_queue.get());
|
assert(!mmss.scheduled_queue.get());
|
||||||
|
|
||||||
mmss.now += timeout;
|
mmss.time += timeout;
|
||||||
timeout = get_queue_timeout(&mmss);
|
timeout = get_queue_timeout(&mmss);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _GMRF_MMSS_MMSS_HPP_
|
#pragma once
|
||||||
#define _GMRF_MMSS_MMSS_HPP_
|
|
||||||
|
|
||||||
#include "queue.hpp"
|
#include "queue.hpp"
|
||||||
|
|
||||||
|
@ -92,13 +91,12 @@ public:
|
||||||
|
|
||||||
namespace MMSS {
|
namespace MMSS {
|
||||||
|
|
||||||
class context_t {
|
class context_t : public now_t {
|
||||||
public:
|
public:
|
||||||
uint64_t now;
|
|
||||||
timeout_queue_t<packet_t> packet_queue;
|
timeout_queue_t<packet_t> packet_queue;
|
||||||
timeout_queue_t<scheduled_t> scheduled_queue;
|
timeout_queue_t<scheduled_t> scheduled_queue;
|
||||||
|
|
||||||
context_t() : now(0), packet_queue(this), scheduled_queue(this) {}
|
context_t() : packet_queue(this), scheduled_queue(this) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class config_t {
|
class config_t {
|
||||||
|
@ -140,8 +138,6 @@ bool read_config(context_t *mmss, config_t *conf, const char *filename);
|
||||||
|
|
||||||
void add_iface(const std::shared_ptr<node_t> &node, const std::shared_ptr<network_t> &net, const std::string &name, const gmrf_addr_t *address);
|
void add_iface(const std::shared_ptr<node_t> &node, const std::shared_ptr<network_t> &net, const std::string &name, const gmrf_addr_t *address);
|
||||||
|
|
||||||
uint64_t now(const context_t *mmss);
|
|
||||||
|
|
||||||
void dispatch(const std::shared_ptr<packet_t> &packet);
|
void dispatch(const std::shared_ptr<packet_t> &packet);
|
||||||
void run_scheduled(const std::shared_ptr<scheduled_t> &scheduled);
|
void run_scheduled(const std::shared_ptr<scheduled_t> &scheduled);
|
||||||
void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &source, const std::shared_ptr<iface_t> &dest, const void *data, size_t len);
|
void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &source, const std::shared_ptr<iface_t> &dest, const void *data, size_t len);
|
||||||
|
@ -149,20 +145,6 @@ void enqueue(context_t *mmss, const std::shared_ptr<iface_t> &source, const std:
|
||||||
void logf(context_t *mmss, int priority, const char *format, ...);
|
void logf(context_t *mmss, int priority, const char *format, ...);
|
||||||
|
|
||||||
|
|
||||||
static inline int max(int a, int b) {
|
|
||||||
return (a > b) ? a : b;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int min(int a, int b) {
|
|
||||||
return (a < b) ? a : b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static inline size_t alignto(size_t l, size_t a) {
|
|
||||||
return ((l+a-1)/a)*a;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
namespace Config {
|
namespace Config {
|
||||||
|
|
||||||
void add_network(context_t *mmss, config_t *conf, const char *name);
|
void add_network(context_t *mmss, config_t *conf, const char *name);
|
||||||
|
@ -170,6 +152,3 @@ void add_network(context_t *mmss, config_t *conf, const char *name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* _GMRF_MMSS_MMSS_HPP_ */
|
|
||||||
|
|
47
mmss/now.hpp
Normal file
47
mmss/now.hpp
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2013, Matthias Schiffer <mschiffer@universe-factory.net>
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.hpp"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
|
||||||
|
namespace MMSS {
|
||||||
|
|
||||||
|
class now_t {
|
||||||
|
public:
|
||||||
|
uint64_t time;
|
||||||
|
|
||||||
|
now_t() : time(0) {}
|
||||||
|
|
||||||
|
uint64_t now() const {
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -24,14 +24,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _GMRF_MMSS_QUEUE_HPP_
|
#pragma once
|
||||||
#define _GMRF_MMSS_QUEUE_HPP_
|
|
||||||
|
|
||||||
#include "types.hpp"
|
#include "now.hpp"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
namespace MMSS {
|
namespace MMSS {
|
||||||
|
|
||||||
template<typename T> class timeout_queue_t {
|
template<typename T> class timeout_queue_t {
|
||||||
|
@ -42,12 +42,12 @@ template<typename T> class timeout_queue_t {
|
||||||
element_t(std::shared_ptr<T> &&data0, uint64_t timeout0) : data(std::move(data0)), timeout(timeout0) {}
|
element_t(std::shared_ptr<T> &&data0, uint64_t timeout0) : data(std::move(data0)), timeout(timeout0) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
context_t *mmss;
|
const now_t *clock;
|
||||||
|
|
||||||
std::list<element_t> queue;
|
std::list<element_t> queue;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
timeout_queue_t(context_t *mmss0) : mmss(mmss0) {}
|
timeout_queue_t(const now_t *clock0) : clock(clock0) {}
|
||||||
|
|
||||||
void put(std::shared_ptr<T> &&data, uint64_t timeout) {
|
void put(std::shared_ptr<T> &&data, uint64_t timeout) {
|
||||||
auto it = queue.begin(), end = queue.end();
|
auto it = queue.begin(), end = queue.end();
|
||||||
|
@ -64,7 +64,7 @@ public:
|
||||||
|
|
||||||
element_t &el = queue.front();
|
element_t &el = queue.front();
|
||||||
|
|
||||||
if (el.timeout > now(mmss))
|
if (el.timeout > clock->now())
|
||||||
return std::shared_ptr<T>();
|
return std::shared_ptr<T>();
|
||||||
|
|
||||||
std::shared_ptr<T> ret(std::move(el.data));
|
std::shared_ptr<T> ret(std::move(el.data));
|
||||||
|
@ -76,7 +76,7 @@ public:
|
||||||
if (queue.empty())
|
if (queue.empty())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int diff = queue.front().timeout - now(mmss);
|
int diff = queue.front().timeout - clock->now();
|
||||||
|
|
||||||
if (diff < 0)
|
if (diff < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -86,5 +86,3 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _GMRF_MMSS_QUEUE_HPP_ */
|
|
||||||
|
|
|
@ -24,8 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _GMRF_MMSS_TYPES_HPP_
|
#pragma once
|
||||||
#define _GMRF_MMSS_TYPES_HPP_
|
|
||||||
|
|
||||||
#ifndef _GNU_SOURCE
|
#ifndef _GNU_SOURCE
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
@ -43,6 +42,7 @@ namespace MMSS {
|
||||||
class context_t;
|
class context_t;
|
||||||
class config_t;
|
class config_t;
|
||||||
class network_t;
|
class network_t;
|
||||||
|
class now_t;
|
||||||
class packet_t;
|
class packet_t;
|
||||||
class scheduled_t;
|
class scheduled_t;
|
||||||
|
|
||||||
|
@ -52,8 +52,4 @@ typedef ::gmrf_t node_t;
|
||||||
typedef ::gmrf_iface_t iface_t;
|
typedef ::gmrf_iface_t iface_t;
|
||||||
|
|
||||||
|
|
||||||
uint64_t now(const context_t *mmss);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _GMRF_MMSS_TYPES_HPP_ */
|
|
||||||
|
|
|
@ -24,8 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef _GMRF_MMSS_UTIL_HPP_
|
#pragma once
|
||||||
#define _GMRF_MMSS_UTIL_HPP_
|
|
||||||
|
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
@ -43,5 +42,3 @@ static inline int snprintf_safe(char *buffer, size_t size, const char *format, .
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* _GMRF_MMSS_UTIL_HPP_ */
|
|
||||||
|
|
Reference in a new issue