1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-25 06:23:53 +01:00

implement hwtimer based timeout

This commit is contained in:
Christian Mehlis 2013-12-03 23:30:23 +01:00
parent 2f7fd0b35c
commit 79c79870e6
5 changed files with 41 additions and 7 deletions

View File

@ -48,6 +48,7 @@
#include "msg.h"
#include "thread.h"
#include "transceiver.h"
#include "hwtimer.h"
#include "ccnl-riot-compat.h"
#include "test_data/text.txt.ccnb.h"
@ -69,20 +70,20 @@ ccnl_run_events(void)
long usec;
ccnl_get_timeval(&now);
DEBUGMSG(1, "ccnl_run_events now: %ld:%ld\n", now.tv_sec, now.tv_usec);
//DEBUGMSG(1, "ccnl_run_events now: %ld:%ld\n", now.tv_sec, now.tv_usec);
while (eventqueue) {
struct ccnl_timer_s *t = eventqueue;
usec = timevaldelta(&(t->timeout), &now);
if (usec >= 0) {
DEBUGMSG(1, "ccnl_run_events nothing to do: %ld:%ld\n", now.tv_sec, now.tv_usec);
//DEBUGMSG(1, "ccnl_run_events nothing to do: %ld:%ld\n", now.tv_sec, now.tv_usec);
now.tv_sec = usec / 1000000;
now.tv_usec = usec % 1000000;
return &now;
}
DEBUGMSG(1, "ccnl_run_events run event handler: %ld:%ld\n", now.tv_sec, now.tv_usec);
//DEBUGMSG(1, "ccnl_run_events run event handler: %ld:%ld\n", now.tv_sec, now.tv_usec);
if (t->fct) {
(t->fct)(t->node, t->intarg);
}
@ -289,6 +290,15 @@ void handle_populate_cache(void)
// ----------------------------------------------------------------------
void ccnl_timeout_callback(void *ptr)
{
struct ccnl_relay_s *ccnl = ptr;
msg_t ccnl_timeout_msg;
ccnl_timeout_msg.type = CCNL_RIOT_TIMEOUT;
msg_send(&ccnl_timeout_msg, ccnl->riot_pid, false);
}
int ccnl_io_loop(struct ccnl_relay_s *ccnl)
{
int i, maxfd = -1;
@ -315,14 +325,24 @@ int ccnl_io_loop(struct ccnl_relay_s *ccnl)
msg_t in;
radio_packet_t *p;
riot_ccnl_msg_t *m;
struct timeval *timeout;
unsigned long us = 100 * 1000;
int hwtimer_id;
while (!ccnl->halt_flag) {
DEBUGMSG(1, "waiting for incomming msg\n");
//DEBUGMSG(1, "waiting for incomming msg\n");
hwtimer_id = hwtimer_set(HWTIMER_TICKS(us), ccnl_timeout_callback, ccnl);
if (hwtimer_id == -1) {
puts("NO MORE TIMERS!");
} else {
//DEBUGMSG(1, "hwtimer_id is %d\n", hwtimer_id);
}
msg_receive(&in);
struct timeval *timeout = ccnl_run_events();
switch (in.type) {
case PKT_PENDING:
hwtimer_remove(hwtimer_id);
p = (radio_packet_t *) in.content.ptr;
DEBUGMSG(1, "%s Packet waiting\n", riot_ccnl_event_to_string(in.type));
DEBUGMSG(1, "\tLength:\t%u\n", p->length);
@ -339,6 +359,7 @@ int ccnl_io_loop(struct ccnl_relay_s *ccnl)
break;
case (CCNL_RIOT_MSG):
hwtimer_remove(hwtimer_id);
m = (riot_ccnl_msg_t *) in.content.ptr;
DEBUGMSG(1, "%s Packet waiting\n", riot_ccnl_event_to_string(in.type));
DEBUGMSG(1, "\tLength:\t%u\n", m->size);
@ -349,6 +370,7 @@ int ccnl_io_loop(struct ccnl_relay_s *ccnl)
break;
case (CCNL_RIOT_HALT):
hwtimer_remove(hwtimer_id);
DEBUGMSG(1, "%s Packet waiting\n", riot_ccnl_event_to_string(in.type));
DEBUGMSG(1, "\tSrc:\t%u\n", in.sender_pid);
DEBUGMSG(1, "\tNumb:\t%" PRIu32 "\n", in.content.value);
@ -357,6 +379,7 @@ int ccnl_io_loop(struct ccnl_relay_s *ccnl)
break;
#if RIOT_CCNL_POPULATE
case (CCNL_RIOT_POPULATE):
hwtimer_remove(hwtimer_id);
DEBUGMSG(1, "%s Packet waiting\n", riot_ccnl_event_to_string(in.type));
DEBUGMSG(1, "\tSrc:\t%u\n", in.sender_pid);
DEBUGMSG(1, "\tNumb:\t%" PRIu32 "\n", in.content.value);
@ -364,7 +387,12 @@ int ccnl_io_loop(struct ccnl_relay_s *ccnl)
handle_populate_cache();
break;
#endif
case (CCNL_RIOT_TIMEOUT):
timeout = ccnl_run_events();
us = timeout->tv_sec * 1000 * 1000 + timeout->tv_usec;
break;
default:
hwtimer_remove(hwtimer_id);
DEBUGMSG(1, "%s Packet waiting\n", riot_ccnl_event_to_string(in.type));
DEBUGMSG(1, "\tSrc:\t%u\n", in.sender_pid);
DEBUGMSG(1, "\tdropping it...\n");
@ -383,6 +411,7 @@ int ccnl_io_loop(struct ccnl_relay_s *ccnl)
void ccnl_riot_relay_start(int max_cache_entries, int fib_threshold_prefix, int fib_threshold_aggregate)
{
ccnl_get_timeval(&theRelay.startup_time);
theRelay.riot_pid = thread_pid;
DEBUGMSG(1, "This is ccn-lite-relay, starting at %lu:%lu\n", theRelay.startup_time.tv_sec, theRelay.startup_time.tv_usec);
DEBUGMSG(1, " compile time: %s %s\n", __DATE__, __TIME__);

View File

@ -815,6 +815,7 @@ void ccnl_interest_propagate(struct ccnl_relay_s *ccnl,
}
if (forward_cnt == 0) {
DEBUGMSG(40, " ccnl_interest_propagate: using broadcast face!\n");
ccnl_face_enqueue(ccnl, ccnl->ifs[RIOT_TRANS_IDX].broadcast_face, buf_dup(i->pkt));
}
@ -1124,7 +1125,7 @@ void ccnl_do_ageing(void *ptr, void *dummy)
struct ccnl_face_s *f = relay->faces;
struct timeval now;
ccnl_get_timeval(&now);
DEBUGMSG(999, "ccnl_do_ageing %ld:%ld\n", now.tv_sec, now.tv_usec);
//DEBUGMSG(999, "ccnl_do_ageing %ld:%ld\n", now.tv_sec, now.tv_usec);
while (c) {
if (ccnl_is_timeouted(&now, &c->last_used, CCNL_CONTENT_TIMEOUT_SEC, CCNL_CONTENT_TIMEOUT_USEC)
@ -1171,7 +1172,6 @@ void ccnl_do_ageing(void *ptr, void *dummy)
struct ccnl_forward_s *fwd = relay->fib;
while (fwd) {
DEBUGMSG(1, "cleaning up fwd: %p\n", fwd);
if (!(fwd->flags & CCNL_FORWARD_FLAGS_STATIC)
&& ccnl_is_timeouted(&now, &fwd->last_used, CCNL_FWD_TIMEOUT_SEC, CCNL_FWD_TIMEOUT_USEC)) {
fwd = ccnl_forward_remove(relay, fwd);

View File

@ -106,6 +106,7 @@ struct ccnl_relay_s {
void *aux;
int fib_threshold_prefix; /* how may name components should be considdered as dynamic */
int fib_threshold_aggregate;
int riot_pid;
};
struct ccnl_buf_s {

View File

@ -97,6 +97,9 @@ char *riot_ccnl_event_to_string(ccnl_riot_event_t event)
case CCNL_RIOT_POPULATE:
return "RIOT_POPULATE";
case CCNL_RIOT_TIMEOUT:
return "CCNL_RIOT_TIMEOUT";
default:
return "UNKNOWN";
}

View File

@ -51,6 +51,7 @@ typedef enum ccnl_riot_event {
CCNL_RIOT_MSG = CCNL_RIOT_EVENT_NUMBER_OFFSET + 1,
CCNL_RIOT_HALT,
CCNL_RIOT_POPULATE,
CCNL_RIOT_TIMEOUT,
CCNL_RIOT_RESERVED
} ccnl_riot_event_t;