aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend.c
diff options
context:
space:
mode:
Diffstat (limited to 'backend.c')
-rw-r--r--backend.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/backend.c b/backend.c
index 3a18f41..2af2f37 100644
--- a/backend.c
+++ b/backend.c
@@ -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;