Add and use _dbus_list_clear_full

In gcc 8, -Wall -Wextra includes -Wcast-function-type, which warns
about passing an extra (unwanted) parameter to callbacks. Instead
of using _dbus_list_foreach(), add a function to do what we actually
wanted here.

Signed-off-by: Simon McVittie <smcv@collabora.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=107349
Reviewed-by: Thiago Macieira <thiago@kde.org>
This commit is contained in:
Simon McVittie 2018-07-23 17:33:24 +01:00
parent 7efc06293a
commit 46cdc12830
11 changed files with 62 additions and 81 deletions

View file

@ -914,9 +914,8 @@ bus_activation_reload (BusActivation *activation,
goto failed;
}
_dbus_list_foreach (&activation->directories,
(DBusForeachFunction) bus_service_directory_unref, NULL);
_dbus_list_clear (&activation->directories);
_dbus_list_clear_full (&activation->directories,
(DBusFreeFunction) bus_service_directory_unref);
link = _dbus_list_get_first_link (directories);
while (link != NULL)
@ -1063,9 +1062,8 @@ bus_activation_unref (BusActivation *activation)
if (activation->pending_activations)
_dbus_hash_table_unref (activation->pending_activations);
_dbus_list_foreach (&activation->directories,
(DBusForeachFunction) bus_service_directory_unref, NULL);
_dbus_list_clear (&activation->directories);
_dbus_list_clear_full (&activation->directories,
(DBusFreeFunction) bus_service_directory_unref);
if (activation->environment)
_dbus_hash_table_unref (activation->environment);

View file

@ -122,13 +122,7 @@ bus_config_parser_unref (BusConfigParser *parser)
_dbus_string_free (&parser->user);
_dbus_string_free (&parser->service_helper);
_dbus_string_free (&parser->bus_type);
_dbus_list_foreach (&parser->service_dirs,
(DBusForeachFunction) dbus_free,
NULL);
_dbus_list_clear (&parser->service_dirs);
_dbus_list_clear_full (&parser->service_dirs, dbus_free);
dbus_free (parser);
}

View file

@ -585,31 +585,13 @@ bus_config_parser_unref (BusConfigParser *parser)
dbus_free (parser->servicehelper);
dbus_free (parser->bus_type);
dbus_free (parser->pidfile);
_dbus_list_foreach (&parser->listen_on,
(DBusForeachFunction) dbus_free,
NULL);
_dbus_list_clear (&parser->listen_on);
_dbus_list_clear_full (&parser->listen_on, dbus_free);
_dbus_list_clear_full (&parser->service_dirs,
(DBusFreeFunction) bus_config_service_dir_free);
_dbus_list_clear_full (&parser->conf_dirs, dbus_free);
_dbus_list_clear_full (&parser->mechanisms, dbus_free);
_dbus_list_foreach (&parser->service_dirs,
(DBusForeachFunction) bus_config_service_dir_free,
NULL);
_dbus_list_clear (&parser->service_dirs);
_dbus_list_foreach (&parser->conf_dirs,
(DBusForeachFunction) dbus_free,
NULL);
_dbus_list_clear (&parser->conf_dirs);
_dbus_list_foreach (&parser->mechanisms,
(DBusForeachFunction) dbus_free,
NULL);
_dbus_list_clear (&parser->mechanisms);
_dbus_string_free (&parser->basedir);
if (parser->policy)
@ -929,9 +911,7 @@ start_busconfig_child (BusConfigParser *parser,
BUS_SERVICE_DIR_FLAGS_STRICT_NAMING))
{
BUS_SET_OOM (error);
_dbus_list_foreach (&dirs, (DBusForeachFunction) dbus_free,
NULL);
_dbus_list_clear (&dirs);
_dbus_list_clear_full (&dirs, dbus_free);
return FALSE;
}
}
@ -958,9 +938,7 @@ start_busconfig_child (BusConfigParser *parser,
BUS_SERVICE_DIR_FLAGS_NONE))
{
BUS_SET_OOM (error);
_dbus_list_foreach (&dirs, (DBusForeachFunction) dbus_free,
NULL);
_dbus_list_clear (&dirs);
_dbus_list_clear_full (&dirs, dbus_free);
return FALSE;
}
@ -996,9 +974,7 @@ start_busconfig_child (BusConfigParser *parser,
BUS_SERVICE_DIR_FLAGS_NONE))
{
BUS_SET_OOM (error);
_dbus_list_foreach (&dirs, (DBusForeachFunction) dbus_free,
NULL);
_dbus_list_clear (&dirs);
_dbus_list_clear_full (&dirs, dbus_free);
return FALSE;
}

View file

