From ff190005e5e518c1d78fd83b0da3642280ead84c Mon Sep 17 00:00:00 2001 From: Havoc Pennington Date: Thu, 27 Feb 2003 05:12:39 +0000 Subject: 2003-02-27 Havoc Pennington * 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 --- dbus/dbus-connection.c | 2 +- dbus/dbus-message.c | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) (limited to 'dbus') diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c index 4990cff3..134736d2 100644 --- a/dbus/dbus-connection.c +++ b/dbus/dbus-connection.c @@ -1320,7 +1320,7 @@ dbus_connection_send_message_with_reply_and_block (DBusConnection *connectio if (_dbus_message_get_reply_serial (reply) == client_serial) { - _dbus_list_remove (&connection->incoming_messages, link); + _dbus_list_remove_link (&connection->incoming_messages, link); dbus_message_ref (reply); if (result) diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c index 1a112a79..09ebeef8 100644 --- a/dbus/dbus-message.c +++ b/dbus/dbus-message.c @@ -91,6 +91,10 @@ struct DBusMessage 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. */ @@ -528,9 +532,10 @@ _dbus_message_set_client_serial (DBusMessage *message, { _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; } /** @@ -547,8 +552,14 @@ _dbus_message_set_reply_serial (DBusMessage *message, { _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; } /** @@ -566,7 +577,7 @@ _dbus_message_set_reply_serial (DBusMessage *message, dbus_int32_t _dbus_message_get_client_serial (DBusMessage *message) { - return get_int_field (message, FIELD_CLIENT_SERIAL); + return message->client_serial; } /** @@ -579,7 +590,7 @@ _dbus_message_get_client_serial (DBusMessage *message) dbus_int32_t _dbus_message_get_reply_serial (DBusMessage *message) { - return get_int_field (message, FIELD_REPLY_SERIAL); + return message->reply_serial; } /** @@ -728,6 +739,8 @@ dbus_message_new_empty_header (void) message->refcount = 1; message->byte_order = DBUS_COMPILER_BYTE_ORDER; + message->client_serial = -1; + message->reply_serial = -1; i = 0; while (i < FIELD_LAST) @@ -2722,6 +2735,12 @@ _dbus_message_loader_return_buffer (DBusMessageLoader *loader, _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 -- cgit