summaryrefslogtreecommitdiffstats
path: root/dbus
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2005-01-30 07:44:08 +0000
committerHavoc Pennington <hp@redhat.com>2005-01-30 07:44:08 +0000
commit98ad8a8ec6626f7f5c78915b6bdf2be688b4839f (patch)
treefb2744289e2f187aa7239d11bf8473fd186fa1ce /dbus
parent41f52c96d651003b3d0a266a582d401228a8368e (diff)
2005-01-30 Havoc Pennington <hp@redhat.com>
* glib/dbus-gobject.c (introspect_properties): fix the XML generated * dbus/dbus-message.c (dbus_message_unref): add an in_cache flag which effectively detects the use of freed messages * glib/dbus-gobject.c (handle_introspect): modify and return the reply message instead of the incoming message * dbus/dbus-object-tree.c (handle_default_introspect_unlocked): gee, maybe it should SEND THE XML instead of just making a string and freeing it again ;-) * tools/dbus-print-message.c (print_message): improve printing of messages * configure.in: add debug-glib.service to the output
Diffstat (limited to 'dbus')
-rw-r--r--dbus/dbus-connection-internal.h4
-rw-r--r--dbus/dbus-connection.c13
-rw-r--r--dbus/dbus-marshal-validate.c4
-rw-r--r--dbus/dbus-message-private.h4
-rw-r--r--dbus/dbus-message.c14
-rw-r--r--dbus/dbus-object-tree.c30
6 files changed, 64 insertions, 5 deletions
diff --git a/dbus/dbus-connection-internal.h b/dbus/dbus-connection-internal.h
index b5781d9c..14184ad2 100644
--- a/dbus/dbus-connection-internal.h
+++ b/dbus/dbus-connection-internal.h
@@ -89,7 +89,9 @@ DBusMessage* _dbus_connection_block_for_reply (DBusConnection
int timeout_milliseconds);
void _dbus_pending_call_complete_and_unlock (DBusPendingCall *pending,
DBusMessage *message);
-
+dbus_bool_t _dbus_connection_send_unlocked (DBusConnection *connection,
+ DBusMessage *message,
+ dbus_uint32_t *client_serial);
/**
* @addtogroup DBusPendingCallInternals DBusPendingCall implementation details
diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c
index 90d7c38b..f01133c5 100644
--- a/dbus/dbus-connection.c
+++ b/dbus/dbus-connection.c
@@ -357,7 +357,7 @@ _dbus_connection_queue_received_message_link (DBusConnection *connection,
_dbus_connection_wakeup_mainloop (connection);
- _dbus_verbose ("Message %p (%d %s %s '%s') added to incoming queue %p, %d incoming\n",
+ _dbus_verbose ("Message %p (%d %s %s '%s' reply to %u) added to incoming queue %p, %d incoming\n",
message,
dbus_message_get_type (message),
dbus_message_get_interface (message) ?
@@ -367,6 +367,7 @@ _dbus_connection_queue_received_message_link (DBusConnection *connection,
dbus_message_get_member (message) :
"no member",
dbus_message_get_signature (message),
+ dbus_message_get_reply_serial (message),
connection,
connection->n_incoming);
}
@@ -1562,7 +1563,7 @@ _dbus_connection_send_preallocated_unlocked (DBusConnection *connection,
sig = dbus_message_get_signature (message);
- _dbus_verbose ("Message %p (%d %s %s '%s') added to outgoing queue %p, %d pending to send\n",
+ _dbus_verbose ("Message %p (%d %s %s '%s') for %s added to outgoing queue %p, %d pending to send\n",
message,
dbus_message_get_type (message),
dbus_message_get_interface (message) ?
@@ -1572,6 +1573,9 @@ _dbus_connection_send_preallocated_unlocked (DBusConnection *connection,
dbus_message_get_member (message) :
"no member",
sig,
+ dbus_message_get_destination (message) ?
+ dbus_message_get_destination (message) :
+ "null",
connection,
connection->n_outgoing);
@@ -1587,6 +1591,9 @@ _dbus_connection_send_preallocated_unlocked (DBusConnection *connection,
if (client_serial)
*client_serial = dbus_message_get_serial (message);
}
+
+ _dbus_verbose ("Message %p serial is %u\n",
+ message, dbus_message_get_serial (message));
_dbus_message_lock (message);
@@ -1638,7 +1645,7 @@ dbus_connection_send_preallocated (DBusConnection *connection,
CONNECTION_UNLOCK (connection);
}
-static dbus_bool_t
+dbus_bool_t
_dbus_connection_send_unlocked (DBusConnection *connection,
DBusMessage *message,
dbus_uint32_t *client_serial)
diff --git a/dbus/dbus-marshal-validate.c b/dbus/dbus-marshal-validate.c
index d9b85cb7..b144b62a 100644
--- a/dbus/dbus-marshal-validate.c
+++ b/dbus/dbus-marshal-validate.c
@@ -178,9 +178,11 @@ validate_body_helper (DBusTypeReader *reader,
const unsigned char *a;
int alignment;
+#if 0
_dbus_verbose (" validating value of type %s type reader %p type_pos %d p %p end %p %d remain\n",
_dbus_type_to_string (current_type), reader, reader->type_pos, p, end,
(int) (end - p));
+#endif
/* Guarantee that p has one byte to look at */
if (p == end)
@@ -436,9 +438,11 @@ validate_body_helper (DBusTypeReader *reader,
break;
}
+#if 0
_dbus_verbose (" validated value of type %s type reader %p type_pos %d p %p end %p %d remain\n",
_dbus_type_to_string (current_type), reader, reader->type_pos, p, end,
(int) (end - p));
+#endif
if (p > end)
{
diff --git a/dbus/dbus-message-private.h b/dbus/dbus-message-private.h
index 5f727ae1..9ba5c2f4 100644
--- a/dbus/dbus-message-private.h
+++ b/dbus/dbus-message-private.h
@@ -97,6 +97,10 @@ struct DBusMessage
unsigned int locked : 1; /**< Message being sent, no modifications allowed. */
+#ifndef DBUS_DISABLE_CHECKS
+ unsigned int in_cache : 1; /**< Has been "freed" since it's in the cache (this is a debug feature) */
+#endif
+
DBusList *size_counters; /**< 0-N DBusCounter used to track message size. */
long size_counter_delta; /**< Size we incremented the size counters by. */
diff --git a/dbus/dbus-message.c b/dbus/dbus-message.c
index 85252005..0d816595 100644
--- a/dbus/dbus-message.c
+++ b/dbus/dbus-message.c
@@ -456,6 +456,8 @@ dbus_message_finalize (DBusMessage *message)
_dbus_header_free (&message->header);
_dbus_string_free (&message->body);
+ _dbus_assert (message->refcount.value == 0);
+
dbus_free (message);
}
@@ -657,10 +659,15 @@ dbus_message_cache_or_finalize (DBusMessage *message)
message_cache[i] = message;
message_cache_count += 1;
was_cached = TRUE;
+#ifndef DBUS_DISABLE_CHECKS
+ message->in_cache = TRUE;
+#endif
out:
_DBUS_UNLOCK (message_cache);
+ _dbus_assert (message->refcount.value == 0);
+
if (!was_cached)
dbus_message_finalize (message);
}
@@ -691,6 +698,9 @@ dbus_message_new_empty_header (void)
message->refcount.value = 1;
message->byte_order = DBUS_COMPILER_BYTE_ORDER;
message->locked = FALSE;
+#ifndef DBUS_DISABLE_CHECKS
+ message->in_cache = FALSE;
+#endif
message->size_counters = NULL;
message->size_counter_delta = 0;
message->changed_stamp = 0;
@@ -1067,7 +1077,8 @@ dbus_message_ref (DBusMessage *message)
_dbus_return_val_if_fail (message != NULL, NULL);
_dbus_return_val_if_fail (message->generation == _dbus_current_generation, NULL);
-
+ _dbus_return_val_if_fail (!message->in_cache, NULL);
+
old_refcount = _dbus_atomic_inc (&message->refcount);
_dbus_assert (old_refcount >= 1);
@@ -1087,6 +1098,7 @@ dbus_message_unref (DBusMessage *message)
_dbus_return_if_fail (message != NULL);
_dbus_return_if_fail (message->generation == _dbus_current_generation);
+ _dbus_return_if_fail (!message->in_cache);
old_refcount = _dbus_atomic_dec (&message->refcount);
diff --git a/dbus/dbus-object-tree.c b/dbus/dbus-object-tree.c
index f8797595..da8d8c26 100644
--- a/dbus/dbus-object-tree.c
+++ b/dbus/dbus-object-tree.c
@@ -615,11 +615,22 @@ handle_default_introspect_unlocked (DBusObjectTree *tree,
DBusHandlerResult result;
char **children;
int i;
+ DBusMessage *reply;
+ DBusMessageIter iter;
+ const char *v_STRING;
+ /* We have the connection lock here */
+
+ _dbus_verbose (" considering default Introspect() handler...\n");
+
+ reply = NULL;
+
if (!dbus_message_is_method_call (message,
DBUS_INTERFACE_ORG_FREEDESKTOP_INTROSPECTABLE,
"Introspect"))
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ _dbus_verbose (" using default Introspect() handler!\n");
if (!_dbus_string_init (&xml))
return DBUS_HANDLER_RESULT_NEED_MEMORY;
@@ -648,12 +659,31 @@ handle_default_introspect_unlocked (DBusObjectTree *tree,
if (!_dbus_string_append (&xml, "</node>\n"))
goto out;
+
+ reply = dbus_message_new_method_return (message);
+ if (reply == NULL)
+ goto out;
+
+ dbus_message_iter_init_append (reply, &iter);
+ v_STRING = _dbus_string_get_const_data (&xml);
+ if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &v_STRING))
+ goto out;
+
+#ifdef DBUS_BUILD_TESTS
+ if (tree->connection)
+#endif
+ {
+ if (!_dbus_connection_send_unlocked (tree->connection, reply, NULL))
+ goto out;
+ }
result = DBUS_HANDLER_RESULT_HANDLED;
out:
_dbus_string_free (&xml);
dbus_free_string_array (children);
+ if (reply)
+ dbus_message_unref (reply);
return result;
}