summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent Guittot <vincent.guittot@linaro.org>2014-09-10 09:36:58 +0200
committerVincent Guittot <vincent.guittot@linaro.org>2014-09-10 09:41:55 +0200
commit559c07376751445d25d688801bed4c363b6fde53 (patch)
tree2e4c70d5b780b4af76ed8d3517eddcd95e81e58a /src
parent82dae3e5ee2fdb1d759364d9d261e5c404d56269 (diff)
add a timer resource
timer differs from sleep in the way the wake up time is computed sleep will sleep for duration from the current time timer will sleep for duration since the last programmed wake up With the sequence "run" : 1000 "sleep" : 1000 the loop period will depend of the time to execute the run events which can be slow down by a freq decrease, cpu time sharing ... With the sequence "run" : 1000 "timer" : 2000 The loop period will be 2000 whatever the time to execute the run events (while the duration of the run events will be less than 2000)
Diffstat (limited to 'src')
-rw-r--r--src/rt-app.c19
-rw-r--r--src/rt-app_parse_config.c23
-rw-r--r--src/rt-app_types.h5
-rw-r--r--src/rt-app_utils.c5
4 files changed, 52 insertions, 0 deletions
diff --git a/src/rt-app.c b/src/rt-app.c
index 32ce417..45aaf61 100644
--- a/src/rt-app.c
+++ b/src/rt-app.c
@@ -166,6 +166,17 @@ static int run_event(event_data_t *event, int dry_run,
*duration += timespec_to_usec(&t_end);
}
break;
+ case rtapp_timer:
+ {
+ struct timespec t_period, t_now;
+ log_debug("timer %d ", event->duration);
+
+ t_period = usec_to_timespec(event->duration);
+ event->res->res.timer.t_next = timespec_add(&event->res->res.timer.t_next, &t_period);
+ clock_gettime(CLOCK_MONOTONIC, &t_now);
+ if (timespec_lower(&t_now, &event->res->res.timer.t_next))
+ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &event->res->res.timer.t_next, NULL);
+ }
break;
}
@@ -600,6 +611,14 @@ int main(int argc, char* argv[])
fprintf(gnuplot_script, "set terminal wxt\nreplot\n");
fclose(gnuplot_script);
+
+ /* Sync timer resources with start time */
+ clock_gettime(CLOCK_MONOTONIC, &t_start);
+
+ for (i = 0; i < nresources; i++) {
+ rdata = &opts.resources[i];
+ if (rdata->type == rtapp_timer)
+ rdata->res.timer.t_next = t_start;
}
/* Start the use case */
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c
index e5e34c0..a89bb88 100644
--- a/src/rt-app_parse_config.c
+++ b/src/rt-app_parse_config.c
@@ -175,6 +175,13 @@ static int init_mutex_resource(rtapp_resource_t *data, const rtapp_options_t *op
&data->res.mtx.attr);
}
+static int init_timer_resource(rtapp_resource_t *data, const rtapp_options_t *opts)
+{
+ log_info(PIN "Init: %s timer", data->name);
+ clock_gettime(CLOCK_MONOTONIC, &data->res.timer.t_next);
+}
+
+
static int init_cond_resource(rtapp_resource_t *data, const rtapp_options_t *opts)
{
log_info(PIN "Init: %s wait", data->name);
@@ -226,6 +233,9 @@ parse_resource_data(char *name, struct json_object *obj, int idx,
case rtapp_mutex:
init_mutex_resource(data, opts);
break;
+ case rtapp_timer:
+ init_timer_resource(data, opts);
+ break;
case rtapp_wait:
init_cond_resource(data, opts);
break;
@@ -358,7 +368,18 @@ parse_thread_event_data(char *name, struct json_object *obj,
return;
}
+ if (!strncmp(name, "timer", strlen("timer"))) {
+ i = get_resource_index(get_string_value_from(obj, "ref", TRUE, "unknown"), opts->resources);
+ if (i >= opts->nresources)
+ goto unknown_event;
+ data->res = &opts->resources[i];
+
+ data->duration = get_int_value_from(obj, "period", TRUE, 0);
+ data->type = rtapp_timer;
+
+ log_info(PIN2 "type %d target %s period %d", data->type, data->res->name, data->duration);
+ return;
}
unknown_event:
@@ -387,6 +408,8 @@ obj_is_event(char *name)
return 1;
if (!strncmp(name, "run", strlen("run")))
return 1;
+ if (!strncmp(name, "timer", strlen("timer")))
+ return 1;
return 0;
}
diff --git a/src/rt-app_types.h b/src/rt-app_types.h
index f063a07..17f73c7 100644
--- a/src/rt-app_types.h
+++ b/src/rt-app_types.h
@@ -77,12 +77,17 @@ struct _rtapp_signal {
pthread_cond_t *target;
};
+struct _rtapp_timer {
+ struct timespec t_next;
+};
+
/* Shared resources */
typedef struct _rtapp_resource_t {
union {
struct _rtapp_mutex mtx;
struct _rtapp_cond cond;
struct _rtapp_signal signal;
+ struct _rtapp_timer timer;
} res;
int index;
resource_t type;
diff --git a/src/rt-app_utils.c b/src/rt-app_utils.c
index f34d961..d35e9ce 100644
--- a/src/rt-app_utils.c
+++ b/src/rt-app_utils.c
@@ -216,6 +216,8 @@ string_to_resource(const char *name, resource_t *resource)
*resource = rtapp_sleep;
else if (strcmp(name, "run") == 0)
*resource = rtapp_run;
+ else if (strcmp(name, "timer") == 0)
+ *resource = rtapp_timer;
else
return 1;
return 0;
@@ -246,6 +248,9 @@ resource_to_string(resource_t resource, char *resource_name)
case rtapp_run:
strcpy(resource_name, "run");
break;
+ case rtapp_timer:
+ strcpy(resource_name, "timer");
+ break;
default:
return 1;
}