[glib] GDBusMessage: fast-path encoding of fixed arrays
- From: Ryan Lortie <desrt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] GDBusMessage: fast-path encoding of fixed arrays
- Date: Wed, 9 Jul 2014 14:43:38 +0000 (UTC)
commit 958da1e9dc82fbb91862501226b8928faf2f9558
Author: Ryan Lortie <desrt desrt ca>
Date: Fri Jul 4 18:42:14 2014 -0400
GDBusMessage: fast-path encoding of fixed arrays
Instead of handling each item separately, handle the array as a whole.
https://bugzilla.gnome.org/show_bug.cgi?id=732754
gio/gdbusmessage.c | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletions(-)
---
diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c
index b41f649..50105e8 100644
--- a/gio/gdbusmessage.c
+++ b/gio/gdbusmessage.c
@@ -2283,12 +2283,14 @@ append_value_to_blob (GVariant *value,
case 'a': /* G_VARIANT_TYPE_ARRAY */
{
+ const GVariantType *element_type;
GVariant *item;
GVariantIter iter;
goffset array_len_offset;
goffset array_payload_begin_offset;
goffset cur_offset;
gsize array_len;
+ guint fixed_size;
padding_added = ensure_output_padding (mbuf, 4);
if (value != NULL)
@@ -2312,17 +2314,34 @@ append_value_to_blob (GVariant *value,
*/
array_payload_begin_offset = mbuf->valid_len;
+ element_type = g_variant_type_element (type);
+ fixed_size = get_type_fixed_size (element_type);
+
if (g_variant_n_children (value) == 0)
{
gsize padding_added_for_item;
if (!append_value_to_blob (NULL,
- g_variant_type_element (type),
+ element_type,
mbuf,
&padding_added_for_item,
error))
goto fail;
array_payload_begin_offset += padding_added_for_item;
}
+ else if (fixed_size != 0)
+ {
+ GVariant *use_value;
+
+ if (g_memory_buffer_is_byteswapped (mbuf))
+ use_value = g_variant_byteswap (value);
+ else
+ use_value = g_variant_ref (value);
+
+ ensure_output_padding (mbuf, fixed_size);
+ array_len = g_variant_get_size (use_value);
+ g_memory_buffer_write (mbuf, g_variant_get_data (use_value), array_len);
+ g_variant_unref (use_value);
+ }
else
{
guint n;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]