summaryrefslogtreecommitdiffstats
path: root/mmss/mmss.c
diff options
context:
space:
mode:
Diffstat (limited to 'mmss/mmss.c')
-rw-r--r--mmss/mmss.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/mmss/mmss.c b/mmss/mmss.c
index ae87afb..31a5623 100644
--- a/mmss/mmss.c
+++ b/mmss/mmss.c
@@ -39,6 +39,21 @@ static void init_nodes(gmrf_t *nodes) {
}
+static inline int timeout_min(int a, int b) {
+ if (a < 0)
+ return b;
+ else if (b < 0)
+ return a;
+ else
+ return min(a, b);
+}
+
+
+static int get_queue_timeout(const mmss_t *mmss) {
+ return timeout_min(mmss_queue_timeout(mmss, &mmss->packet_queue), mmss_queue_timeout(mmss, &mmss->scheduled_queue));
+}
+
+
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "usage: %s protocol_module\n", argv[0]);
@@ -75,7 +90,7 @@ int main(int argc, char *argv[]) {
init_nodes(nodes);
while (true) {
- int timeout = mmss_queue_timeout(&mmss, &mmss.packet_queue);
+ int timeout = get_queue_timeout(&mmss);
if (timeout < 0) {
fprintf(stderr, "Nothing queued, deadlock occured.\n");
@@ -84,23 +99,27 @@ int main(int argc, char *argv[]) {
if (timeout > 0) {
assert(!mmss_queue_get(&mmss, &mmss.packet_queue));
+ assert(!mmss_queue_get(&mmss, &mmss.scheduled_queue));
mmss.now += timeout;
- timeout = mmss_queue_timeout(&mmss, &mmss.packet_queue);
+ timeout = get_queue_timeout(&mmss);
}
assert(timeout == 0);
while (timeout == 0) {
mmss_packet_t *packet = mmss_queue_get(&mmss, &mmss.packet_queue);
- assert(packet);
+ mmss_scheduled_t *scheduled = mmss_queue_get(&mmss, &mmss.scheduled_queue);
+
+ assert(packet || scheduled);
- packet->dest->node->proto->handle_packet(packet->dest->node, packet->dest->node->ctx, packet->dest,
- &packet->source->address, packet->data, packet->len);
+ if(packet)
+ mmss_dispatch(packet);
- free(packet);
+ if (scheduled)
+ mmss_run_scheduled(scheduled);
- timeout = mmss_queue_timeout(&mmss, &mmss.packet_queue);
+ timeout = get_queue_timeout(&mmss);
}
}