summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-connection.c
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2003-03-16 08:31:00 +0000
committerHavoc Pennington <hp@redhat.com>2003-03-16 08:31:00 +0000
commit5c53fb2a36024c66b3aaa6d26e93a802393664b2 (patch)
treef9911e2f7e8f5207138fe462b5ec0115c2c91d94 /dbus/dbus-connection.c
parentce173b29fc1e9432cb5956952afdbe775da12415 (diff)
2003-03-16 Havoc Pennington <hp@pobox.com>
* dbus/dbus-connection.c (_dbus_connection_queue_received_message_link): new function that can't fail due to OOM * dbus/dbus-message.c (_dbus_message_loader_pop_message_link): new function pops a message together with a list link containing it. * dbus/dbus-transport-unix.c (queue_messages): use new link-based message queuing functions to avoid needing to alloc memory
Diffstat (limited to 'dbus/dbus-connection.c')
-rw-r--r--dbus/dbus-connection.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c
index 6f02d258..35ffca0c 100644
--- a/dbus/dbus-connection.c
+++ b/dbus/dbus-connection.c
@@ -168,6 +168,7 @@ _dbus_connection_wakeup_mainloop (DBusConnection *connection)
/**
* Adds a message to the incoming message queue, returning #FALSE
* if there's insufficient memory to queue the message.
+ * Does not take over refcount of the message.
*
* @param connection the connection.
* @param message the message to queue.
@@ -177,15 +178,40 @@ dbus_bool_t
_dbus_connection_queue_received_message (DBusConnection *connection,
DBusMessage *message)
{
+ DBusList *link;
+
+ link = _dbus_list_alloc_link (message);
+ if (link == NULL)
+ return FALSE;
+
+ dbus_message_ref (message);
+ _dbus_connection_queue_received_message_link (connection, link);
+
+ return TRUE;
+}
+
+/**
+ * Adds a message-containing list link to the incoming message queue,
+ * taking ownership of the link and the message's current refcount.
+ * Cannot fail due to lack of memory.
+ *
+ * @param connection the connection.
+ * @param link the message link to queue.
+ */
+void
+_dbus_connection_queue_received_message_link (DBusConnection *connection,
+ DBusList *link)
+{
ReplyHandlerData *reply_handler_data;
dbus_int32_t reply_serial;
+ DBusMessage *message;
_dbus_assert (_dbus_transport_get_is_authenticated (connection->transport));
- if (!_dbus_list_append (&connection->incoming_messages,
- message))
- return FALSE;
-
+ _dbus_list_append_link (&connection->incoming_messages,
+ link);
+ message = link->data;
+
/* If this is a reply we're waiting on, remove timeout for it */
reply_serial = dbus_message_get_reply_serial (message);
if (reply_serial != -1)
@@ -201,7 +227,6 @@ _dbus_connection_queue_received_message (DBusConnection *connection,
}
}
- dbus_message_ref (message);
connection->n_incoming += 1;
_dbus_connection_wakeup_mainloop (connection);
@@ -211,8 +236,6 @@ _dbus_connection_queue_received_message (DBusConnection *connection,
message, dbus_message_get_name (message),
connection,
connection->n_incoming);
-
- return TRUE;
}
/**