diff options
-rw-r--r-- | src/afb-api.h | 1 | ||||
-rw-r--r-- | src/afb-apiset.c | 17 |
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; |