diff options
-rw-r--r-- | include/afb/afb-binding-v2.h | 1 | ||||
-rw-r--r-- | src/afb-api-so-v2.c | 36 |
2 files changed, 36 insertions, 1 deletions
diff --git a/include/afb/afb-binding-v2.h b/include/afb/afb-binding-v2.h index d869dc6e..b949a2d7 100644 --- a/include/afb/afb-binding-v2.h +++ b/include/afb/afb-binding-v2.h @@ -60,6 +60,7 @@ struct afb_binding_v2 int (*init)(struct afb_daemon daemon); int (*start)(struct afb_service service); void (*onevent)(struct afb_service service, const char *event, struct json_object *object); + unsigned concurrent: 1; /* allows concurrent requests to verbs */ }; /* diff --git a/src/afb-api-so-v2.c b/src/afb-api-so-v2.c index 11cd56f7..e0769213 100644 --- a/src/afb-api-so-v2.c +++ b/src/afb-api-so-v2.c @@ -35,6 +35,7 @@ #include "afb-context.h" #include "afb-api-so.h" #include "afb-xreq.h" +#include "jobs.h" #include "verbose.h" /* @@ -74,6 +75,31 @@ static void call_cb(void *closure, struct afb_xreq *xreq) afb_xreq_call_verb_v2(xreq, verb); } +struct call_sync +{ + struct api_so_v2 *desc; + struct afb_xreq *xreq; +}; + +static void call_sync_cb_cb(int signum, void *closure) +{ + struct call_sync *cs = closure; + if (!signum) + call_cb(cs->desc, cs->xreq); + else { + if (!cs->xreq->replied) + afb_xreq_fail(cs->xreq, "aborted", "internal error"); + } +} + +static void call_sync_cb(void *closure, struct afb_xreq *xreq) +{ + struct call_sync cs = { .desc = closure, .xreq = xreq }; + + if (jobs_call(closure, 0, call_sync_cb_cb, &cs)) + call_cb(closure, xreq); +} + static int service_start_cb(void *closure, int share_session, int onneed, struct afb_apiset *apiset) { int (*start)(struct afb_service service); @@ -147,7 +173,15 @@ static struct afb_api_itf so_v2_api_itf = { .get_verbosity = get_verbosity_cb, .set_verbosity = set_verbosity_cb, .describe = describe_cb +}; +static struct afb_api_itf so_v2_sync_api_itf = { + .call = call_sync_cb, + .service_start = service_start_cb, + .update_hooks = update_hooks_cb, + .get_verbosity = get_verbosity_cb, + .set_verbosity = set_verbosity_cb, + .describe = describe_cb }; int afb_api_so_v2_add_binding(const struct afb_binding_v2 *binding, void *handle, struct afb_apiset *apiset, int *pver) @@ -188,7 +222,7 @@ int afb_api_so_v2_add_binding(const struct afb_binding_v2 *binding, void *handle /* records the binding */ afb_api.closure = desc; - afb_api.itf = &so_v2_api_itf; + afb_api.itf = binding->concurrent ? &so_v2_api_itf : &so_v2_sync_api_itf; if (afb_apiset_add(apiset, binding->api, afb_api) < 0) { ERROR("binding %s can't be registered to set %s...", binding->api, afb_apiset_name(apiset)); goto error2; |