Add 'noconcurrency' when creating dynamic API 4.99.2 eel/4.99.2 eel_4.99.2
authorJosé Bollo <jose.bollo@iot.bzh>
Fri, 3 Nov 2017 12:58:33 +0000 (13:58 +0100)
committerJosé Bollo <jose.bollo@iot.bzh>
Fri, 3 Nov 2017 12:58:33 +0000 (13:58 +0100)
Change-Id: Ia108b23b9480bb32f27127ef00c18086fcf86752
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
bindings/samples/ave.c
include/afb/afb-daemon-itf.h
include/afb/afb-daemon-v1.h
include/afb/afb-daemon-v2.h
include/afb/afb-dynapi-itf.h
include/afb/afb-dynapi.h
src/afb-api-dyn.c
src/afb-api-dyn.h
src/afb-export.c

index a4b4144..569245e 100644 (file)
@@ -483,7 +483,7 @@ int afbBindingVdyn(afb_dynapi *dynapi)
        int i, rc;
 
        for (i = 0; apis[i] ; i++) {
-               rc = afb_dynapi_new_api(dynapi, apis[i], NULL, build_api, (void*)apis[i]);
+               rc = afb_dynapi_new_api(dynapi, apis[i], NULL, 0, build_api, (void*)apis[i]);
                if (rc < 0)
                        AFB_DYNAPI_ERROR(dynapi, "can't create API %s", apis[i]);
        }
index b78f9af..492032e 100644 (file)
@@ -44,7 +44,7 @@ struct afb_daemon_itf
        struct afb_req (*unstore_req)(void*closure, struct afb_stored_req *sreq);
        int (*require_api)(void*closure, const char *name, int initialized);
        int (*rename_api)(void*closure, const char *name);
-       int (*new_api)(void *closure, const char *api, const char *info, int (*preinit)(void*, struct afb_dynapi *), void *preinit_closure);
+       int (*new_api)(void *closure, const char *api, const char *info, int noconcurrency, int (*preinit)(void*, struct afb_dynapi *), void *preinit_closure);
 };
 
 /*
index d1a0cc2..d199a48 100644 (file)
@@ -195,8 +195,9 @@ static inline int afb_daemon_new_api_v1(
        struct afb_daemon daemon,
        const char *api,
        const char *info,
+       int noconcurrency,
        int (*preinit)(void*, struct afb_dynapi *),
        void *closure)
 {
-       return daemon.itf->new_api(daemon.closure, api, info, preinit, closure);
+       return daemon.itf->new_api(daemon.closure, api, info, noconcurrency, preinit, closure);
 }
index 1ea40e9..6eb48c6 100644 (file)
@@ -171,9 +171,10 @@ static inline int afb_daemon_rename_api_v2(const char *name)
 static inline int afb_daemon_new_api_v2(
        const char *api,
        const char *info,
+       int noconcurrency,
        int (*preinit)(void*, struct afb_dynapi *),
        void *closure)
 {
-       return afb_get_daemon_v2().itf->new_api(afb_get_daemon_v2().closure, api, info, preinit, closure);
+       return afb_get_daemon_v2().itf->new_api(afb_get_daemon_v2().closure, api, info, noconcurrency, preinit, closure);
 }
 
index 682558e..fc90dbd 100644 (file)
@@ -131,6 +131,7 @@ struct afb_dynapi_itf
                void *dynapi,
                const char *api,
                const char *info,
+               int noconcurrency,
                int (*preinit)(void*, struct afb_dynapi *),
                void *closure);
 
index dfdcdb2..e245895 100644 (file)
@@ -242,10 +242,11 @@ static inline int afb_dynapi_new_api(
        struct afb_dynapi *dynapi,
        const char *api,
        const char *info,
+       int noconcurrency,
        int (*preinit)(void*, struct afb_dynapi *),
        void *closure)
 {
-       return dynapi->itf->api_new_api(dynapi, api, info, preinit, closure);
+       return dynapi->itf->api_new_api(dynapi, api, info, noconcurrency, preinit, closure);
 }
 
 static inline int afb_dynapi_set_verbs_v2(
index 0667f51..2ef1b1a 100644 (file)
@@ -235,7 +235,7 @@ static struct afb_api_itf dyn_api_itf = {
        .describe = describe_cb
 };
 
-int afb_api_dyn_add(struct afb_apiset *apiset, const char *name, const char *info, int (*preinit)(void*, struct afb_dynapi*), void *closure)
+int afb_api_dyn_add(struct afb_apiset *apiset, const char *name, const char *info, int noconcurrency, int (*preinit)(void*, struct afb_dynapi*), void *closure)
 {
        int rc;
        struct afb_api_dyn *dynapi;
@@ -266,7 +266,7 @@ int afb_api_dyn_add(struct afb_apiset *apiset, const char *name, const char *inf
        /* records the binding */
        afb_api.closure = dynapi;
        afb_api.itf = &dyn_api_itf;
-       afb_api.group = NULL;
+       afb_api.group = noconcurrency ? dynapi : NULL;
        if (afb_apiset_add(apiset, afb_export_apiname(dynapi->export), afb_api) < 0) {
                ERROR("dynamic api %s can't be registered to set %s, ABORTING it!",
                                afb_export_apiname(dynapi->export),
index 35464c6..21626ee 100644 (file)
@@ -40,6 +40,7 @@ extern int afb_api_dyn_add(
                struct afb_apiset *apiset,
                const char *name,
                const char *info,
+               int noconcurrency,
                int (*preinit)(void*, struct afb_dynapi*),
                void *closure);
 
index 19aab0c..ea783b8 100644 (file)
@@ -255,11 +255,12 @@ static int api_new_api_cb(
                void *closure,
                const char *api,
                const char *info,
+               int noconcurrency,
                int (*preinit)(void*, struct afb_dynapi *),
                void *preinit_closure)
 {
        struct afb_export *export = closure;
-       return afb_api_dyn_add(export->apiset, api, info, preinit, preinit_closure);
+       return afb_api_dyn_add(export->apiset, api, info, noconcurrency, preinit, preinit_closure);
 }
 
 /**********************************************
@@ -376,11 +377,12 @@ static int hooked_api_new_api_cb(
                void *closure,
                const char *api,
                const char *info,
+               int noconcurrency,
                int (*preinit)(void*, struct afb_dynapi *),
                void *preinit_closure)
 {
        /* TODO */
-       return api_new_api_cb(closure, api, info, preinit, preinit_closure);
+       return api_new_api_cb(closure, api, info, noconcurrency, preinit, preinit_closure);
 }
 /**********************************************
 * vectors