diff options
Diffstat (limited to 'backend.c')
-rw-r--r-- | backend.c | 42 |
1 files changed, 37 insertions, 5 deletions
@@ -150,6 +150,12 @@ MM_API int mm_backend_instances(char* name, size_t* ninst, instance*** inst){ } *ninst = n; + + if(!n){ + *inst = NULL; + return 0; + } + *inst = calloc(n, sizeof(instance*)); if(!*inst){ fprintf(stderr, "Failed to allocate memory\n"); @@ -256,30 +262,56 @@ MM_API int mm_backend_register(backend b){ int backends_start(){ int rv = 0, current; - size_t u, p; + size_t n, u, p; + instance** inst = NULL; + for(u = 0; u < nbackends; u++){ //only start backends that have instances for(p = 0; p < ninstances && instances[p]->backend != backends + u; p++){ } + + //backend has no instances, skip the start call if(p == ninstances){ - fprintf(stderr, "Skipping start of backend %s\n", backends[u].name); continue; } + + //fetch list of instances + if(mm_backend_instances(backends[u].name, &n, &inst)){ + fprintf(stderr, "Failed to fetch instance list for initialization of backend %s\n", backends[u].name); + return 1; + } - current = backends[u].start(); + //start the backend + current = backends[u].start(n, inst); if(current){ fprintf(stderr, "Failed to start backend %s\n", backends[u].name); } + + //clean up + free(inst); + inst = NULL; rv |= current; } return rv; } int backends_stop(){ - size_t u; + size_t u, n; + instance** inst = NULL; + for(u = 0; u < nbackends; u++){ - backends[u].shutdown(); + //fetch list of instances + if(mm_backend_instances(backends[u].name, &n, &inst)){ + fprintf(stderr, "Failed to fetch instance list for shutdown of backend %s\n", backends[u].name); + n = 0; + inst = NULL; + } + + backends[u].shutdown(n, inst); + free(inst); + inst = NULL; } + free(backends); nbackends = 0; return 0; |