dbus/dbus dbus-transport-unix.c,1.43,1.44

Havoc Pennington hp at freedesktop.org
Thu Nov 25 18:29:02 PST 2004


Update of /cvs/dbus/dbus/dbus
In directory gabe:/tmp/cvs-serv22275/dbus

Modified Files:
	dbus-transport-unix.c 
Log Message:
2004-11-25  Havoc Pennington  <hp at redhat.com>

	* dbus/dbus-transport-unix.c (unix_do_iteration): if we're going
	to write, without reading or blocking, try it before the poll()
	and skip the poll() if nothing remains to write. This is about a
	3% speedup in the echo client/server



Index: dbus-transport-unix.c
===================================================================
RCS file: /cvs/dbus/dbus/dbus/dbus-transport-unix.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- dbus-transport-unix.c	26 Nov 2004 01:53:13 -0000	1.43
+++ dbus-transport-unix.c	26 Nov 2004 02:29:00 -0000	1.44
@@ -945,13 +945,36 @@
   
   if (_dbus_transport_get_is_authenticated (transport))
     {
+      /* This is kind of a hack; if we have stuff to write, then try
+       * to avoid the poll. This is probably about a 5% speedup on an
+       * echo client/server.
+       *
+       * If both reading and writing were requested, we want to avoid this
+       * since it could have funky effects:
+       *   - both ends spinning waiting for the other one to read
+       *     data so they can finish writing
+       *   - prioritizing all writing ahead of reading
+       */
+      if ((flags & DBUS_ITERATION_DO_WRITING) &&
+          !(flags & (DBUS_ITERATION_DO_READING | DBUS_ITERATION_BLOCK)) &&
+          !transport->disconnected &&
+          _dbus_connection_has_messages_to_send_unlocked (transport->connection))
+        {
+          do_writing (transport);
+
+          if (transport->disconnected ||
+              !_dbus_connection_has_messages_to_send_unlocked (transport->connection))
+            goto out;
+        }
+
+      /* If we get here, we decided to do the poll() after all */
       _dbus_assert (unix_transport->read_watch);
       if (flags & DBUS_ITERATION_DO_READING)
 	poll_fd.events |= _DBUS_POLLIN;
 
       _dbus_assert (unix_transport->write_watch);
       if (flags & DBUS_ITERATION_DO_WRITING)
-	poll_fd.events |= _DBUS_POLLOUT;
+        poll_fd.events |= _DBUS_POLLOUT;
     }
   else
     {



More information about the dbus-commit mailing list