From 2bac738cde615274aceba4832211505da1740f41 Mon Sep 17 00:00:00 2001 From: sletz Date: Wed, 27 Aug 2008 10:56:53 +0000 Subject: [PATCH] Fix memory leaks. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2809 0c269be4-1314-0410-8aa9-9f06e86f4224 --- ChangeLog | 1 + common/JackAudioAdapterFactory.cpp | 6 ++- common/JackDriverLoader.cpp | 13 ++++++ common/JackDriverLoader.h | 1 + common/JackNetAdapter.cpp | 4 +- common/JackNetManager.cpp | 4 +- common/JackServerGlobals.cpp | 66 ++++++++++++++++-------------- common/JackTools.cpp | 14 +++++++ common/JackTools.h | 1 + 9 files changed, 76 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0a589a9c..92572ff2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25,6 +25,7 @@ Florian Faber 2008-08-26 Stephane Letz * Better parameter handling in JackCoreAudioAdapter. + * Fix memory leaks. 2008-08-22 Stephane Letz diff --git a/common/JackAudioAdapterFactory.cpp b/common/JackAudioAdapterFactory.cpp index 2f16f8a3..a76d90ac 100644 --- a/common/JackAudioAdapterFactory.cpp +++ b/common/JackAudioAdapterFactory.cpp @@ -66,7 +66,7 @@ extern "C" adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackCoreAudioAdapter(buffer_size, sample_rate, params)); #endif assert(adapter); - + if (adapter->Open() == 0) return 0; else @@ -93,7 +93,9 @@ extern "C" jack_error("Internal client : JackArgParser::ParseParams error."); } - return jack_internal_initialize(jack_client, params); + int res = jack_internal_initialize(jack_client, params); + parser.FreeParams(params); + return res; } EXPORT void jack_finish(void* arg) diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index 4ee3ffde..d9843f46 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -90,6 +90,19 @@ jack_print_driver_param_usage (jack_driver_desc_t * desc, unsigned long param, F fprintf (file, "%s\n", desc->params[param].long_desc); } +EXPORT void jack_free_driver_params(JSList * driver_params) +{ + JSList *node_ptr = driver_params; + JSList *next_node_ptr; + + while (node_ptr) { + next_node_ptr = node_ptr->next; + free(node_ptr->data); + free(node_ptr); + node_ptr = next_node_ptr; + } +} + int jack_parse_driver_params (jack_driver_desc_t * desc, int argc, char* argv[], JSList ** param_ptr) { diff --git a/common/JackDriverLoader.h b/common/JackDriverLoader.h index 22247f73..c1b75b1f 100644 --- a/common/JackDriverLoader.h +++ b/common/JackDriverLoader.h @@ -65,6 +65,7 @@ jack_driver_desc_t * jack_drivers_get_descriptor (JSList * drivers, const char * JSList * jack_drivers_load (JSList * drivers); jack_driver_info_t * jack_load_driver (jack_driver_desc_t * driver_desc); EXPORT int jackctl_parse_driver_params (jackctl_driver * driver_ptr, int argc, char* argv[]); +EXPORT void jack_free_driver_params(JSList * param_ptr); #endif diff --git a/common/JackNetAdapter.cpp b/common/JackNetAdapter.cpp index 27acb937..aae1bf37 100644 --- a/common/JackNetAdapter.cpp +++ b/common/JackNetAdapter.cpp @@ -545,7 +545,9 @@ extern "C" if ( parser.ParseParams ( desc, ¶ms ) != 0 ) jack_error ( "Internal client : JackArgParser::ParseParams error." ); - return jack_internal_initialize ( jack_client, params ); + int res = jack_internal_initialize(jack_client, params); + parser.FreeParams(params); + return res; } EXPORT void jack_finish ( void* arg ) diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index e8908379..db327d24 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -749,7 +749,9 @@ extern "C" jack_error ( "Internal client JackArgParser::ParseParams error." ); } - return jack_internal_initialize ( jack_client, params ); + int res = jack_internal_initialize(jack_client, params); + parser.FreeParams(params); + return res; } EXPORT void jack_finish ( void* arg ) diff --git a/common/JackServerGlobals.cpp b/common/JackServerGlobals.cpp index 3dae068a..163ed2a8 100644 --- a/common/JackServerGlobals.cpp +++ b/common/JackServerGlobals.cpp @@ -79,20 +79,40 @@ bool JackServerGlobals::Init() if (JackServer::fInstance != NULL) return true; + int realtime = 0; + int client_timeout = 0; /* msecs; if zero, use period size. */ + int realtime_priority = 10; + int verbose_aux = 0; + int do_mlock = 1; + unsigned int port_max = 128; + int loopback = 0; + int do_unlock = 0; + int temporary = 0; + + int opt = 0; + int option_index = 0; + int seen_driver = 0; + char *driver_name = NULL; + char **driver_args = NULL; + JSList* driver_params; + int driver_nargs = 1; + JSList* drivers = NULL; + int show_version = 0; + int sync = 0; + int rc, i; + int ret; + + FILE* fp = 0; + char filename[255]; + char buffer[255]; + int argc = 0; + char* argv[32]; + // Otherwise first client starts the server if (fClientCount++ == 0) { jack_log("JackServerGlobals Init"); - int realtime = 0; - int client_timeout = 0; /* msecs; if zero, use period size. */ - int realtime_priority = 10; - int verbose_aux = 0; - int do_mlock = 1; - unsigned int port_max = 128; - int loopback = 0; - int do_unlock = 0; - int temporary = 0; - + jack_driver_desc_t* driver_desc; const char *options = "-ad:P:uvshVRL:STFl:t:mn:p:"; static struct option long_options[] = { @@ -114,25 +134,7 @@ bool JackServerGlobals::Init() { "sync", 0, 0, 'S' }, { 0, 0, 0, 0 } }; - int opt = 0; - int option_index = 0; - int seen_driver = 0; - char *driver_name = NULL; - char **driver_args = NULL; - JSList* driver_params; - int driver_nargs = 1; - JSList* drivers = NULL; - int show_version = 0; - int sync = 0; - int rc, i; - int ret; - - FILE* fp = 0; - char filename[255]; - char buffer[255]; - int argc = 0; - char* argv[32]; - + snprintf(filename, 255, "%s/.jackdrc", getenv("HOME")); fp = fopen(filename, "r"); @@ -305,10 +307,14 @@ bool JackServerGlobals::Init() goto error; } } - + + if (driver_params) + jack_free_driver_params(driver_params); return true; error: + if (driver_params) + jack_free_driver_params(driver_params); fClientCount--; return false; } diff --git a/common/JackTools.cpp b/common/JackTools.cpp index e5fe9a48..213d0d39 100644 --- a/common/JackTools.cpp +++ b/common/JackTools.cpp @@ -22,6 +22,7 @@ #endif #include "JackConstants.h" +#include "JackDriverLoader.h" #include "JackTools.h" #include #include @@ -382,6 +383,19 @@ namespace Jack { return 0; } + + void JackArgParser::FreeParams ( JSList* param_list ) + { + JSList *node_ptr = param_list; + JSList *next_node_ptr; + + while (node_ptr) { + next_node_ptr = node_ptr->next; + free(node_ptr->data); + free(node_ptr); + node_ptr = next_node_ptr; + } + } } diff --git a/common/JackTools.h b/common/JackTools.h index 023a0222..464eada4 100644 --- a/common/JackTools.h +++ b/common/JackTools.h @@ -86,6 +86,7 @@ namespace Jack int GetArgv ( char** argv ); void DeleteArgv ( const char** argv ); int ParseParams ( jack_driver_desc_t* desc, JSList** param_list ); + void FreeParams ( JSList* param_list ); }; /*!