2005-01-15 Havoc Pennington <hp@redhat.com>
authorHavoc Pennington <hp@redhat.com>
Sun, 16 Jan 2005 02:23:56 +0000 (02:23 +0000)
committerHavoc Pennington <hp@redhat.com>
Sun, 16 Jan 2005 02:23:56 +0000 (02:23 +0000)
* test/glib/test-profile.c (with_bus_server_filter): fix crash

* dbus/dbus-marshal-basic.c (_dbus_unpack_uint32): inline as macro
when DBUS_DISABLE_ASSERT
(_dbus_marshal_set_basic): be sure we align for the string length

* dbus/dbus-marshal-recursive.c (skip_one_complete_type): make
this look faster

* dbus/dbus-string.c (_dbus_string_get_const_data_len): add an
inline macro version
(_dbus_string_set_byte): provide inline macro version

ChangeLog
dbus/dbus-marshal-basic.c
dbus/dbus-marshal-basic.h
dbus/dbus-marshal-header.c
dbus/dbus-marshal-recursive.c
dbus/dbus-string.c
dbus/dbus-string.h
test/glib/test-profile.c

index 999fa37..fae9823 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 2005-01-15  Havoc Pennington  <hp@redhat.com>
 
+       * test/glib/test-profile.c (with_bus_server_filter): fix crash
+
+       * dbus/dbus-marshal-basic.c (_dbus_unpack_uint32): inline as macro
+       when DBUS_DISABLE_ASSERT
+       (_dbus_marshal_set_basic): be sure we align for the string length
+
+       * dbus/dbus-marshal-recursive.c (skip_one_complete_type): make
+       this look faster
+
+       * dbus/dbus-string.c (_dbus_string_get_const_data_len): add an
+       inline macro version
+       (_dbus_string_set_byte): provide inline macro version
+
+2005-01-15  Havoc Pennington  <hp@redhat.com>
+
        * Land the new message args API and type system.
 
        This patch is huge, but the public API change is not 
index 7504019..a2e3275 100644 (file)
@@ -103,18 +103,6 @@ _dbus_pack_int32 (dbus_int32_t   value,
   pack_4_octets ((dbus_uint32_t) value, byte_order, data);
 }
 
-static dbus_uint32_t
-unpack_4_octets (int                  byte_order,
-                 const unsigned char *data)
-{
-  _dbus_assert (_DBUS_ALIGN_ADDRESS (data, 4) == data);
-
-  if (byte_order == DBUS_LITTLE_ENDIAN)
-    return DBUS_UINT32_FROM_LE (*(dbus_uint32_t*)data);
-  else
-    return DBUS_UINT32_FROM_BE (*(dbus_uint32_t*)data);
-}
-
 #ifndef DBUS_HAVE_INT64
 /* from ORBit */
 static void
@@ -174,6 +162,7 @@ unpack_8_octets (int                  byte_order,
 }
 #endif
 
