X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-api-so-v2.c;h=6aa10cf523de4bd339eebc22f6e4702febe51891;hb=66451a0d658eabab18f37995659d81d429e0138e;hp=11cd56f7a5b9462a001111f8a0d7a968023bfa45;hpb=1a64df64ca126fb1e0dbe08c432d3c015d4ac458;p=src%2Fapp-framework-binder.git diff --git a/src/afb-api-so-v2.c b/src/afb-api-so-v2.c index 11cd56f7..6aa10cf5 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); @@ -93,7 +119,7 @@ static int service_start_cb(void *closure, int share_session, int onneed, struct } /* get the initialisation */ - start = desc->binding->start; + start = desc->binding->init; if (start == NULL) { /* not an error when onneed */ if (onneed != 0) @@ -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) @@ -177,18 +211,18 @@ int afb_api_so_v2_add_binding(const struct afb_binding_v2 *binding, void *handle afb_ditf_init_v2(&desc->ditf, binding->api); /* init the binding */ - if (binding->init) { - INFO("binding %s calling init function", binding->api); - rc = binding->init(desc->ditf.daemon); + if (binding->preinit) { + INFO("binding %s calling preinit function", binding->api); + rc = binding->preinit(desc->ditf.daemon); if (rc < 0) { - ERROR("binding %s initialisation function failed...", binding->api); + ERROR("binding %s preinit function failed...", binding->api); goto error2; } } /* 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;