diff options
author | Havoc Pennington <hp@redhat.com> | 2004-11-26 02:29:00 +0000 |
---|---|---|
committer | Havoc Pennington <hp@redhat.com> | 2004-11-26 02:29:00 +0000 |
commit | c670c23823a2f62a3bbb5867451f357d2b96c43d (patch) | |
tree | ca79f94e99f0eac476b651f0f8a0e6d3f0c28733 /dbus | |
parent | dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7 (diff) |
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
Diffstat (limited to 'dbus')
-rw-r--r-- | dbus/dbus-transport-unix.c | 25 |
1 files changed, 24 insertions, 1 deletions
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 { |