summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/afb-api.h1
-rw-r--r--src/afb-apiset.c17
2 files changed, 13 insertions, 5 deletions
diff --git a/src/afb-api.h b/src/afb-api.h
index 60e95b11..3f2e7f15 100644
--- a/src/afb-api.h
+++ b/src/afb-api.h
@@ -29,6 +29,7 @@ struct afb_api_itf
int (*get_verbosity)(void *closure);
void (*set_verbosity)(void *closure, int level);
struct json_object *(*describe)(void *closure);
+ void (*unref)(void *closure);
};
struct afb_api
diff --git a/src/afb-apiset.c b/src/afb-apiset.c
index a373c207..8d76bbfe 100644
--- a/src/afb-apiset.c
+++ b/src/afb-apiset.c
@@ -264,21 +264,28 @@ error:
*/
int afb_apiset_del(struct afb_apiset *set, const char *name)
{
- int i, c;
+ struct api_desc *i, *e;
+ int c;
/* search the api */
- for (i = 0 ; i < set->count ; i++) {
- c = strcasecmp(set->apis[i].name, name);
+ i = set->apis;
+ e = i + set->count;
+ while (i != e) {
+ c = strcasecmp(i->name, name);
if (c == 0) {
+ if (i->api.itf->unref)
+ i->api.itf->unref(i->api.closure);
set->count--;
- while(i < set->count) {
- set->apis[i] = set->apis[i + 1];
+ e--;
+ while (i != e) {
+ i[0] = i[1];
i++;
}
return 0;
}
if (c > 0)
break;
+ i++;
}
errno = ENOENT;
return -1;