diff options
author | Vincent Guittot <vincent.guittot@linaro.org> | 2014-09-19 21:11:06 -0700 |
---|---|---|
committer | Vincent Guittot <vincent.guittot@linaro.org> | 2014-09-24 11:25:10 +0200 |
commit | 7fd564a522b12f15e8bfb3d23c32466e4d199781 (patch) | |
tree | 2045ebc540df5dfec921a12c95fa46384667afe9 /src | |
parent | 1abf991590f4567475a06e978edf583cb711c4f2 (diff) |
add suspend resume events
Diffstat (limited to 'src')
-rw-r--r-- | src/rt-app.c | 16 | ||||
-rw-r--r-- | src/rt-app_parse_config.c | 54 | ||||
-rw-r--r-- | src/rt-app_types.h | 2 |
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 { |