Use stack-allocated GVariantBuilders

This saves a few allocations.
Also simplify the code a bit in gdbusconnection.

Bug #618616.
This commit is contained in:
Christian Persch
2010-05-14 14:00:24 +02:00
parent 41b3f6885d
commit c7f0f2c437
2 changed files with 21 additions and 28 deletions

View File

@@ -3380,9 +3380,7 @@ static gboolean
invoke_get_all_properties_in_idle_cb (gpointer _data) invoke_get_all_properties_in_idle_cb (gpointer _data)
{ {
PropertyGetAllData *data = _data; PropertyGetAllData *data = _data;
GVariantBuilder *builder; GVariantBuilder builder;
GVariant *packed;
GVariant *result;
GError *error; GError *error;
GDBusMessage *reply; GDBusMessage *reply;
guint n; guint n;
@@ -3395,7 +3393,8 @@ invoke_get_all_properties_in_idle_cb (gpointer _data)
* We could fail the whole call if just a single get_property() call * We could fail the whole call if just a single get_property() call
* returns an error. We need clarification in the D-Bus spec about this. * returns an error. We need clarification in the D-Bus spec about this.
*/ */
builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); g_variant_builder_init (&builder, G_VARIANT_TYPE ("(a{sv})"));
g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{sv}"));
for (n = 0; data->interface_info->properties != NULL && data->interface_info->properties[n] != NULL; n++) for (n = 0; data->interface_info->properties != NULL && data->interface_info->properties[n] != NULL; n++)
{ {
const GDBusPropertyInfo *property_info = data->interface_info->properties[n]; const GDBusPropertyInfo *property_info = data->interface_info->properties[n];
@@ -3415,21 +3414,15 @@ invoke_get_all_properties_in_idle_cb (gpointer _data)
if (value == NULL) if (value == NULL)
continue; continue;
g_variant_ref_sink (value); g_variant_builder_add (&builder,
g_variant_builder_add (builder,
"{sv}", "{sv}",
property_info->name, property_info->name,
value); value);
g_variant_unref (value);
} }
result = g_variant_builder_end (builder); g_variant_builder_close (&builder);
builder = g_variant_builder_new (G_VARIANT_TYPE_TUPLE);
g_variant_builder_add_value (builder, result); /* steals result since result is floating */
packed = g_variant_builder_end (builder);
reply = g_dbus_message_new_method_reply (data->message); reply = g_dbus_message_new_method_reply (data->message);
g_dbus_message_set_body (reply, packed); g_dbus_message_set_body (reply, g_variant_builder_end (&builder));
g_dbus_connection_send_message (data->connection, reply, NULL, NULL); g_dbus_connection_send_message (data->connection, reply, NULL, NULL);
g_object_unref (reply); g_object_unref (reply);

View File

@@ -965,7 +965,7 @@ parse_value_from_blob (GMemoryInputStream *mis,
goffset offset; goffset offset;
goffset target; goffset target;
const GVariantType *element_type; const GVariantType *element_type;
GVariantBuilder *builder; GVariantBuilder builder;
if (!ensure_input_padding (mis, 4, &local_error)) if (!ensure_input_padding (mis, 4, &local_error))
goto fail; goto fail;
@@ -981,7 +981,7 @@ parse_value_from_blob (GMemoryInputStream *mis,
goto fail; goto fail;
} }
builder = g_variant_builder_new (type); g_variant_builder_init (&builder, type);
element_type = g_variant_type_element (type); element_type = g_variant_type_element (type);
if (array_len == 0) if (array_len == 0)
@@ -1009,21 +1009,21 @@ parse_value_from_blob (GMemoryInputStream *mis,
&local_error); &local_error);
if (item == NULL) if (item == NULL)
{ {
g_variant_builder_unref (builder); g_variant_builder_clear (&builder);
goto fail; goto fail;
} }
g_variant_builder_add_value (builder, item); g_variant_builder_add_value (&builder, item);
offset = g_seekable_tell (G_SEEKABLE (mis)); offset = g_seekable_tell (G_SEEKABLE (mis));
} }
} }
if (!just_align) if (!just_align)
{ {
ret = g_variant_builder_end (builder); ret = g_variant_builder_end (&builder);
} }
else else
{ {
g_variant_builder_unref (builder); g_variant_builder_clear (&builder);
} }
} }
else if (g_variant_type_is_dict_entry (type)) else if (g_variant_type_is_dict_entry (type))
@@ -1069,9 +1069,9 @@ parse_value_from_blob (GMemoryInputStream *mis,
if (!just_align) if (!just_align)
{ {
const GVariantType *element_type; const GVariantType *element_type;
GVariantBuilder *builder; GVariantBuilder builder;
builder = g_variant_builder_new (type); g_variant_builder_init (&builder, type);
element_type = g_variant_type_first (type); element_type = g_variant_type_first (type);
while (element_type != NULL) while (element_type != NULL)
{ {
@@ -1083,14 +1083,14 @@ parse_value_from_blob (GMemoryInputStream *mis,
&local_error); &local_error);
if (item == NULL) if (item == NULL)
{ {
g_variant_builder_unref (builder); g_variant_builder_clear (&builder);
goto fail; goto fail;
} }
g_variant_builder_add_value (builder, item); g_variant_builder_add_value (&builder, item);
element_type = g_variant_type_next (element_type); element_type = g_variant_type_next (element_type);
} }
ret = g_variant_builder_end (builder); ret = g_variant_builder_end (&builder);
} }
} }
else if (g_variant_type_is_variant (type)) else if (g_variant_type_is_variant (type))
@@ -1774,7 +1774,7 @@ g_dbus_message_to_blob (GDBusMessage *message,
goffset body_start_offset; goffset body_start_offset;
gsize body_size; gsize body_size;
GVariant *header_fields; GVariant *header_fields;
GVariantBuilder *builder; GVariantBuilder builder;
GHashTableIter hash_iter; GHashTableIter hash_iter;
gpointer key; gpointer key;
GVariant *header_value; GVariant *header_value;
@@ -1826,16 +1826,16 @@ g_dbus_message_to_blob (GDBusMessage *message,
goto out; goto out;
} }
builder = g_variant_builder_new (G_VARIANT_TYPE ("a{yv}"));//G_VARIANT_TYPE_ARRAY); g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{yv}"));
g_hash_table_iter_init (&hash_iter, message->priv->headers); g_hash_table_iter_init (&hash_iter, message->priv->headers);
while (g_hash_table_iter_next (&hash_iter, &key, (gpointer) &header_value)) while (g_hash_table_iter_next (&hash_iter, &key, (gpointer) &header_value))
{ {
g_variant_builder_add (builder, g_variant_builder_add (&builder,
"{yv}", "{yv}",
(guchar) GPOINTER_TO_UINT (key), (guchar) GPOINTER_TO_UINT (key),
header_value); header_value);
} }
header_fields = g_variant_new ("a{yv}", builder); header_fields = g_variant_builder_end (&builder);
if (!append_value_to_blob (header_fields, if (!append_value_to_blob (header_fields,
g_variant_get_type (header_fields), g_variant_get_type (header_fields),