@ -2760,16 +2760,14 @@ _dbus_connection_last_unref (DBusConnection *connection)
_dbus_hash_table_unref (connection->pending_replies);
connection->pending_replies = NULL;
_dbus_list_foreach (&connection->outgoing_messages,
free_outgoing_message,
connection);
_dbus_list_clear (&connection->outgoing_messages);
_dbus_list_foreach (&connection->incoming_messages,
(DBusForeachFunction) dbus_message_unref,
NULL);
_dbus_list_clear (&connection->incoming_messages);
_dbus_list_clear_full (&connection->incoming_messages,
(DBusFreeFunction) dbus_message_unref);
_dbus_counter_unref (connection->outgoing_counter);
@ -4709,11 +4707,9 @@ dbus_connection_dispatch (DBusConnection *connection)
link = next;
}
_dbus_list_foreach (&filter_list_copy,
(DBusForeachFunction)_dbus_message_filter_unref,
NULL);
_dbus_list_clear (&filter_list_copy);
_dbus_list_clear_full (&filter_list_copy,
(DBusFreeFunction) _dbus_message_filter_unref);
CONNECTION_LOCK (connection);
if (result == DBUS_HANDLER_RESULT_NEED_MEMORY)

View file

@ -557,6 +557,33 @@ _dbus_list_clear (DBusList **list)
*list = NULL;
}
/**
* Free every link and every element in the list.
*
* @param list address of the head of the list.
* @param function free-function to call for each element.
*
*/
void
_dbus_list_clear_full (DBusList **list,
DBusFreeFunction function)
{
DBusList *link;
link = *list;
while (link != NULL)
{
DBusList *next = _dbus_list_get_next_link (list, link);
function (link->data);
free_link (link);
link = next;
}
*list = NULL;
}
/**
* Gets the first link in the list.
* This is a constant-time operation.

View file

@ -73,6 +73,9 @@ DBusList* _dbus_list_find_last (DBusList **list,
DBUS_PRIVATE_EXPORT
void _dbus_list_clear (DBusList **list);
DBUS_PRIVATE_EXPORT
void _dbus_list_clear_full (DBusList **list,
DBusFreeFunction function);
DBUS_PRIVATE_EXPORT
DBusList* _dbus_list_get_first_link (DBusList **list);
DBUS_PRIVATE_EXPORT
DBusList* _dbus_list_get_last_link (DBusList **list);

View file

@ -4218,10 +4218,8 @@ _dbus_message_loader_unref (DBusMessageLoader *loader)
close_unix_fds(loader->unix_fds, &loader->n_unix_fds);
dbus_free(loader->unix_fds);
#endif
_dbus_list_foreach (&loader->messages,
(DBusForeachFunction) dbus_message_unref,
NULL);
_dbus_list_clear (&loader->messages);
_dbus_list_clear_full (&loader->messages,
(DBusFreeFunction) dbus_message_unref);
_dbus_string_free (&loader->data);
dbus_free (loader);
}

View file

@ -523,12 +523,7 @@ tokenize_command_line (const char *command_line, DBusError *error)
_dbus_string_free (&current_token);
init_error:
if (retval)
{
_dbus_list_foreach (&retval, (DBusForeachFunction) dbus_free, NULL);
_dbus_list_clear (&retval);
}
_dbus_list_clear_full (&retval, dbus_free);
return NULL;
}
@ -618,9 +613,8 @@ _dbus_shell_parse_argv (const char *command_line,
++i;
}
argv[argc] = NULL;
_dbus_list_foreach (&tokens, (DBusForeachFunction) dbus_free, NULL);
_dbus_list_clear (&tokens);
_dbus_list_clear_full (&tokens, dbus_free);
if (argcp)
*argcp = argc;
@ -633,8 +627,7 @@ _dbus_shell_parse_argv (const char *command_line,
return TRUE;
error:
_dbus_list_foreach (&tokens, (DBusForeachFunction) dbus_free, NULL);
_dbus_list_clear (&tokens);
_dbus_list_clear_full (&tokens, dbus_free);
return FALSE;

View file

@ -341,8 +341,7 @@ _dbus_split_paths_and_append (DBusString *dirs,
return TRUE;
oom:
_dbus_list_foreach (dir_list, (DBusForeachFunction)dbus_free, NULL);
_dbus_list_clear (dir_list);
_dbus_list_clear_full (dir_list, dbus_free);
return FALSE;
}

View file

@ -218,10 +218,8 @@ _dbus_timeout_list_free (DBusTimeoutList *timeout_list)
_dbus_timeout_list_set_functions (timeout_list,
NULL, NULL, NULL, NULL, NULL);
_dbus_list_foreach (&timeout_list->timeouts,
(DBusForeachFunction) _dbus_timeout_unref,
NULL);
_dbus_list_clear (&timeout_list->timeouts);
_dbus_list_clear_full (&timeout_list->timeouts,
(DBusFreeFunction) _dbus_timeout_unref);
dbus_free (timeout_list);
}

View file

@ -251,10 +251,9 @@ _dbus_watch_list_free (DBusWatchList *watch_list)
/* free watch_data and removes watches as a side effect */
_dbus_watch_list_set_functions (watch_list,
NULL, NULL, NULL, NULL, NULL);
_dbus_list_foreach (&watch_list->watches,
(DBusForeachFunction) _dbus_watch_unref,
NULL);
_dbus_list_clear (&watch_list->watches);
_dbus_list_clear_full (&watch_list->watches,
(DBusFreeFunction) _dbus_watch_unref);
dbus_free (watch_list);
}