# HG changeset patch # User Jussi Judin # Date 1198565613 21600 # Node ID 2d6fd3f630f070e13b0f59fe318e9094b1c757ad # Parent dfe5d686749e2fdc11439d35aad6c18dce9fb173 Adds playback_free() function to fix memory leak in playback_stop(). (Bugzilla #42) diff -r dfe5d686749e -r 2d6fd3f630f0 src/audacious/playback.c --- a/src/audacious/playback.c Tue Dec 25 00:46:07 2007 -0600 +++ b/src/audacious/playback.c Tue Dec 25 00:53:33 2007 -0600 @@ -311,13 +311,7 @@ free_vis_data(); ip_data.paused = FALSE; - if (playback->pb_ready_mutex) - g_mutex_free(playback->pb_ready_mutex); - if (playback->pb_ready_cond) - g_cond_free(playback->pb_ready_cond); - - g_free(playback->filename); - g_slice_free(InputPlayback, playback); + playback_free(playback); set_current_input_playback(NULL); #ifdef USE_DBUS mpris_emit_status_change(mpris, MPRIS_STATUS_STOP); @@ -396,6 +390,27 @@ return playback; } +/** + * Destroys InputPlayback. + * + * Playback comes from playback_new() function but there can be also + * other sources for allocated playback data (like filename and title) + * and this tries to deallocate all that data. + */ +void playback_free(InputPlayback *playback) +{ + g_free(playback->filename); + g_free(playback->title); + + g_mutex_free(playback->pb_ready_mutex); + g_cond_free(playback->pb_ready_cond); + + g_mutex_free(playback->pb_change_mutex); + g_cond_free(playback->pb_change_cond); + + g_slice_free(InputPlayback, playback); +} + void playback_run(InputPlayback *playback) { diff -r dfe5d686749e -r 2d6fd3f630f0 src/audacious/playback.h --- a/src/audacious/playback.h Tue Dec 25 00:46:07 2007 -0600 +++ b/src/audacious/playback.h Tue Dec 25 00:53:33 2007 -0600 @@ -41,6 +41,7 @@ void playback_eof(void); void playback_error(void); InputPlayback *playback_new(void); +void playback_free(InputPlayback *); void playback_run(InputPlayback *); #endif diff -r dfe5d686749e -r 2d6fd3f630f0 src/audacious/plugin.h --- a/src/audacious/plugin.h Tue Dec 25 00:46:07 2007 -0600 +++ b/src/audacious/plugin.h Tue Dec 25 00:53:33 2007 -0600 @@ -565,6 +565,7 @@ /* InputPlayback */ InputPlayback *(*playback_new)(void); + void (*playback_free)(InputPlayback *); void (*playback_run)(InputPlayback *); /* Flows */ @@ -911,7 +912,7 @@ #define aud_playback_new _audvt->playback_new #define aud_playback_run _audvt->playback_run -#define aud_playback_free(x) g_slice_free(InputPlayback, (x)) +#define aud_playback_free(x) _audvt->playback_free #define aud_flow_execute _audvt->flow_execute #define aud_flow_new _audvt->flow_new