summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRomain Pokrzywka <romain@kdab.com>2010-10-04 01:46:42 +0200
committerRalf Habacker <ralf.habacker@freenet.de>2010-10-08 14:37:53 +0200
commit6611816694ef5602f42fb66fafe86363d22eacfa (patch)
treed86e3c827ca063089684ec9189403e3995469e49
parent2e134dd74ce3905ba867e2d1fc5a30943cabb026 (diff)
Tentative workaround for the random hangs on windows.
The problem seems to be a race condition with winsock's internal threads for the non-blocking mode of the sockets, but I haven't had time to try a standalone test case yet to confirm it. Anyway, I found a workaround that fixes it in all cases, so it's good enough for now.
-rw-r--r--dbus/dbus-sysdeps-win.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c
index 3c8da94a..ae461204 100644
--- a/dbus/dbus-sysdeps-win.c
+++ b/dbus/dbus-sysdeps-win.c
@@ -1129,12 +1129,11 @@ _dbus_poll (DBusPollFD *fds,
max_fd = MAX (max_fd, fdp->fd);
}
+ // Avoid random lockups with send(), for lack of a better solution so far
+ tv.tv_sec = timeout_milliseconds < 0 ? 1 : timeout_milliseconds / 1000;
+ tv.tv_usec = timeout_milliseconds < 0 ? 0 : (timeout_milliseconds % 1000) * 1000;
- tv.tv_sec = timeout_milliseconds / 1000;
- tv.tv_usec = (timeout_milliseconds % 1000) * 1000;
-
- ready = select (max_fd + 1, &read_set, &write_set, &err_set,
- timeout_milliseconds < 0 ? NULL : &tv);
+ ready = select (max_fd + 1, &read_set, &write_set, &err_set, &tv);
if (DBUS_SOCKET_API_RETURNS_ERROR (ready))
{