From e7070a5f79fefaf2a72e886bf2537ce207523e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Wed, 6 Jul 2016 19:00:02 +0200 Subject: [PATCH 1/3] rest-engine: Allow adding periodic resources after starting REST engine Without this fix, any periodic resources added after the REST engine was already running were never started. --- apps/rest-engine/rest-engine.c | 36 +++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/apps/rest-engine/rest-engine.c b/apps/rest-engine/rest-engine.c index 67ac232a2..43566a348 100644 --- a/apps/rest-engine/rest-engine.c +++ b/apps/rest-engine/rest-engine.c @@ -114,6 +114,7 @@ rest_activate_resource(resource_t *resource, char *path) resource->periodic->resource->url); list_add(restful_periodic_services, resource->periodic); } + process_poll(&rest_engine_process); } /*---------------------------------------------------------------------------*/ /*- Internal API ------------------------------------------------------------*/ @@ -188,26 +189,39 @@ PROCESS_THREAD(rest_engine_process, ev, data) { PROCESS_BEGIN(); + PRINTF("Starting rest_engine_process\n"); + /* pause to let REST server finish adding resources. */ PROCESS_PAUSE(); /* initialize the PERIODIC_RESOURCE timers, which will be handled by this process. */ periodic_resource_t *periodic_resource = NULL; - for(periodic_resource = - (periodic_resource_t *)list_head(restful_periodic_services); - periodic_resource; periodic_resource = periodic_resource->next) { - if(periodic_resource->periodic_handler && periodic_resource->period) { - PRINTF("Periodic: Set timer for /%s to %lu\n", - periodic_resource->resource->url, periodic_resource->period); - etimer_set(&periodic_resource->periodic_timer, - periodic_resource->period); - } - } + PRINTF("Periodic: process\n"); + + process_poll(&rest_engine_process); + while(1) { PROCESS_WAIT_EVENT(); - if(ev == PROCESS_EVENT_TIMER) { + if(ev == PROCESS_EVENT_POLL) { + PRINTF("Periodic: poll\n"); + for(periodic_resource = + (periodic_resource_t *)list_head(restful_periodic_services); + periodic_resource; periodic_resource = periodic_resource->next) { + if(periodic_resource->periodic_handler && periodic_resource->period) { + if(!etimer_expired(&periodic_resource->periodic_timer)) { + /* Already running */ + continue; + } + PRINTF("Periodic: Set timer for /%s to %lu\n", + periodic_resource->resource->url, periodic_resource->period); + etimer_set(&periodic_resource->periodic_timer, + periodic_resource->period); + } + } + } + else if(ev == PROCESS_EVENT_TIMER) { for(periodic_resource = (periodic_resource_t *)list_head(restful_periodic_services); periodic_resource; periodic_resource = periodic_resource->next) { From 6b238873ef66222031be64e6e0aac2ddbe39a430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Sat, 9 Jul 2016 10:33:58 +0200 Subject: [PATCH 2/3] squash move rest-engine timers to activate timer --- apps/rest-engine/rest-engine.c | 39 +++++++++++++++++----------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/apps/rest-engine/rest-engine.c b/apps/rest-engine/rest-engine.c index 43566a348..1aea41e38 100644 --- a/apps/rest-engine/rest-engine.c +++ b/apps/rest-engine/rest-engine.c @@ -113,8 +113,15 @@ rest_activate_resource(resource_t *resource, char *path) PRINTF("Periodic resource: %p (%s)\n", resource->periodic, resource->periodic->resource->url); list_add(restful_periodic_services, resource->periodic); + if(process_is_running(&rest_engine_process)) { + PRINTF("Periodic: Set timer for /%s to %lu\n", + resource->url, resource->periodic->period); + PROCESS_CONTEXT_BEGIN(&rest_engine_process); + etimer_set(&resource->periodic->periodic_timer, + resource->periodic->period); + PROCESS_CONTEXT_END(&rest_engine_process); + } } - process_poll(&rest_engine_process); } /*---------------------------------------------------------------------------*/ /*- Internal API ------------------------------------------------------------*/ @@ -199,29 +206,21 @@ PROCESS_THREAD(rest_engine_process, ev, data) PRINTF("Periodic: process\n"); - process_poll(&rest_engine_process); + for(periodic_resource = + (periodic_resource_t *)list_head(restful_periodic_services); + periodic_resource; periodic_resource = periodic_resource->next) { + if(periodic_resource->periodic_handler && periodic_resource->period) { + PRINTF("Periodic: Set timer for /%s to %lu\n", + periodic_resource->resource->url, periodic_resource->period); + etimer_set(&periodic_resource->periodic_timer, + periodic_resource->period); + } + } while(1) { PROCESS_WAIT_EVENT(); - if(ev == PROCESS_EVENT_POLL) { - PRINTF("Periodic: poll\n"); - for(periodic_resource = - (periodic_resource_t *)list_head(restful_periodic_services); - periodic_resource; periodic_resource = periodic_resource->next) { - if(periodic_resource->periodic_handler && periodic_resource->period) { - if(!etimer_expired(&periodic_resource->periodic_timer)) { - /* Already running */ - continue; - } - PRINTF("Periodic: Set timer for /%s to %lu\n", - periodic_resource->resource->url, periodic_resource->period); - etimer_set(&periodic_resource->periodic_timer, - periodic_resource->period); - } - } - } - else if(ev == PROCESS_EVENT_TIMER) { + if(ev == PROCESS_EVENT_TIMER) { for(periodic_resource = (periodic_resource_t *)list_head(restful_periodic_services); periodic_resource; periodic_resource = periodic_resource->next) { From f16f5b524180f785b77d7125ce3ec0521a496479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Sat, 9 Jul 2016 10:38:02 +0200 Subject: [PATCH 3/3] squash clean up left overs --- apps/rest-engine/rest-engine.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/rest-engine/rest-engine.c b/apps/rest-engine/rest-engine.c index 1aea41e38..cec590012 100644 --- a/apps/rest-engine/rest-engine.c +++ b/apps/rest-engine/rest-engine.c @@ -196,16 +196,12 @@ PROCESS_THREAD(rest_engine_process, ev, data) { PROCESS_BEGIN(); - PRINTF("Starting rest_engine_process\n"); - /* pause to let REST server finish adding resources. */ PROCESS_PAUSE(); /* initialize the PERIODIC_RESOURCE timers, which will be handled by this process. */ periodic_resource_t *periodic_resource = NULL; - PRINTF("Periodic: process\n"); - for(periodic_resource = (periodic_resource_t *)list_head(restful_periodic_services); periodic_resource; periodic_resource = periodic_resource->next) { @@ -216,7 +212,6 @@ PROCESS_THREAD(rest_engine_process, ev, data) periodic_resource->period); } } - while(1) { PROCESS_WAIT_EVENT();