summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent Guittot <vincent.guittot@linaro.org>2014-09-19 21:11:06 -0700
committerVincent Guittot <vincent.guittot@linaro.org>2014-09-24 11:25:10 +0200
commit7fd564a522b12f15e8bfb3d23c32466e4d199781 (patch)
tree2045ebc540df5dfec921a12c95fa46384667afe9 /src
parent1abf991590f4567475a06e978edf583cb711c4f2 (diff)
add suspend resume events
Diffstat (limited to 'src')
-rw-r--r--src/rt-app.c16
-rw-r--r--src/rt-app_parse_config.c54
-rw-r--r--src/rt-app_types.h2
3 files changed, 71 insertions, 1 deletions
diff --git a/src/rt-app.c b/src/rt-app.c
index d1c6a4c..de91ff1 100644
--- a/src/rt-app.c
+++ b/src/rt-app.c
@@ -180,6 +180,22 @@ static int run_event(event_data_t *event, int dry_run,
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &rdata->res.timer.t_next, NULL);
}
break;
+ case rtapp_suspend:
+ {
+ log_debug("suspend %s ", rdata->name);
+ pthread_mutex_lock(&(ddata->res.mtx.obj));
+ pthread_cond_wait(&(rdata->res.cond.obj), &(ddata->res.mtx.obj));
+ pthread_mutex_unlock(&(ddata->res.mtx.obj));
+ break;
+ }
+ case rtapp_resume:
+ {
+ log_debug("resume %s ", rdata->name);
+ pthread_mutex_lock(&(ddata->res.mtx.obj));
+ pthread_cond_signal(&(rdata->res.cond.obj));
+ pthread_mutex_unlock(&(ddata->res.mtx.obj));
+ break;
+ }
}
return lock;
diff --git a/src/rt-app_parse_config.c b/src/rt-app_parse_config.c
index 1d53cdb..8c0bdf7 100644
--- a/src/rt-app_parse_config.c
+++ b/src/rt-app_parse_config.c
@@ -357,7 +357,7 @@ parse_thread_event_data(char *name, struct json_object *obj,
if (!json_object_is_type(obj, json_type_string))
goto unknown_event;
- ref = strdup(json_object_get_string(obj));
+ ref = json_object_get_string(obj);
i = get_resource_index(ref, rtapp_wait, opts);
data->res = i;
@@ -408,6 +408,54 @@ parse_thread_event_data(char *name, struct json_object *obj,
return;
}
+ if (!strncmp(name, "resume", strlen("resume"))) {
+
+ data->type = rtapp_resume;
+
+ if (!json_object_is_type(obj, json_type_string))
+ goto unknown_event;
+
+ ref = json_object_get_string(obj);
+
+ i = get_resource_index(ref, rtapp_wait, opts);
+
+ data->res = i;
+
+ i = get_resource_index(ref, rtapp_mutex, opts);
+
+ data->dep = i;
+
+ rdata = &(opts->resources[data->res]);
+ ddata = &(opts->resources[data->dep]);
+
+ log_info(PIN2 "type %d target %s [%d] mutex %s [%d]", data->type, rdata->name, rdata->index, ddata->name, ddata->index);
+ return;
+ }
+
+ if (!strncmp(name, "suspend", strlen("suspend"))) {
+
+ data->type = rtapp_suspend;
+
+ if (!json_object_is_type(obj, json_type_string))
+ goto unknown_event;
+
+ ref = json_object_get_string(obj);
+
+ i = get_resource_index(ref, rtapp_wait, opts);
+
+ data->res = i;
+
+ i = get_resource_index(ref, rtapp_mutex, opts);
+
+ data->dep = i;
+
+ rdata = &(opts->resources[data->res]);
+ ddata = &(opts->resources[data->dep]);
+
+ log_info(PIN2 "type %d target %s [%d] mutex %s [%d]", data->type, rdata->name, rdata->index, ddata->name, ddata->index);
+ return;
+ }
+
unknown_resource:
log_error(PIN2 "Resource %s not found in the resource section !!!", ref);
log_error(PIN2 "Please check the resource name or the resource section");
@@ -440,6 +488,10 @@ obj_is_event(char *name)
return rtapp_run;
if (!strncmp(name, "timer", strlen("timer")))
return rtapp_timer;
+ if (!strncmp(name, "suspend", strlen("suspend")))
+ return rtapp_suspend;
+ if (!strncmp(name, "resume", strlen("resume")))
+ return rtapp_resume;
return 0;
}
diff --git a/src/rt-app_types.h b/src/rt-app_types.h
index 2cd9905..fd29a06 100644
--- a/src/rt-app_types.h
+++ b/src/rt-app_types.h
@@ -63,6 +63,8 @@ typedef enum resource_t
rtapp_lock,
rtapp_unlock,
rtapp_timer,
+ rtapp_suspend,
+ rtapp_resume,
} resource_t;
struct _rtapp_mutex {