From f6d6eefe9bb9934f4fa3e665734d746f02471cdb Mon Sep 17 00:00:00 2001 From: cbdev Date: Wed, 11 Dec 2019 23:20:34 +0100 Subject: Simplify plugin_stop API --- backend.c | 22 ++++++++++++++++++++-- backends/artnet.c | 10 ++-------- backends/artnet.h | 2 +- backends/evdev.c | 13 +++---------- backends/evdev.h | 2 +- backends/jack.c | 12 ++---------- backends/jack.h | 2 +- backends/loopback.c | 12 ++---------- backends/loopback.h | 2 +- backends/lua.c | 12 ++---------- backends/lua.h | 2 +- backends/maweb.c | 13 ++----------- backends/maweb.h | 4 ++-- backends/midi.c | 10 ++-------- backends/midi.h | 2 +- backends/ola.cpp | 16 ++-------------- backends/ola.h | 2 +- backends/osc.c | 11 ++--------- backends/osc.h | 2 +- backends/sacn.c | 11 ++--------- backends/sacn.h | 2 +- backends/winmidi.c | 11 ++--------- backends/winmidi.h | 2 +- config.c | 3 ++- midimonster.h | 2 +- 25 files changed, 58 insertions(+), 124 deletions(-) diff --git a/backend.c b/backend.c index f5efca7..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"); @@ -290,10 +296,22 @@ int backends_start(){ } 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; diff --git a/backends/artnet.c b/backends/artnet.c index e4147ec..b181296 100644 --- a/backends/artnet.c +++ b/backends/artnet.c @@ -438,18 +438,12 @@ bail: return rv; } -static int artnet_shutdown(){ - size_t n, p; - instance** inst = NULL; - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } +static int artnet_shutdown(size_t n, instance** inst){ + size_t p; for(p = 0; p < n; p++){ free(inst[p]->impl); } - free(inst); for(p = 0; p < artnet_fds; p++){ close(artnet_fd[p].fd); diff --git a/backends/artnet.h b/backends/artnet.h index 738b55c..59bd53f 100644 --- a/backends/artnet.h +++ b/backends/artnet.h @@ -11,7 +11,7 @@ static channel* artnet_channel(instance* instance, char* spec, uint8_t flags); static int artnet_set(instance* inst, size_t num, channel** c, channel_value* v); static int artnet_handle(size_t num, managed_fd* fds); static int artnet_start(size_t n, instance** inst); -static int artnet_shutdown(); +static int artnet_shutdown(size_t n, instance** inst); #define ARTNET_PORT "6454" #define ARTNET_VERSION 14 diff --git a/backends/evdev.c b/backends/evdev.c index 9998a03..d2eeba8 100644 --- a/backends/evdev.c +++ b/backends/evdev.c @@ -498,18 +498,12 @@ static int evdev_set(instance* inst, size_t num, channel** c, channel_value* v) #endif } -static int evdev_shutdown(){ +static int evdev_shutdown(size_t n, instance** inst){ evdev_instance_data* data = NULL; - instance** instances = NULL; - size_t n, u; - - if(mm_backend_instances(BACKEND_NAME, &n, &instances)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } + size_t u; for(u = 0; u < n; u++){ - data = (evdev_instance_data*) instances[u]->impl; + data = (evdev_instance_data*) inst[u]->impl; if(data->input_fd >= 0){ libevdev_free(data->input_ev); @@ -528,7 +522,6 @@ static int evdev_shutdown(){ free(data); } - free(instances); fprintf(stderr, "evdev backend shut down\n"); return 0; } diff --git a/backends/evdev.h b/backends/evdev.h index 1f03941..0c877fc 100644 --- a/backends/evdev.h +++ b/backends/evdev.h @@ -16,7 +16,7 @@ static channel* evdev_channel(instance* instance, char* spec, uint8_t flags); static int evdev_set(instance* inst, size_t num, channel** c, channel_value* v); static int evdev_handle(size_t num, managed_fd* fds); static int evdev_start(size_t n, instance** inst); -static int evdev_shutdown(); +static int evdev_shutdown(size_t n, instance** inst); #define INPUT_NODES "/dev/input" #define INPUT_PREFIX "event" diff --git a/backends/jack.c b/backends/jack.c index 047dce8..eb53190 100644 --- a/backends/jack.c +++ b/backends/jack.c @@ -685,16 +685,10 @@ bail: return rv; } -static int mmjack_shutdown(){ - size_t n, u, p; - instance** inst = NULL; +static int mmjack_shutdown(size_t n, instance** inst){ + size_t u, p; mmjack_instance_data* data = NULL; - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } - for(u = 0; u < n; u++){ data = (mmjack_instance_data*) inst[u]->impl; @@ -733,8 +727,6 @@ static int mmjack_shutdown(){ data->fd = -1; } - free(inst); - fprintf(stderr, "jack backend shut down\n"); return 0; } diff --git a/backends/jack.h b/backends/jack.h index c9f8c4c..66c66db 100644 --- a/backends/jack.h +++ b/backends/jack.h @@ -10,7 +10,7 @@ static channel* mmjack_channel(instance* inst, char* spec, uint8_t flags); static int mmjack_set(instance* inst, size_t num, channel** c, channel_value* v); static int mmjack_handle(size_t num, managed_fd* fds); static int mmjack_start(size_t n, instance** inst); -static int mmjack_shutdown(); +static int mmjack_shutdown(size_t n, instance** inst); #define JACK_DEFAULT_CLIENT_NAME "MIDIMonster" #define JACK_DEFAULT_SERVER_NAME "default" diff --git a/backends/loopback.c b/backends/loopback.c index 616eccf..c2c3430 100644 --- a/backends/loopback.c +++ b/backends/loopback.c @@ -96,16 +96,10 @@ static int loopback_start(size_t n, instance** inst){ return 0; } -static int loopback_shutdown(){ - size_t n, u, p; - instance** inst = NULL; +static int loopback_shutdown(size_t n, instance** inst){ + size_t u, p; loopback_instance_data* data = NULL; - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } - for(u = 0; u < n; u++){ data = (loopback_instance_data*) inst[u]->impl; for(p = 0; p < data->n; p++){ @@ -115,8 +109,6 @@ static int loopback_shutdown(){ free(inst[u]->impl); } - free(inst); - fprintf(stderr, "Loopback backend shut down\n"); return 0; } diff --git a/backends/loopback.h b/backends/loopback.h index dee3e9d..c508d72 100644 --- a/backends/loopback.h +++ b/backends/loopback.h @@ -8,7 +8,7 @@ static channel* loopback_channel(instance* inst, char* spec, uint8_t flags); static int loopback_set(instance* inst, size_t num, channel** c, channel_value* v); static int loopback_handle(size_t num, managed_fd* fds); static int loopback_start(size_t n, instance** inst); -static int loopback_shutdown(); +static int loopback_shutdown(size_t n, instance** inst); typedef struct /*_loopback_instance_data*/ { size_t n; diff --git a/backends/lua.c b/backends/lua.c index b165dd8..2ce40f5 100644 --- a/backends/lua.c +++ b/backends/lua.c @@ -460,17 +460,10 @@ static int lua_start(size_t n, instance** inst){ return 0; } -static int lua_shutdown(){ - size_t n, u, p; - instance** inst = NULL; +static int lua_shutdown(size_t n, instance** inst){ + size_t u, p; lua_instance_data* data = NULL; - //fetch all instances - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } - for(u = 0; u < n; u++){ data = (lua_instance_data*) inst[u]->impl; //stop the interpreter @@ -486,7 +479,6 @@ static int lua_shutdown(){ free(inst[u]->impl); } - free(inst); //free module-global data free(timer); timer = NULL; diff --git a/backends/lua.h b/backends/lua.h index 9e19506..75f03c4 100644 --- a/backends/lua.h +++ b/backends/lua.h @@ -17,7 +17,7 @@ static channel* lua_channel(instance* inst, char* spec, uint8_t flags); static int lua_set(instance* inst, size_t num, channel** c, channel_value* v); static int lua_handle(size_t num, managed_fd* fds); static int lua_start(size_t n, instance** inst); -static int lua_shutdown(); +static int lua_shutdown(size_t n, instance** inst); #ifndef MMBACKEND_LUA_TIMERFD static uint32_t lua_interval(); #endif diff --git a/backends/maweb.c b/backends/maweb.c index 28cad0c..8cf201e 100644 --- a/backends/maweb.c +++ b/backends/maweb.c @@ -1017,17 +1017,10 @@ static int maweb_start(size_t n, instance** inst){ return 0; } -static int maweb_shutdown(){ - size_t n, u; - instance** inst = NULL; +static int maweb_shutdown(size_t n, instance** inst){ + size_t u; maweb_instance_data* data = NULL; - //fetch all instances - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } - for(u = 0; u < n; u++){ data = (maweb_instance_data*) inst[u]->impl; free(data->host); @@ -1053,8 +1046,6 @@ static int maweb_shutdown(){ data->channels = 0; } - free(inst); - fprintf(stderr, "maweb backend shut down\n"); return 0; } diff --git a/backends/maweb.h b/backends/maweb.h index 05095f8..50b777a 100644 --- a/backends/maweb.h +++ b/backends/maweb.h @@ -7,8 +7,8 @@ static instance* maweb_instance(); static channel* maweb_channel(instance* inst, char* spec, uint8_t flags); static int maweb_set(instance* inst, size_t num, channel** c, channel_value* v); static int maweb_handle(size_t num, managed_fd* fds); -static int maweb_start(); -static int maweb_shutdown(); +static int maweb_start(size_t n, instance** inst); +static int maweb_shutdown(size_t n, instance** inst); static uint32_t maweb_interval(); //Default login password: MD5("midimonster") diff --git a/backends/midi.c b/backends/midi.c index a7945ec..2088774 100644 --- a/backends/midi.c +++ b/backends/midi.c @@ -415,14 +415,9 @@ bail: return rv; } -static int midi_shutdown(){ - size_t n, p; - instance** inst = NULL; +static int midi_shutdown(size_t n, instance** inst){ + size_t p; midi_instance_data* data = NULL; - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } for(p = 0; p < n; p++){ data = (midi_instance_data*) inst[p]->impl; @@ -432,7 +427,6 @@ static int midi_shutdown(){ data->write = NULL; free(inst[p]->impl); } - free(inst); //close midi if(sequencer){ diff --git a/backends/midi.h b/backends/midi.h index 579c9cb..66a02bc 100644 --- a/backends/midi.h +++ b/backends/midi.h @@ -8,7 +8,7 @@ static channel* midi_channel(instance* instance, char* spec, uint8_t flags); static int midi_set(instance* inst, size_t num, channel** c, channel_value* v); static int midi_handle(size_t num, managed_fd* fds); static int midi_start(size_t n, instance** inst); -static int midi_shutdown(); +static int midi_shutdown(size_t n, instance** inst); typedef struct /*_midi_instance_data*/ { int port; diff --git a/backends/ola.cpp b/backends/ola.cpp index 088c20c..fd121a0 100644 --- a/backends/ola.cpp +++ b/backends/ola.cpp @@ -248,12 +248,6 @@ static int ola_start(size_t n, instance** inst){ ola_client->SetDmxCallback(ola::NewCallback(&ola_data_receive)); - //fetch all defined instances - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - goto bail; - } - for(u = 0; u < n; u++){ data = (ola_instance_data*) inst[u]->impl; inst[u]->ident = data->universe_id; @@ -279,18 +273,12 @@ bail: return 1; } -static int ola_shutdown(){ - size_t n, p; - instance** inst = NULL; - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } +static int ola_shutdown(size_t n, instance** inst){ + size_t p; for(p = 0; p < n; p++){ free(inst[p]->impl); } - free(inst); if(ola_client){ ola_client->Stop(); diff --git a/backends/ola.h b/backends/ola.h index 2a55b77..083e971 100644 --- a/backends/ola.h +++ b/backends/ola.h @@ -12,7 +12,7 @@ extern "C" { static int ola_set(instance* inst, size_t num, channel** c, channel_value* v); static int ola_handle(size_t num, managed_fd* fds); static int ola_start(size_t n, instance** inst); - static int ola_shutdown(); + static int ola_shutdown(size_t n, instance** inst); } #define MAP_COARSE 0x0200 diff --git a/backends/osc.c b/backends/osc.c index 61ae872..2c65ecb 100644 --- a/backends/osc.c +++ b/backends/osc.c @@ -917,16 +917,10 @@ static int osc_start(size_t n, instance** inst){ return 0; } -static int osc_shutdown(){ - size_t n, u, c; - instance** inst = NULL; +static int osc_shutdown(size_t n, instance** inst){ + size_t u, c; osc_instance_data* data = NULL; - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } - for(u = 0; u < n; u++){ data = (osc_instance_data*) inst[u]->impl; for(c = 0; c < data->channels; c++){ @@ -953,7 +947,6 @@ static int osc_shutdown(){ free(inst[u]->impl); } - free(inst); fprintf(stderr, "OSC backend shut down\n"); return 0; } diff --git a/backends/osc.h b/backends/osc.h index 24cc7e5..f8ff3ff 100644 --- a/backends/osc.h +++ b/backends/osc.h @@ -15,7 +15,7 @@ static channel* osc_map_channel(instance* inst, char* spec, uint8_t flags); static int osc_set(instance* inst, size_t num, channel** c, channel_value* v); static int osc_handle(size_t num, managed_fd* fds); static int osc_start(size_t n, instance** inst); -static int osc_shutdown(); +static int osc_shutdown(size_t n, instance** inst); typedef enum { not_set = 0, diff --git a/backends/sacn.c b/backends/sacn.c index 877cbb0..ef422e8 100644 --- a/backends/sacn.c +++ b/backends/sacn.c @@ -616,19 +616,12 @@ bail: return rv; } -static int sacn_shutdown(){ - size_t n, p; - instance** inst = NULL; - - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } +static int sacn_shutdown(size_t n, instance** inst){ + size_t p; for(p = 0; p < n; p++){ free(inst[p]->impl); } - free(inst); for(p = 0; p < global_cfg.fds; p++){ close(global_cfg.fd[p].fd); diff --git a/backends/sacn.h b/backends/sacn.h index 0d234d4..726fa68 100644 --- a/backends/sacn.h +++ b/backends/sacn.h @@ -8,7 +8,7 @@ static channel* sacn_channel(instance* instance, char* spec, uint8_t flags); static int sacn_set(instance* inst, size_t num, channel** c, channel_value* v); static int sacn_handle(size_t num, managed_fd* fds); static int sacn_start(size_t n, instance** inst); -static int sacn_shutdown(); +static int sacn_shutdown(size_t n, instance** inst); #define SACN_PORT "5568" #define SACN_RECV_BUF 8192 diff --git a/backends/winmidi.c b/backends/winmidi.c index 0fc1aca..090e438 100644 --- a/backends/winmidi.c +++ b/backends/winmidi.c @@ -542,16 +542,10 @@ bail: return rv; } -static int winmidi_shutdown(){ - size_t n, u; - instance** inst = NULL; +static int winmidi_shutdown(size_t n, instance** inst){ + size_t u; winmidi_instance_data* data = NULL; - if(mm_backend_instances(BACKEND_NAME, &n, &inst)){ - fprintf(stderr, "Failed to fetch instance list\n"); - return 1; - } - for(u = 0; u < n; u++){ data = (winmidi_instance_data*) inst[u]->impl; free(data->read); @@ -572,7 +566,6 @@ static int winmidi_shutdown(){ } } - free(inst); closesocket(backend_config.socket_pair[0]); closesocket(backend_config.socket_pair[1]); diff --git a/backends/winmidi.h b/backends/winmidi.h index 7907a42..81e7439 100644 --- a/backends/winmidi.h +++ b/backends/winmidi.h @@ -8,7 +8,7 @@ static channel* winmidi_channel(instance* inst, char* spec, uint8_t flags); static int winmidi_set(instance* inst, size_t num, channel** c, channel_value* v); static int winmidi_handle(size_t num, managed_fd* fds); static int winmidi_start(size_t n, instance** inst); -static int winmidi_shutdown(); +static int winmidi_shutdown(size_t n, instance** inst); typedef struct /*_winmidi_instance_data*/ { char* read; diff --git a/config.c b/config.c index 0b9173e..c7e2f7e 100644 --- a/config.c +++ b/config.c @@ -317,6 +317,7 @@ int config_read(char* cfg_filepath){ size_t line_alloc = 0; ssize_t status; map_type mapping_type = map_rtl; + FILE* source = NULL; char* line_raw = NULL, *line, *separator; //create heap copy of file name because original might be in readonly memory @@ -346,7 +347,7 @@ int config_read(char* cfg_filepath){ source_file = source_dir; } - FILE* source = fopen(source_file, "r"); + source = fopen(source_file, "r"); if(!source){ fprintf(stderr, "Failed to open configuration file for reading\n"); diff --git a/midimonster.h b/midimonster.h index bf30e8c..1f5c936 100644 --- a/midimonster.h +++ b/midimonster.h @@ -136,7 +136,7 @@ typedef int (*mmbackend_configure_instance)(struct _backend_instance* instance, typedef int (*mmbackend_process_fd)(size_t nfds, struct _managed_fd* fds); typedef int (*mmbackend_start)(size_t ninstances, struct _backend_instance** inst); typedef uint32_t (*mmbackend_interval)(); -typedef int (*mmbackend_shutdown)(); +typedef int (*mmbackend_shutdown)(size_t ninstances, struct _backend_instance** inst); /* Bit masks for the `flags` parameter to mmbackend_parse_channel */ typedef enum { -- cgit v1.2.3