Browse Source

Dbus control module: release linked-list elements

Fixes a memory leak where elements in the linked list of events where
never released, due to the release function being always called at the
end of the traversal instead of every iteration.
pull/143/head
Jorge Bellon-Castro 4 years ago
committed by Steve Lhomme
parent
commit
fe7f7949c4
  1. 4
      modules/control/dbus/dbus.c
  2. 14
      modules/control/dbus/dbus_tracklist.c

4
modules/control/dbus/dbus.c

@ -673,8 +673,10 @@ static void ProcessEvents( intf_thread_t *p_intf,
vlc_dictionary_insert( &player_properties, "Metadata", NULL );
break;
case SIGNAL_PLAYLIST_ITEM_APPEND:
if ( !last_append ) {
last_append = vlc_dictionary_value_for_key( &tracklist_properties, "TrackAdded" );
}
if( !last_append ) {
assert (!vlc_dictionary_has_key( &tracklist_properties, "TrackAdded" ) );
vlc_dictionary_insert( &tracklist_properties, "TrackAdded", p_events[i]->items_appended );
last_append = p_events[i]->items_appended;

14
modules/control/dbus/dbus_tracklist.c

@ -613,29 +613,31 @@ int TrackListPropertiesChangedEmit( intf_thread_t * p_intf,
tracklist_append_event_t *added_tracks =
vlc_dictionary_value_for_key( p_changed_properties, "TrackAdded" );
while (added_tracks) {
while ( added_tracks ) {
for (size_t i = 0; i < added_tracks->change_ev.count; ++i) {
TrackAddedSignal( p_intf,
added_tracks->change_ev.index + i,
added_tracks->items[i] );
}
added_tracks = tracklist_append_event_next(added_tracks);
tracklist_append_event_t *next = tracklist_append_event_next( added_tracks );
tracklist_append_event_destroy( added_tracks );
added_tracks = next;
}
tracklist_append_event_destroy( added_tracks );
}
if( vlc_dictionary_has_key( p_changed_properties, "TrackRemoved" ) ) {
tracklist_remove_event_t *removed_tracks =
vlc_dictionary_value_for_key( p_changed_properties, "TrackRemoved" );
while (removed_tracks) {
while ( removed_tracks ) {
for (size_t i = 0; i < removed_tracks->change_ev.count; ++i) {
TrackRemovedSignal( p_intf, removed_tracks->change_ev.index + i );
}
removed_tracks = tracklist_remove_event_next(removed_tracks);
tracklist_remove_event_t *next = tracklist_remove_event_next( removed_tracks );
tracklist_remove_event_destroy( removed_tracks );
removed_tracks = next;
}
tracklist_remove_event_destroy( removed_tracks );
}
return VLC_SUCCESS;

Loading…
Cancel
Save