X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-api-v3.c;h=660fac113f08bfb971a225b89f6270aa30f7cc1f;hb=de0527f7cf5b4a4278698ab034a332cf75723300;hp=11bc35ff244819552e83031857c621b67e0c232b;hpb=10ac2105ecc20251b13bdc6f6c78c3e2edb8dfef;p=src%2Fapp-framework-binder.git diff --git a/src/afb-api-v3.c b/src/afb-api-v3.c index 11bc35ff..660fac11 100644 --- a/src/afb-api-v3.c +++ b/src/afb-api-v3.c @@ -179,23 +179,25 @@ struct json_object *afb_api_v3_make_description_openAPIv3(struct afb_api_v3 *api return r; } -struct afb_api_v3 *afb_api_v3_create( - struct afb_apiset *declare_set, +struct afb_api_v3 *afb_api_v3_create(struct afb_apiset *declare_set, struct afb_apiset *call_set, const char *apiname, const char *info, int noconcurrency, int (*preinit)(void*, struct afb_api_x3 *), void *closure, - int copy_info -) + int copy_info, + struct afb_export* creator, + const char* path) { struct afb_api_v3 *api; /* allocates the description */ api = calloc(1, sizeof *api + (copy_info && info ? 1 + strlen(info) : 0)); - if (!api) + if (!api) { + ERROR("out of memory"); goto oom; + } api->refcount = 1; if (!info) api->info = &nulchar; @@ -204,7 +206,7 @@ struct afb_api_v3 *afb_api_v3_create( else api->info = info; - api->export = afb_export_create_v3(declare_set, call_set, apiname, api); + api->export = afb_export_create_v3(declare_set, call_set, apiname, api, creator, path); if (!api->export) goto oom2; @@ -223,7 +225,6 @@ oom3: oom2: free(api); oom: - ERROR("out of memory"); return NULL; } @@ -238,6 +239,9 @@ void afb_api_v3_unref(struct afb_api_v3 *api) { if (api && !__atomic_sub_fetch(&api->refcount, 1, __ATOMIC_RELAXED)) { afb_export_destroy(api->export); + while (api->count) + free(api->verbs[--api->count]); + free(api->verbs); free(api); } } @@ -321,19 +325,16 @@ int afb_api_v3_del_verb( const char *verb, void **vcbdata) { - struct afb_verb_v3 **v, **e, *i; + struct afb_verb_v3 *v; + int i; - v = api->verbs; - e = &v[api->count]; - while (v != e) { - i = *v++; - if (!strcasecmp(i->verb, verb)) { - api->count--; + for (i = 0 ; i < api->count ; i++) { + v = api->verbs[i]; + if (!strcasecmp(verb, v->verb)) { + api->verbs[i] = api->verbs[--api->count]; if (vcbdata) - *vcbdata = i->vcbdata; - if (v != e) - *--v = *--e; - free(i); + *vcbdata = v->vcbdata; + free(v); return 0; } } @@ -399,6 +400,6 @@ static int init_binding(void *closure, struct afb_api_x3 *api) struct afb_api_v3 *afb_api_v3_from_binding(const struct afb_binding_v3 *desc, struct afb_apiset *declare_set, struct afb_apiset * call_set) { - return afb_api_v3_create(declare_set, call_set, desc->api, desc->info, desc->noconcurrency, init_binding, (void*)desc, 0); + return afb_api_v3_create(declare_set, call_set, desc->api, desc->info, desc->noconcurrency, init_binding, (void*)desc, 0, NULL, NULL); }