[sr-dev] git:kamailio_3.0: tcp: force eof after read if write side hangup
Andrei Pelinescu-Onciul
andrei at iptel.org
Thu Aug 19 16:20:01 CEST 2010
Module: sip-router
Branch: kamailio_3.0
Commit: 4ca0f2295fcb2b93a853edad472c5578b335e72a
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=4ca0f2295fcb2b93a853edad472c5578b335e72a
Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date: Sun Jun 20 19:40:55 2010 +0200
tcp: force eof after read if write side hangup
Even if POLLRDHUP is not supported, but we detected a write side close
(POLLHUP) or an error (POLLERR) or such an event was previously detected by
tcp_main (F_CONN_EOF_SEEN), force connection closing after reading all the data
in the socket buffer. In this case we can close() after the first short read
and we save an extra system call (a read() that returns 0).
(cherry picked from commit 28e313250503d6f8d06ebab15c8421c40e7f0fe4)
---
tcp_read.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/tcp_read.c b/tcp_read.c
index d201765..9015a8b 100644
--- a/tcp_read.c
+++ b/tcp_read.c
@@ -970,13 +970,13 @@ again:
con, con->id, atomic_get(&con->refcnt));
goto read_error;
}
+ read_flags=((
#ifdef POLLRDHUP
- read_flags=(((events & POLLRDHUP) |
+ (events & POLLRDHUP) |
+#endif /* POLLRDHUP */
+ (events & (POLLHUP|POLLERR)) |
(con->flags & (F_CONN_EOF_SEEN|F_CONN_FORCE_EOF)))
&& !(events & POLLPRI))? RD_CONN_FORCE_EOF: 0;
-#else /* POLLRDHUP */
- read_flags=0;
-#endif /* POLLRDHUP */
resp=tcp_read_req(con, &ret, &read_flags);
if (unlikely(resp<0)){
read_error:
More information about the sr-dev
mailing list