2003-02-27 Havoc Pennington <hp@pobox.com>
+ * dbus/dbus-connection.c
+ (dbus_connection_send_message_with_reply_and_block): fix doh!
+ doh! doh! bug that resulted in never removing a reply from the
+ queue, no wonder we called get_reply_serial so much ;-)
+
+ * dbus/dbus-message.c (struct DBusMessage): cache reply serial
+ and client serial instead of demarshaling them every time
+
+2003-02-27 Havoc Pennington <hp@pobox.com>
+
* dbus/dbus-marshal.c (_dbus_demarshal_int32): rewrite to be much
more inlined, using dbus-string-private.h, speeds things up
substantially
HeaderField header_fields[FIELD_LAST]; /**< Track the location
* of each field in "header"
*/
+
+ dbus_int32_t client_serial; /**< Cached client serial value for speed */
+ dbus_int32_t reply_serial; /**< Cached reply serial value for speed */
+
int header_padding; /**< bytes of alignment in header */
DBusString body; /**< Body network data. */
{
_dbus_assert (!message->locked);
_dbus_assert (_dbus_message_get_client_serial (message) < 0);
-
+
set_int_field (message, FIELD_CLIENT_SERIAL,
client_serial);
+ message->client_serial = client_serial;
}
/**
{
_dbus_assert (!message->locked);
- return set_int_field (message, FIELD_REPLY_SERIAL,
- reply_serial);
+ if (set_int_field (message, FIELD_REPLY_SERIAL,
+ reply_serial))
+ {
+ message->reply_serial = reply_serial;
+ return TRUE;
+ }
+ else
+ return FALSE;
}
/**
dbus_int32_t
_dbus_message_get_client_serial (DBusMessage *message)
{
- return get_int_field (message, FIELD_CLIENT_SERIAL);
+ return message->client_serial;
}
/**
dbus_int32_t
_dbus_message_get_reply_serial (DBusMessage *message)
{
- return get_int_field (message, FIELD_REPLY_SERIAL);
+ return message->reply_serial;
}
/**
message->refcount = 1;
message->byte_order = DBUS_COMPILER_BYTE_ORDER;
+ message->client_serial = -1;
+ message->reply_serial = -1;
i = 0;
while (i < FIELD_LAST)
_dbus_assert (_dbus_string_get_length (&message->header) == header_len);
_dbus_assert (_dbus_string_get_length (&message->body) == body_len);
+ /* Fill in caches */
+ message->reply_serial = get_int_field (message,
+ FIELD_REPLY_SERIAL);
+ message->client_serial = get_int_field (message,
+ FIELD_CLIENT_SERIAL);
+
_dbus_verbose ("Loaded message %p\n", message);
}
else