diff options
| -rw-r--r-- | ChangeLog | 7 | ||||
| -rw-r--r-- | dbus/dbus-transport-unix.c | 25 | 
2 files changed, 31 insertions, 1 deletions
| @@ -1,5 +1,12 @@  2004-11-25  Havoc Pennington  <hp@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 + +2004-11-25  Havoc Pennington  <hp@redhat.com> +          The primary change here is to always write() once before adding  	the write watch, which gives us about a 10% performance increase. diff --git a/dbus/dbus-transport-unix.c b/dbus/dbus-transport-unix.c index a33b8f78..4190da46 100644 --- a/dbus/dbus-transport-unix.c +++ b/dbus/dbus-transport-unix.c @@ -945,13 +945,36 @@ unix_do_iteration (DBusTransport *transport,    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      { | 
