Add timeout queue
This commit is contained in:
parent
4a1f291d7f
commit
e7f622e99d
5 changed files with 167 additions and 4 deletions
|
@ -3,5 +3,6 @@ include_directories(${GMRF_SOURCE_DIR}/include)
|
|||
add_executable(mmss
|
||||
iface.c
|
||||
mmss.c
|
||||
queue.c
|
||||
)
|
||||
target_link_libraries(mmss rt)
|
||||
|
|
15
mmss/mmss.h
15
mmss/mmss.h
|
@ -29,10 +29,7 @@
|
|||
|
||||
#include <gmrf/gmrf.h>
|
||||
|
||||
|
||||
typedef struct mmss_context mmss_context_t;
|
||||
typedef struct mmss_node mmss_node_t;
|
||||
typedef struct mmss_network mmss_network_t;
|
||||
#include "queue.h"
|
||||
|
||||
|
||||
struct mmss_context {
|
||||
|
@ -43,6 +40,7 @@ struct mmss_node {
|
|||
mmss_node_t *next;
|
||||
|
||||
gmrf_iface_t *interfaces;
|
||||
mmss_queue_t *packet_queue;
|
||||
};
|
||||
|
||||
struct mmss_network {
|
||||
|
@ -53,6 +51,15 @@ struct mmss_network {
|
|||
size_t mtu;
|
||||
};
|
||||
|
||||
struct mmss_packet {
|
||||
uint64_t sent;
|
||||
|
||||
gmrf_addr_t source;
|
||||
|
||||
size_t len;
|
||||
uint8_t data[];
|
||||
};
|
||||
|
||||
|
||||
struct gmrf_iface {
|
||||
gmrf_iface_t *node_next;
|
||||
|
|
78
mmss/queue.c
Normal file
78
mmss/queue.c
Normal file
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
|
||||
#include "queue.h"
|
||||
#include "mmss.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
typedef struct mmss_queue_entry mmss_queue_entry_t;
|
||||
|
||||
struct mmss_queue_entry {
|
||||
mmss_queue_entry_t *next;
|
||||
uint64_t timeout;
|
||||
void *data;
|
||||
};
|
||||
|
||||
|
||||
void mmss_queue_put(mmss_context_t *ctx, mmss_queue_t *queue, void *data, uint64_t timeout) {
|
||||
while (*queue && timeout > (*queue)->timeout)
|
||||
queue = &(*queue)->next;
|
||||
|
||||
mmss_queue_entry_t *entry = malloc(sizeof(mmss_queue_entry_t));
|
||||
|
||||
entry->timeout = timeout;
|
||||
entry->data = data;
|
||||
|
||||
entry->next = *queue;
|
||||
*queue = entry;
|
||||
}
|
||||
|
||||
void* mmss_queue_get(mmss_context_t *ctx, mmss_queue_t *queue) {
|
||||
mmss_queue_entry_t *entry = *queue;
|
||||
|
||||
if (!entry || entry->timeout > ctx->now)
|
||||
return NULL;
|
||||
|
||||
*queue = entry->next;
|
||||
void *data = entry->data;
|
||||
free(entry);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
int mmss_queue_timeout(const mmss_context_t *ctx, const mmss_queue_t *const queue) {
|
||||
if (!*queue)
|
||||
return -1;
|
||||
|
||||
int diff = (*queue)->timeout - ctx->now;
|
||||
|
||||
if (diff < 0)
|
||||
return 0;
|
||||
else
|
||||
return diff;
|
||||
}
|
42
mmss/queue.h
Normal file
42
mmss/queue.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _GMRF_MMSS_QUEUE_H_
|
||||
#define _GMRF_MMSS_QUEUE_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "types.h"
|
||||
|
||||
|
||||
typedef struct mmss_queue_entry *mmss_queue_t;
|
||||
|
||||
|
||||
void mmss_queue_put(mmss_context_t *ctx, mmss_queue_t *queue, void *data, uint64_t timeout);
|
||||
void* mmss_queue_get(mmss_context_t *ctx, mmss_queue_t *queue);
|
||||
int mmss_queue_timeout(const mmss_context_t *ctx, const mmss_queue_t *const queue);
|
||||
|
||||
#endif /* _GMRF_MMSS_QUEUE_H_ */
|
35
mmss/types.h
Normal file
35
mmss/types.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _GMRF_MMSS_TYPES_H_
|
||||
#define _GMRF_MMSS_TYPES_H_
|
||||
|
||||
typedef struct mmss_context mmss_context_t;
|
||||
typedef struct mmss_node mmss_node_t;
|
||||
typedef struct mmss_network mmss_network_t;
|
||||
typedef struct mmss_packet mmss_packet_t;
|
||||
|
||||
#endif /* _GMRF_MMSS_TYPES_H_ */
|
Reference in a new issue