summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2005-01-01 20:53:42 +0000
committerHavoc Pennington <hp@redhat.com>2005-01-01 20:53:42 +0000
commite07789e51163e4bf760b04fe48a28e15286b642b (patch)
tree73c2e2d86dbdffb8012ec5f6e24a6043bb92ce79
parent60a9694974f84855bb41828e049b8390a933827f (diff)
voc Pennington <hp@redhat.com>
* dbus/dbus-sysdeps.h: add _DBUS_DOUBLES_BITWISE_EQUAL macro, for a variety of reasons '==' doesn't do this.
-rw-r--r--ChangeLog5
-rw-r--r--dbus/dbus-sysdeps.h15
-rw-r--r--doc/TODO4
3 files changed, 24 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 82dcc33a..3f25c119 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-01-01 Havoc Pennington <hp@redhat.com>
+
+ * dbus/dbus-sysdeps.h: add _DBUS_DOUBLES_BITWISE_EQUAL macro,
+ for a variety of reasons '==' doesn't do this.
+
2004-12-31 Havoc Pennington <hp@redhat.com>
* dbus/dbus-string.c (_dbus_string_equal_substrings): new function
diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h
index 5227a697..b0f76e2a 100644
--- a/dbus/dbus-sysdeps.h
+++ b/dbus/dbus-sysdeps.h
@@ -329,6 +329,21 @@ dbus_bool_t _dbus_user_at_console (const char *username,
# endif /* va_list is a pointer */
#endif /* !DBUS_VA_COPY */
+/* On x86 there is an 80-bit FPU, and if you do "a == b" it may have a
+ * or b in an 80-bit register, thus failing to compare the two 64-bit
+ * doubles for bitwise equality.
+ */
+#define _DBUS_BYTE_OF_PRIMITIVE(p, i) \
+ (((const char*)&(p))[(i)])
+#define _DBUS_DOUBLES_BITWISE_EQUAL(a, b) \
+ (_DBUS_BYTE_OF_PRIMITIVE (a, 0) == _DBUS_BYTE_OF_PRIMITIVE (b, 0) && \
+ _DBUS_BYTE_OF_PRIMITIVE (a, 1) == _DBUS_BYTE_OF_PRIMITIVE (b, 1) && \
+ _DBUS_BYTE_OF_PRIMITIVE (a, 2) == _DBUS_BYTE_OF_PRIMITIVE (b, 2) && \
+ _DBUS_BYTE_OF_PRIMITIVE (a, 3) == _DBUS_BYTE_OF_PRIMITIVE (b, 3) && \
+ _DBUS_BYTE_OF_PRIMITIVE (a, 4) == _DBUS_BYTE_OF_PRIMITIVE (b, 4) && \
+ _DBUS_BYTE_OF_PRIMITIVE (a, 5) == _DBUS_BYTE_OF_PRIMITIVE (b, 5) && \
+ _DBUS_BYTE_OF_PRIMITIVE (a, 6) == _DBUS_BYTE_OF_PRIMITIVE (b, 6) && \
+ _DBUS_BYTE_OF_PRIMITIVE (a, 7) == _DBUS_BYTE_OF_PRIMITIVE (b, 7))
DBUS_END_DECLS
diff --git a/doc/TODO b/doc/TODO
index 8c59bb78..a63b1f0d 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -58,6 +58,10 @@ Important for 1.0
(though they are kind of a pita to pass in as size_t with the
varargs, so maybe not - what does glib do with g_object_get()?)
+ - it's probably obnoxious that reading/writing bools doesn't return dbus_bool_t;
+ the only possible solution I think is to change dbus_bool_t to unsigned char,
+ but that may cause wackiness elsewhere.
+
- rename the service thing. unique service names (":1") and well-known
("org.foo.bar") should have different names probably; something like
"address" for the unique and "alias" for the well-known, or