mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-23 02:32:11 +01:00
gdbusconnection: Stop storing sender_unique_name in SignalData
This will become confusing when we start tracking the owner of a well-known-name sender, and it's redundant anyway. Instead, track the 1 bit of data that we actually need: whether it's a well-known name. Strictly speaking this too is redundant, because it's syntactically derivable from the sender, but only via extra string operations. A subsequent commit will add a data structure to keep track of the owner of a well-known-name sender, at which point this boolean will be replaced by the presence or absence of that data structure. Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
parent
d31f0777d1
commit
0bca1891a7
@ -327,19 +327,19 @@ typedef struct
|
|||||||
{
|
{
|
||||||
gchar *rule;
|
gchar *rule;
|
||||||
gchar *sender;
|
gchar *sender;
|
||||||
gchar *sender_unique_name; /* if sender is unique or org.freedesktop.DBus, then that name... otherwise blank */
|
|
||||||
gchar *interface_name;
|
gchar *interface_name;
|
||||||
gchar *member;
|
gchar *member;
|
||||||
gchar *object_path;
|
gchar *object_path;
|
||||||
gchar *arg0;
|
gchar *arg0;
|
||||||
GDBusSignalFlags flags;
|
GDBusSignalFlags flags;
|
||||||
GPtrArray *subscribers; /* (owned) (element-type SignalSubscriber) */
|
GPtrArray *subscribers; /* (owned) (element-type SignalSubscriber) */
|
||||||
|
gboolean sender_is_its_own_owner;
|
||||||
} SignalData;
|
} SignalData;
|
||||||
|
|
||||||
static SignalData *
|
static SignalData *
|
||||||
signal_data_new_take (gchar *rule,
|
signal_data_new_take (gchar *rule,
|
||||||
gchar *sender,
|
gchar *sender,
|
||||||
gchar *sender_unique_name,
|
gboolean sender_is_its_own_owner,
|
||||||
gchar *interface_name,
|
gchar *interface_name,
|
||||||
gchar *member,
|
gchar *member,
|
||||||
gchar *object_path,
|
gchar *object_path,
|
||||||
@ -350,7 +350,7 @@ signal_data_new_take (gchar *rule,
|
|||||||
|
|
||||||
signal_data->rule = rule;
|
signal_data->rule = rule;
|
||||||
signal_data->sender = sender;
|
signal_data->sender = sender;
|
||||||
signal_data->sender_unique_name = sender_unique_name;
|
signal_data->sender_is_its_own_owner = sender_is_its_own_owner;
|
||||||
signal_data->interface_name = interface_name;
|
signal_data->interface_name = interface_name;
|
||||||
signal_data->member = member;
|
signal_data->member = member;
|
||||||
signal_data->object_path = object_path;
|
signal_data->object_path = object_path;
|
||||||
@ -365,7 +365,6 @@ signal_data_free (SignalData *signal_data)
|
|||||||
{
|
{
|
||||||
g_free (signal_data->rule);
|
g_free (signal_data->rule);
|
||||||
g_free (signal_data->sender);
|
g_free (signal_data->sender);
|
||||||
g_free (signal_data->sender_unique_name);
|
|
||||||
g_free (signal_data->interface_name);
|
g_free (signal_data->interface_name);
|
||||||
g_free (signal_data->member);
|
g_free (signal_data->member);
|
||||||
g_free (signal_data->object_path);
|
g_free (signal_data->object_path);
|
||||||
@ -3448,7 +3447,7 @@ remove_match_rule (GDBusConnection *connection,
|
|||||||
static gboolean
|
static gboolean
|
||||||
is_signal_data_for_name_lost_or_acquired (SignalData *signal_data)
|
is_signal_data_for_name_lost_or_acquired (SignalData *signal_data)
|
||||||
{
|
{
|
||||||
return g_strcmp0 (signal_data->sender_unique_name, "org.freedesktop.DBus") == 0 &&
|
return g_strcmp0 (signal_data->sender, "org.freedesktop.DBus") == 0 &&
|
||||||
g_strcmp0 (signal_data->interface_name, "org.freedesktop.DBus") == 0 &&
|
g_strcmp0 (signal_data->interface_name, "org.freedesktop.DBus") == 0 &&
|
||||||
g_strcmp0 (signal_data->object_path, "/org/freedesktop/DBus") == 0 &&
|
g_strcmp0 (signal_data->object_path, "/org/freedesktop/DBus") == 0 &&
|
||||||
(g_strcmp0 (signal_data->member, "NameLost") == 0 ||
|
(g_strcmp0 (signal_data->member, "NameLost") == 0 ||
|
||||||
@ -3460,7 +3459,8 @@ is_signal_data_for_name_lost_or_acquired (SignalData *signal_data)
|
|||||||
/* called in any thread, connection lock is held */
|
/* called in any thread, connection lock is held */
|
||||||
static void
|
static void
|
||||||
add_signal_data (GDBusConnection *connection,
|
add_signal_data (GDBusConnection *connection,
|
||||||
SignalData *signal_data)
|
SignalData *signal_data,
|
||||||
|
const char *sender_unique_name)
|
||||||
{
|
{
|
||||||
GPtrArray *signal_data_array;
|
GPtrArray *signal_data_array;
|
||||||
|
|
||||||
@ -3480,12 +3480,12 @@ add_signal_data (GDBusConnection *connection,
|
|||||||
}
|
}
|
||||||
|
|
||||||
signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
|
signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
|
||||||
signal_data->sender_unique_name);
|
sender_unique_name);
|
||||||
if (signal_data_array == NULL)
|
if (signal_data_array == NULL)
|
||||||
{
|
{
|
||||||
signal_data_array = g_ptr_array_new ();
|
signal_data_array = g_ptr_array_new ();
|
||||||
g_hash_table_insert (connection->map_sender_unique_name_to_signal_data_array,
|
g_hash_table_insert (connection->map_sender_unique_name_to_signal_data_array,
|
||||||
g_strdup (signal_data->sender_unique_name),
|
g_strdup (sender_unique_name),
|
||||||
signal_data_array);
|
signal_data_array);
|
||||||
}
|
}
|
||||||
g_ptr_array_add (signal_data_array, signal_data);
|
g_ptr_array_add (signal_data_array, signal_data);
|
||||||
@ -3582,6 +3582,7 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
|
|||||||
gchar *rule;
|
gchar *rule;
|
||||||
SignalData *signal_data;
|
SignalData *signal_data;
|
||||||
SignalSubscriber *subscriber;
|
SignalSubscriber *subscriber;
|
||||||
|
gboolean sender_is_its_own_owner;
|
||||||
const gchar *sender_unique_name;
|
const gchar *sender_unique_name;
|
||||||
|
|
||||||
/* Right now we abort if AddMatch() fails since it can only fail with the bus being in
|
/* Right now we abort if AddMatch() fails since it can only fail with the bus being in
|
||||||
@ -3617,6 +3618,11 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
|
|||||||
rule = args_to_rule (sender, interface_name, member, object_path, arg0, flags);
|
rule = args_to_rule (sender, interface_name, member, object_path, arg0, flags);
|
||||||
|
|
||||||
if (sender != NULL && (g_dbus_is_unique_name (sender) || g_strcmp0 (sender, "org.freedesktop.DBus") == 0))
|
if (sender != NULL && (g_dbus_is_unique_name (sender) || g_strcmp0 (sender, "org.freedesktop.DBus") == 0))
|
||||||
|
sender_is_its_own_owner = TRUE;
|
||||||
|
else
|
||||||
|
sender_is_its_own_owner = FALSE;
|
||||||
|
|
||||||
|
if (sender_is_its_own_owner)
|
||||||
sender_unique_name = sender;
|
sender_unique_name = sender;
|
||||||
else
|
else
|
||||||
sender_unique_name = "";
|
sender_unique_name = "";
|
||||||
@ -3640,14 +3646,14 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
|
|||||||
|
|
||||||
signal_data = signal_data_new_take (g_steal_pointer (&rule),
|
signal_data = signal_data_new_take (g_steal_pointer (&rule),
|
||||||
g_strdup (sender),
|
g_strdup (sender),
|
||||||
g_strdup (sender_unique_name),
|
sender_is_its_own_owner,
|
||||||
g_strdup (interface_name),
|
g_strdup (interface_name),
|
||||||
g_strdup (member),
|
g_strdup (member),
|
||||||
g_strdup (object_path),
|
g_strdup (object_path),
|
||||||
g_strdup (arg0),
|
g_strdup (arg0),
|
||||||
flags);
|
flags);
|
||||||
g_ptr_array_add (signal_data->subscribers, subscriber);
|
g_ptr_array_add (signal_data->subscribers, subscriber);
|
||||||
add_signal_data (connection, signal_data);
|
add_signal_data (connection, signal_data, sender_unique_name);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
g_hash_table_insert (connection->map_id_to_signal_data,
|
g_hash_table_insert (connection->map_id_to_signal_data,
|
||||||
@ -3671,22 +3677,28 @@ static void
|
|||||||
remove_signal_data_if_unused (GDBusConnection *connection,
|
remove_signal_data_if_unused (GDBusConnection *connection,
|
||||||
SignalData *signal_data)
|
SignalData *signal_data)
|
||||||
{
|
{
|
||||||
|
const gchar *sender_unique_name;
|
||||||
GPtrArray *signal_data_array;
|
GPtrArray *signal_data_array;
|
||||||
|
|
||||||
if (signal_data->subscribers->len != 0)
|
if (signal_data->subscribers->len != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (signal_data->sender_is_its_own_owner)
|
||||||
|
sender_unique_name = signal_data->sender;
|
||||||
|
else
|
||||||
|
sender_unique_name = "";
|
||||||
|
|
||||||
g_warn_if_fail (g_hash_table_remove (connection->map_rule_to_signal_data, signal_data->rule));
|
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,
|
signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
|
||||||
signal_data->sender_unique_name);
|
sender_unique_name);
|
||||||
g_warn_if_fail (signal_data_array != NULL);
|
g_warn_if_fail (signal_data_array != NULL);
|
||||||
g_warn_if_fail (g_ptr_array_remove (signal_data_array, signal_data));
|
g_warn_if_fail (g_ptr_array_remove (signal_data_array, signal_data));
|
||||||
|
|
||||||
if (signal_data_array->len == 0)
|
if (signal_data_array->len == 0)
|
||||||
{
|
{
|
||||||
g_warn_if_fail (g_hash_table_remove (connection->map_sender_unique_name_to_signal_data_array,
|
g_warn_if_fail (g_hash_table_remove (connection->map_sender_unique_name_to_signal_data_array,
|
||||||
signal_data->sender_unique_name));
|
sender_unique_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove the match rule from the bus unless NameLost or NameAcquired (see subscribe()) */
|
/* remove the match rule from the bus unless NameLost or NameAcquired (see subscribe()) */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user