summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-04-17 15:43:11 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-04-29 12:36:53 +0200
commitc62117165e685beba2f210f87d7d88f578a9322e (patch)
tree67488c10ea2dc47aff2135e354e7cee5d4b12d30
parent80a50c59331faf268947f97ca702cb9a1d9881cd (diff)
libports: work around bugs in server termination
Some servers use ports_manage_port_operations_one_thread to process requests and terminate when it returns. Since many of them don't detach before shutting down, a client may receive an error if its request arrived while the server is shutting down. Prevent those spurious errors by forcing ports_manage_port_operations_one_thread not to return. This is the same change as 235491231bdd1fd93507c835767503f047e10b91 introduced for ports_manage_port_operations_multithread. * libports/manage-one-thread.c (ports_manage_port_operations_one_thread): Force timeout to 0.
-rw-r--r--libports/manage-one-thread.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libports/manage-one-thread.c b/libports/manage-one-thread.c
index 4ea740b2a..cbd2df7df 100644
--- a/libports/manage-one-thread.c
+++ b/libports/manage-one-thread.c
@@ -85,7 +85,14 @@ ports_manage_port_operations_one_thread (struct port_bucket *bucket,
return status;
}
-
+
+ /* XXX It is currently unsafe for most servers to terminate based on
+ inactivity because a request may arrive after a server has
+ started shutting down, causing the client to receive an error.
+ Prevent the service loop from terminating by setting TIMEOUT to
+ zero. */
+ timeout = 0;
+
do
err = mach_msg_server_timeout (internal_demuxer, 0, bucket->portset,
timeout ? MACH_RCV_TIMEOUT : 0, timeout);