From bbed9a309ebb8479e5ce2f71ca829ae33e299b6e Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Mon, 1 Dec 2014 20:48:13 +0100 Subject: [PATCH] tsfile: keep valgrind happy (fix memory leaks) --- src/input/mpegts.h | 3 +++ src/input/mpegts/mpegts_mux.c | 2 +- src/input/mpegts/tsfile/tsfile.c | 14 ++++++++------ src/input/mpegts/tsfile/tsfile_mux.c | 10 ++++++++++ src/input/mpegts/tsfile/tsfile_private.h | 2 +- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/input/mpegts.h b/src/input/mpegts.h index abc47ff7..4e66f278 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -739,6 +739,9 @@ mpegts_service_t *mpegts_mux_find_service(mpegts_mux_t *ms, uint16_t sid); (struct type*)mpegts_mux_instance_create0(calloc(1, sizeof(struct type)),\ &type##_class, uuid,\ mi, mm); + +void mpegts_mux_instance_delete ( mpegts_mux_instance_t *mmi ); + int mpegts_mux_instance_start ( mpegts_mux_instance_t **mmiptr ); diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index dbb17f0c..246ae15b 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -41,7 +41,7 @@ const idclass_t mpegts_mux_instance_class = .ic_perm_def = ACCESS_ADMIN }; -static void +void mpegts_mux_instance_delete ( mpegts_mux_instance_t *mmi ) { diff --git a/src/input/mpegts/tsfile/tsfile.c b/src/input/mpegts/tsfile/tsfile.c index 19d1ea99..1cfc4e31 100644 --- a/src/input/mpegts/tsfile/tsfile.c +++ b/src/input/mpegts/tsfile/tsfile.c @@ -27,7 +27,7 @@ * Globals */ pthread_mutex_t tsfile_lock; -mpegts_network_t tsfile_network; +mpegts_network_t *tsfile_network; tsfile_input_list_t tsfile_inputs; extern const idclass_t mpegts_service_class; @@ -70,18 +70,19 @@ void tsfile_init ( int tuners ) pthread_mutex_init(&tsfile_lock, NULL); /* Shared network */ - mpegts_network_create0(&tsfile_network, &mpegts_network_class, NULL, + tsfile_network = calloc(1, sizeof(*tsfile_network)); + mpegts_network_create0(tsfile_network, &mpegts_network_class, NULL, "TSfile Network", NULL); - tsfile_network.mn_create_service = tsfile_network_create_service; + tsfile_network->mn_create_service = tsfile_network_create_service; /* IPTV like setup */ if (tuners <= 0) { mi = tsfile_input_create(0); - mpegts_input_add_network((mpegts_input_t*)mi, &tsfile_network); + mpegts_input_add_network((mpegts_input_t*)mi, tsfile_network); } else { for (i = 0; i < tuners; i++) { mi = tsfile_input_create(i+1); - mpegts_input_add_network((mpegts_input_t*)mi, &tsfile_network); + mpegts_input_add_network((mpegts_input_t*)mi, tsfile_network); } } } @@ -100,6 +101,7 @@ tsfile_done ( void ) mpegts_input_delete((mpegts_input_t*)mi, 0); // doesn't close the pipe! } + mpegts_network_class_delete(&mpegts_network_class, 1); pthread_mutex_unlock(&global_lock); } @@ -125,7 +127,7 @@ void tsfile_add_file ( const char *path ) tvhtrace("tsfile", "add file %s (uuid:%s)", path, uuid); /* Create logical instance */ - mm = tsfile_mux_create(uuid, &tsfile_network); + mm = tsfile_mux_create(uuid, tsfile_network); /* Create physical instance (for each tuner) */ LIST_FOREACH(mi, &tsfile_inputs, tsi_link) diff --git a/src/input/mpegts/tsfile/tsfile_mux.c b/src/input/mpegts/tsfile/tsfile_mux.c index c27a2232..d1451ab4 100644 --- a/src/input/mpegts/tsfile/tsfile_mux.c +++ b/src/input/mpegts/tsfile/tsfile_mux.c @@ -22,6 +22,15 @@ extern const idclass_t mpegts_mux_class; extern const idclass_t mpegts_mux_instance_class; +static void +tsfile_mux_instance_delete( mpegts_mux_instance_t *_mmi ) +{ + tsfile_mux_instance_t *mmi = (tsfile_mux_instance_t *)_mmi; + + free(mmi->mmi_tsfile_path); + mpegts_mux_instance_delete(_mmi); +} + tsfile_mux_instance_t * tsfile_mux_instance_create ( const char *path, mpegts_input_t *mi, mpegts_mux_t *mm ) @@ -32,6 +41,7 @@ tsfile_mux_instance_create #undef tsfile_mux_instance_class mmi->mmi_tsfile_path = strdup(path); mmi->mmi_tsfile_pcr_pid = MPEGTS_PID_NONE; + mmi->mmi_delete = tsfile_mux_instance_delete; tvhtrace("tsfile", "mmi created %p path %s", mmi, mmi->mmi_tsfile_path); return mmi; } diff --git a/src/input/mpegts/tsfile/tsfile_private.h b/src/input/mpegts/tsfile/tsfile_private.h index 739f6a12..57003fb1 100644 --- a/src/input/mpegts/tsfile/tsfile_private.h +++ b/src/input/mpegts/tsfile/tsfile_private.h @@ -32,7 +32,7 @@ typedef LIST_HEAD(,tsfile_input) tsfile_input_list_t; /* * Globals */ -extern mpegts_network_t tsfile_network; +extern mpegts_network_t *tsfile_network; extern tsfile_input_list_t tsfile_inputs; extern pthread_mutex_t tsfile_lock;