+#ifndef _dbus_unpack_uint32
 /**
  * Unpacks a 32 bit unsigned integer from a data pointer
  *
@@ -185,8 +174,14 @@ dbus_uint32_t
 _dbus_unpack_uint32 (int                  byte_order,
                      const unsigned char *data)
 {
-  return unpack_4_octets (byte_order, data);
+  _dbus_assert (_DBUS_ALIGN_ADDRESS (data, 4) == data);
+
+  if (byte_order == DBUS_LITTLE_ENDIAN)
+    return DBUS_UINT32_FROM_LE (*(dbus_uint32_t*)data);
+  else
+    return DBUS_UINT32_FROM_BE (*(dbus_uint32_t*)data);
 }
+#endif /* _dbus_unpack_uint32 */
 
 /**
  * Unpacks a 32 bit signed integer from a data pointer
@@ -199,7 +194,7 @@ dbus_int32_t
 _dbus_unpack_int32 (int                  byte_order,
                     const unsigned char *data)
 {
-  return (dbus_int32_t) unpack_4_octets (byte_order, data);
+  return (dbus_int32_t) _dbus_unpack_uint32 (byte_order, data);
 }
 
 static void
@@ -285,7 +280,9 @@ set_string (DBusString          *str,
 
   _dbus_string_init_const (&dstr, value);
 
-  old_len = _dbus_marshal_read_uint32 (str, pos, byte_order, NULL);
+  _dbus_assert (_DBUS_ALIGN_VALUE (pos, 4) == pos);
+  old_len = _dbus_unpack_uint32 (byte_order,
+                                 _dbus_string_get_const_data_len (str, pos, 4));
 
   new_len = _dbus_string_get_length (&dstr);
 
@@ -406,6 +403,7 @@ _dbus_marshal_set_basic (DBusString       *str,
       break;
     case DBUS_TYPE_STRING:
     case DBUS_TYPE_OBJECT_PATH:
+      pos = _DBUS_ALIGN_VALUE (pos, 4);
       _dbus_assert (vp->str != NULL);
       return set_string (str, pos, vp->str, byte_order,
                          old_end_pos, new_end_pos);
@@ -422,23 +420,6 @@ _dbus_marshal_set_basic (DBusString       *str,
     }
 }
 
-static dbus_uint32_t
-read_4_octets (const DBusString *str,
-               int               pos,
-               int               byte_order,
-               int              *new_pos)
-{
-  pos = _DBUS_ALIGN_VALUE (pos, 4);
-
-  if (new_pos)
-    *new_pos = pos + 4;
-
-  _dbus_assert (pos + 4 <= _dbus_string_get_length (str));
-  
-  return unpack_4_octets (byte_order,
-                          _dbus_string_get_const_data (str) + pos);
-}
-
 /**
  * Convenience function to demarshal a 32 bit unsigned integer.
  *
@@ -454,7 +435,15 @@ _dbus_marshal_read_uint32  (const DBusString *str,
                             int               byte_order,
                             int              *new_pos)
 {
-  return read_4_octets (str, pos, byte_order, new_pos);
+  pos = _DBUS_ALIGN_VALUE (pos, 4);
+
+  if (new_pos)
+    *new_pos = pos + 4;
+
+  _dbus_assert (pos + 4 <= _dbus_string_get_length (str));
+  
+  return _dbus_unpack_uint32 (byte_order,
+                              _dbus_string_get_const_data (str) + pos);
 }
 
 /**
index ddfce18..cf86e71 100644 (file)
@@ -136,6 +136,13 @@ typedef union
   char *str;
 } DBusBasicValue;
 
+#ifdef DBUS_DISABLE_ASSERT
+#define _dbus_unpack_uint32(byte_order, data)           \
+   (((byte_order) == DBUS_LITTLE_ENDIAN) ?              \
+     DBUS_UINT32_FROM_LE (*(dbus_uint32_t*)(data)) :    \
+     DBUS_UINT32_FROM_BE (*(dbus_uint32_t*)(data)))
+#endif
+
 void          _dbus_pack_int32    (dbus_int32_t         value,
                                    int                  byte_order,
                                    unsigned char       *data);
@@ -144,9 +151,10 @@ dbus_int32_t  _dbus_unpack_int32  (int                  byte_order,
 void          _dbus_pack_uint32   (dbus_uint32_t        value,
                                    int                  byte_order,
                                    unsigned char       *data);
+#ifndef _dbus_unpack_uint32
 dbus_uint32_t _dbus_unpack_uint32 (int                  byte_order,
                                    const unsigned char *data);
-
+#endif
 
 dbus_bool_t   _dbus_marshal_set_basic         (DBusString       *str,
                                                int               pos,
index 3494042..58ba86f 100644 (file)
@@ -328,14 +328,16 @@ set_basic_field (DBusTypeReader       *reader,
 {
   DBusTypeReader sub;
   DBusTypeReader variant;
-  unsigned char v_BYTE;
 
   _dbus_type_reader_recurse (reader, &sub);
 
   _dbus_assert (_dbus_type_reader_get_current_type (&sub) == DBUS_TYPE_BYTE);
 #ifndef DBUS_DISABLE_ASSERT
-  _dbus_type_reader_read_basic (&sub, &v_BYTE);
-  _dbus_assert (((int) v_BYTE) == field);
+ {
+   unsigned char v_BYTE;
+   _dbus_type_reader_read_basic (&sub, &v_BYTE);
+   _dbus_assert (((int) v_BYTE) == field);
+ }
 #endif
 
   if (!_dbus_type_reader_next (&sub))
index 3b2ce91..a8bad46 100644 (file)
@@ -119,7 +119,7 @@ static int
 first_type_in_signature (const DBusString *str,
                          int               pos)
 {
-  int t;
+  unsigned char t;
 
   t = _dbus_string_get_byte (str, pos);
 
@@ -213,13 +213,10 @@ array_reader_get_array_len (const DBusTypeReader *reader)
 
   len_pos = ARRAY_READER_LEN_POS (reader);
 
-  _dbus_marshal_read_basic (reader->value_str,
-                            len_pos,
-                            DBUS_TYPE_UINT32,
-                            &array_len,
-                            reader->byte_order,
-                            NULL);
-
+  _dbus_assert (_DBUS_ALIGN_VALUE (len_pos, 4) == (unsigned) len_pos);
+  array_len = _dbus_unpack_uint32 (reader->byte_order,
+                                   _dbus_string_get_const_data_len (reader->value_str, len_pos, 4));
+  
 #if RECURSIVE_MARSHAL_READ_TRACE
   _dbus_verbose ("   reader %p len_pos %d array len %u len_offset %d\n",
                  reader, len_pos, array_len, reader->array_len_offset);
@@ -311,37 +308,55 @@ array_reader_check_finished (const DBusTypeReader *reader)
   return reader->value_pos == end_pos;
 }
 
+/* this is written a little oddly to try and overoptimize */
 static void
 skip_one_complete_type (const DBusString *type_str,
                         int              *type_pos)
 {
-  while (_dbus_string_get_byte (type_str, *type_pos) == DBUS_TYPE_ARRAY)
-    *type_pos += 1;
+  const unsigned char *p;
+  const unsigned char *start;
+  
+  start = _dbus_string_get_const_data (type_str);
+  p = start + *type_pos;
 
-  if (_dbus_string_get_byte (type_str, *type_pos) == DBUS_STRUCT_BEGIN_CHAR)
+  while (*p == DBUS_TYPE_ARRAY)
+    ++p;
+  
+  if (*p == DBUS_STRUCT_BEGIN_CHAR)
     {
       int depth;
+      
       depth = 1;
-      *type_pos += 1;
-      while (depth > 0)
+      
+      while (TRUE)
         {
-          switch (_dbus_string_get_byte (type_str, *type_pos))
+          _dbus_assert (*p != DBUS_TYPE_INVALID);
+          
+          ++p;
+
+          _dbus_assert (*p != DBUS_TYPE_INVALID);
+          
+          if (*p == DBUS_STRUCT_BEGIN_CHAR)
+            depth += 1;
+          else if (*p == DBUS_STRUCT_END_CHAR)
             {
-            case DBUS_STRUCT_BEGIN_CHAR:
-              depth += 1;
-              break;
-            case DBUS_STRUCT_END_CHAR:
               depth -= 1;
-              break;
-            case DBUS_TYPE_INVALID:
-              _dbus_assert_not_reached ("unbalanced parens in signature");
-              break;
+              if (depth == 0)
+                {
+                  ++p;
+                  break;
+                }
             }
-          *type_pos += 1;
         }
     }
   else
-    *type_pos += 1;
+    {
+      ++p;
+    }
+
+  _dbus_assert (*p != DBUS_STRUCT_END_CHAR);
+
+  *type_pos = (int) (p - start);
 }
 
 static int
