mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 01:36:17 +01:00
gdbusconnection: Factor out remove_signal_data_if_unused
No functional change, just removing some nesting. The check for whether signal_data->subscribers is empty changes from a conditional that tests whether it is into an early-return if it isn't. A subsequent commit will add additional conditions that make us consider a SignalData to be still in use and therefore not eligible to be removed. Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
parent
5d7ad6897c
commit
7d21b719ed
@ -3660,44 +3660,21 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* called in any thread */
|
||||
/* must hold lock when calling this (except if connection->finalizing is TRUE)
|
||||
* returns the number of removed subscribers */
|
||||
static guint
|
||||
unsubscribe_id_internal (GDBusConnection *connection,
|
||||
guint subscription_id)
|
||||
/*
|
||||
* Called in any thread.
|
||||
* Must hold the connection lock when calling this, unless
|
||||
* connection->finalizing is TRUE.
|
||||
* May free signal_data, so do not dereference it after this.
|
||||
*/
|
||||
static void
|
||||
remove_signal_data_if_unused (GDBusConnection *connection,
|
||||
SignalData *signal_data)
|
||||
{
|
||||
SignalData *signal_data;
|
||||
GPtrArray *signal_data_array;
|
||||
guint n;
|
||||
guint n_removed = 0;
|
||||
|
||||
signal_data = g_hash_table_lookup (connection->map_id_to_signal_data,
|
||||
GUINT_TO_POINTER (subscription_id));
|
||||
if (signal_data == NULL)
|
||||
{
|
||||
/* Don't warn here, we may have thrown all subscriptions out when the connection was closed */
|
||||
goto out;
|
||||
}
|
||||
if (signal_data->subscribers->len != 0)
|
||||
return;
|
||||
|
||||
for (n = 0; n < signal_data->subscribers->len; n++)
|
||||
{
|
||||
SignalSubscriber *subscriber = signal_data->subscribers->pdata[n];
|
||||
|
||||
if (subscriber->id != subscription_id)
|
||||
continue;
|
||||
|
||||
/* It’s OK to rearrange the array order using the ‘fast’ #GPtrArray
|
||||
* removal functions, since we’re going to exit the loop below anyway — we
|
||||
* never move on to the next element. Secondly, subscription IDs are
|
||||
* guaranteed to be unique. */
|
||||
g_warn_if_fail (g_hash_table_remove (connection->map_id_to_signal_data,
|
||||
GUINT_TO_POINTER (subscription_id)));
|
||||
n_removed++;
|
||||
g_ptr_array_remove_index_fast (signal_data->subscribers, n);
|
||||
|
||||
if (signal_data->subscribers->len == 0)
|
||||
{
|
||||
g_warn_if_fail (g_hash_table_remove (connection->map_rule_to_signal_data, signal_data->rule));
|
||||
|
||||
signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
|
||||
@ -3727,8 +3704,44 @@ unsubscribe_id_internal (GDBusConnection *connection,
|
||||
}
|
||||
|
||||
signal_data_free (signal_data);
|
||||
}
|
||||
|
||||
/* called in any thread */
|
||||
/* must hold lock when calling this (except if connection->finalizing is TRUE)
|
||||
* returns the number of removed subscribers */
|
||||
static guint
|
||||
unsubscribe_id_internal (GDBusConnection *connection,
|
||||
guint subscription_id)
|
||||
{
|
||||
SignalData *signal_data;
|
||||
guint n;
|
||||
guint n_removed = 0;
|
||||
|
||||
signal_data = g_hash_table_lookup (connection->map_id_to_signal_data,
|
||||
GUINT_TO_POINTER (subscription_id));
|
||||
if (signal_data == NULL)
|
||||
{
|
||||
/* Don't warn here, we may have thrown all subscriptions out when the connection was closed */
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (n = 0; n < signal_data->subscribers->len; n++)
|
||||
{
|
||||
SignalSubscriber *subscriber = signal_data->subscribers->pdata[n];
|
||||
|
||||
if (subscriber->id != subscription_id)
|
||||
continue;
|
||||
|
||||
/* It’s OK to rearrange the array order using the ‘fast’ #GPtrArray
|
||||
* removal functions, since we’re going to exit the loop below anyway — we
|
||||
* never move on to the next element. Secondly, subscription IDs are
|
||||
* guaranteed to be unique. */
|
||||
g_warn_if_fail (g_hash_table_remove (connection->map_id_to_signal_data,
|
||||
GUINT_TO_POINTER (subscription_id)));
|
||||
n_removed++;
|
||||
g_ptr_array_remove_index_fast (signal_data->subscribers, n);
|
||||
/* May free signal_data */
|
||||
remove_signal_data_if_unused (connection, signal_data);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user