DO NOT MERGE: Fix crash in Dbus.

Bug: 3189185
Original change by: Havoc Pennington  <[email protected]>

* dbus/dbus-connection.c (struct DBusConnection): Fix from Olivier
Hochreutiner to avoid trying to protect individual bits in a word
with different locks (make dispatch_acquired and io_path_acquired
dbus_bool_t rather than bitfields)

Change-Id: Ic989fb880b02bcb02ad38292c40970b4c76afa44
diff --git a/ChangeLog b/ChangeLog
index 7475800..abb122b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-07-10  Havoc Pennington  <[email protected]>
+
+	* dbus/dbus-connection.c (struct DBusConnection): Fix from Olivier
+	Hochreutiner to avoid trying to protect individual bits in a word
+	with different locks (make dispatch_acquired and io_path_acquired
+	dbus_bool_t rather than bitfields)
+
 2006-12-12  John (J5) Palmieri  <[email protected]>
 
 	* Released 1.0.2
diff --git a/dbus/dbus-connection.c b/dbus/dbus-connection.c
index 1ad054f..3fb6f36 100644
--- a/dbus/dbus-connection.c
+++ b/dbus/dbus-connection.c
@@ -281,10 +281,14 @@
 
   char *server_guid; /**< GUID of server if we are in shared_connections, #NULL if server GUID is unknown or connection is private */
 
+  /* These two MUST be bools and not bitfields, because they are protected by a separate lock
+   * from connection->mutex and all bitfields in a word have to be read/written together.
+   * So you can't have a different lock for different bitfields in the same word.
+   */
+  dbus_bool_t dispatch_acquired; /**< Someone has dispatch path (can drain incoming queue) */
+  dbus_bool_t io_path_acquired;  /**< Someone has transport io path (can use the transport to read/write messages) */
+  
   unsigned int shareable : 1; /**< #TRUE if libdbus owns a reference to the connection and can return it from dbus_connection_open() more than once */
-
-  unsigned int dispatch_acquired : 1; /**< Someone has dispatch path (can drain incoming queue) */
-  unsigned int io_path_acquired : 1;  /**< Someone has transport io path (can use the transport to read/write messages) */
   
   unsigned int exit_on_disconnect : 1; /**< If #TRUE, exit after handling disconnect signal */