diff --git a/lib/cache_mngr.c b/lib/cache_mngr.c index a144b92..dffba90 100644 --- a/lib/cache_mngr.c +++ b/lib/cache_mngr.c @@ -365,20 +365,24 @@ int nl_cache_mngr_data_ready(struct nl_cache_mngr *mngr) } /** - * Free cache manager - * @arg mngr Cache manager + * Free cache manager and all caches. + * @arg mngr Cache manager. * * Release all resources after usage of a cache manager. */ void nl_cache_mngr_free(struct nl_cache_mngr *mngr) { + int i; + if (!mngr) return; - if (mngr->cm_handle) { + if (mngr->cm_handle) nl_close(mngr->cm_handle); - nl_handle_destroy(mngr->cm_handle); - } + + for (i = 0; i < mngr->cm_nassocs; i++) + if (mngr->cm_assocs[i].ca_cache) + nl_cache_free(mngr->cm_assocs[i].ca_cache); free(mngr->cm_assocs); free(mngr); diff --git a/tests/test-cache-mngr.c b/tests/test-cache-mngr.c index 4d70e31..9a3da2d 100644 --- a/tests/test-cache-mngr.c +++ b/tests/test-cache-mngr.c @@ -1,4 +1,7 @@ #include "../src/utils.h" +#include + +static int quit = 0; static void change_cb(struct nl_cache *cache, struct nl_object *obj, int action) @@ -18,12 +21,19 @@ static void change_cb(struct nl_cache *cache, struct nl_object *obj, nl_object_dump(obj, &dp); } +static void sigint(int arg) +{ + quit = 1; +} + int main(int argc, char *argv[]) { struct nl_cache_mngr *mngr; struct nl_cache *lc, *nc, *ac, *rc; struct nl_handle *handle; + signal(SIGINT, sigint); + nltool_init(argc, argv); handle = nltool_alloc_handle(); @@ -58,9 +68,9 @@ int main(int argc, char *argv[]) return -1; } - for (;;) { + while (!quit) { int err = nl_cache_mngr_poll(mngr, 5000); - if (err < 0) { + if (err < 0 && err != -EINTR) { nl_perror("nl_cache_mngr_poll()"); return -1; } @@ -68,6 +78,7 @@ int main(int argc, char *argv[]) } nl_cache_mngr_free(mngr); + nl_handle_destroy(handle); return 0; }