@@ -1831,10 +1846,13 @@ writer_recurse_array (DBusTypeWriter   *writer,
         {
           dbus_uint32_t len;
 
-          len = _dbus_marshal_read_uint32 (sub->value_str,
-                                           sub->u.array.len_pos,
-                                           sub->byte_order, NULL);
-
+          _dbus_assert (_DBUS_ALIGN_VALUE (sub->u.array.len_pos, 4) ==
+                        (unsigned) sub->u.array.len_pos);
+          len = _dbus_unpack_uint32 (sub->byte_order,
+                                     _dbus_string_get_const_data_len (sub->value_str,
+                                                                      sub->u.array.len_pos,
+                                                                      4));
+          
           sub->value_pos += len;
         }
     }
@@ -2432,9 +2450,12 @@ writer_write_reader_helper (DBusTypeWriter       *writer,
                 start_after_new_len +
                 bytes_written_after_start_after;
 
-              old_len = _dbus_marshal_read_uint32 (reader->value_str,
-                                                   fixup.len_pos_in_reader,
-                                                   reader->byte_order, NULL);
+              _dbus_assert (_DBUS_ALIGN_VALUE (fixup.len_pos_in_reader, 4) ==
+                            (unsigned) fixup.len_pos_in_reader);
+              
+              old_len = _dbus_unpack_uint32 (reader->byte_order,
+                                             _dbus_string_get_const_data_len (reader->value_str,
+                                                                              fixup.len_pos_in_reader, 4));
 
               if (old_len != fixup.new_len && !append_fixup (fixups, &fixup))
                 goto oom;
index 777461e..dccf517 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- mode: C; c-file-style: "gnu" -*- */
 /* dbus-string.c String utility class (internal to D-BUS implementation)
  * 
- * Copyright (C) 2002, 2003, 2004 Red Hat, Inc.
+ * Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc.
  *
  * Licensed under the Academic Free License version 2.1
  * 
@@ -517,6 +517,8 @@ _dbus_string_get_data_len (DBusString *str,
   return real->str + start;
 }
 
+/* only do the function if we don't have the macro */
+#ifndef _dbus_string_get_const_data_len
 /**
  * const version of _dbus_string_get_data_len().
  *
@@ -538,7 +540,10 @@ _dbus_string_get_const_data_len (const DBusString  *str,
   
   return real->str + start;
 }
+#endif /* _dbus_string_get_const_data_len */
 
+/* only do the function if we don't have the macro */
+#ifndef _dbus_string_set_byte
 /**
  * Sets the value of the byte at the given position.
  *
@@ -557,6 +562,7 @@ _dbus_string_set_byte (DBusString    *str,
   
   real->str[i] = byte;
 }
+#endif /* _dbus_string_set_byte */
 
 /* only have the function if we didn't create a macro */
 #ifndef _dbus_string_get_byte
index f0ae1e6..df5f423 100644 (file)
@@ -55,8 +55,10 @@ struct DBusString
  * Note that these break type safety (due to the casts)
  */
 #define _dbus_string_get_length(s) (((DBusString*)(s))->dummy2)
+#define _dbus_string_set_byte(s, i, b) ((((unsigned char*)(((DBusString*)(s))->dummy1))[(i)]) = (unsigned char) (b))
 #define _dbus_string_get_byte(s, i) (((const unsigned char*)(((DBusString*)(s))->dummy1))[(i)])
 #define _dbus_string_get_const_data(s) ((const char*)(((DBusString*)(s))->dummy1))
+#define _dbus_string_get_const_data_len(s,start,len) (((const char*)(((DBusString*)(s))->dummy1)) + (start))
 #endif
 
 dbus_bool_t   _dbus_string_init                  (DBusString        *str);
@@ -76,12 +78,16 @@ const char*   _dbus_string_get_const_data        (const DBusString  *str);
 char*         _dbus_string_get_data_len          (DBusString        *str,
                                                   int                start,
                                                   int                len);
+#ifndef _dbus_string_get_const_data_len
 const char*   _dbus_string_get_const_data_len    (const DBusString  *str,
                                                   int                start,
                                                   int                len);
+#endif
+#ifndef _dbus_string_set_byte
 void          _dbus_string_set_byte              (DBusString        *str,
                                                   int                i,
                                                   unsigned char      byte);
+#endif
 #ifndef _dbus_string_get_byte
 unsigned char _dbus_string_get_byte              (const DBusString  *str,
                                                   int                start);
index 55dc603..77ce436 100644 (file)
@@ -48,7 +48,7 @@
  */
 #define N_CLIENT_THREADS 1
 /* It seems like at least 750000 or so iterations reduces the variability to sane levels */
-#define N_ITERATIONS 7500
+#define N_ITERATIONS 750000
 #define N_PROGRESS_UPDATES 20
 /* Don't make PAYLOAD_SIZE too huge because it gets used as a static buffer size */
 #define PAYLOAD_SIZE 0
@@ -425,7 +425,7 @@ with_bus_server_filter (DBusConnection     *connection,
                                    DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS,
                                    "ServiceOwnerChanged"))
     {
-      char *service_name, *old_owner, *new_owner;
+      const char *service_name, *old_owner, *new_owner;
       DBusError error;
 
       service_name = NULL;
@@ -455,10 +455,6 @@ with_bus_server_filter (DBusConnection     *connection,
           if (server->sd->n_clients == 0)
             g_main_loop_quit (server->sd->loop);
         }
-
-      dbus_free (service_name);
-      dbus_free (old_owner);
-      dbus_free (new_owner);
     }
   else if (dbus_message_is_method_call (message,
                                         ECHO_INTERFACE,