You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Tim Whittington <ti...@orionhealth.com> on 2010/01/07 10:41:02 UTC
Re: svn commit: r893452 -
/tomcat/jk/trunk/native/common/jk_connect.c
This appears to have broken my build on Windows (VC 2005).
SHUT_RD is SD_RECEIVE on Windows?
cheers
tim
----- Original Message -----
From: mturk@apache.org
To: dev@tomcat.apache.org
Sent: Wednesday, 23 December, 2009 11:01:47 PM GMT +12:00 New Zealand
Subject: svn commit: r893452 - /tomcat/jk/trunk/native/common/jk_connect.c
Author: mturk
Date: Wed Dec 23 10:01:47 2009
New Revision: 893452
URL: http://svn.apache.org/viewvc?rev=893452&view=rev
Log:
Use smarter shutdown. In case we don't receive the full buffer break from loop. This shoud lower down the shutdown to 2 sec max
Modified:
tomcat/jk/trunk/native/common/jk_connect.c
Modified: tomcat/jk/trunk/native/common/jk_connect.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=893452&r1=893451&r2=893452&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.c (original)
+++ tomcat/jk/trunk/native/common/jk_connect.c Wed Dec 23 10:01:47 2009
@@ -694,8 +694,8 @@
char dummy[512];
int rc = 0;
int rd = 0;
+ int rp = 0;
int save_errno;
- fd_set rs;
struct timeval tv;
time_t start = time(NULL);
@@ -722,10 +722,16 @@
return rc;
}
- /* Set up to wait for readable data on socket... */
- FD_ZERO(&rs);
-
do {
+#ifdef HAVE_POLL
+ struct pollfd fds;
+
+ fds.fd = sd;
+ fds.events = POLLIN;
+#else
+ fd_set rs;
+
+ FD_ZERO(&rs);
/* Read all data from the peer until we reach "end-of-file"
* (FIN from peer) or we've exceeded our overall timeout. If the
* backend does not send us bytes within 2 seconds
@@ -735,8 +741,14 @@
FD_SET(sd, &rs);
tv.tv_sec = SECONDS_TO_LINGER;
tv.tv_usec = 0;
-
- if (select((int)sd + 1, &rs, NULL, NULL, &tv) > 0) {
+#endif
+ rp = 0;
+#ifdef HAVE_POLL
+ if (poll(&fds, 1, SECONDS_TO_LINGER * 1000) > 0)
+#else
+ if (select((int)sd + 1, &rs, NULL, NULL, &tv) > 0)
+#endif
+ {
do {
#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
rc = recv(sd, &dummy[0], sizeof(dummy), 0);
@@ -746,7 +758,7 @@
rc = read(sd, &dummy[0], sizeof(dummy));
#endif
if (rc > 0)
- rd += rc;
+ rp += rc;
} while (JK_IS_SOCKET_ERROR(rc) && (errno == EINTR || errno == EAGAIN));
if (rc <= 0)
@@ -754,7 +766,27 @@
}
else
break;
-
+ rd += rp;
+ if (rp < sizeof(dummy)) {
+ /* We have readed less then size of buffer
+ * It's a good chance there will be no more data
+ * to read.
+ */
+ if ((rc = sononblock(sd))) {
+ rc = jk_close_socket(sd, l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "error setting socket %d to nonblocking", sd);
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "shutting down the read side of socket %d", sd);
+ shutdown(sd, SHUT_RD);
+ break;
+ }
} while (difftime(time(NULL), start) < MAX_SECS_TO_LINGER);
rc = jk_close_socket(sd, l);
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org
Re: svn commit: r893452 -
/tomcat/jk/trunk/native/common/jk_connect.c
Posted by Tim Whittington <ti...@orionhealth.com>.
This should fix it
Index: jk_connect.c
===================================================================
--- jk_connect.c (revision 896809)
+++ jk_connect.c (working copy)
@@ -678,6 +678,13 @@
#define SHUT_WR 0x01
#endif
#endif
+#ifndef SHUT_RD
+#ifdef SD_RECEIVE
+#define SHUT_RD SD_RECEIVE
+#else
+#define SHUT_RD 0x00
+#endif
+#endif
/** Drain and close the socket
* @param sd socket to close
----- Original Message -----
From: "Tim Whittington" <ti...@orionhealth.com>
To: "Tomcat Developers List" <de...@tomcat.apache.org>
Sent: Thursday, 7 January, 2010 10:41:02 PM GMT +12:00 New Zealand
Subject: Re: svn commit: r893452 - /tomcat/jk/trunk/native/common/jk_connect.c
This appears to have broken my build on Windows (VC 2005).
SHUT_RD is SD_RECEIVE on Windows?
cheers
tim
----- Original Message -----
From: mturk@apache.org
To: dev@tomcat.apache.org
Sent: Wednesday, 23 December, 2009 11:01:47 PM GMT +12:00 New Zealand
Subject: svn commit: r893452 - /tomcat/jk/trunk/native/common/jk_connect.c
Author: mturk
Date: Wed Dec 23 10:01:47 2009
New Revision: 893452
URL: http://svn.apache.org/viewvc?rev=893452&view=rev
Log:
Use smarter shutdown. In case we don't receive the full buffer break from loop. This shoud lower down the shutdown to 2 sec max
Modified:
tomcat/jk/trunk/native/common/jk_connect.c
Modified: tomcat/jk/trunk/native/common/jk_connect.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=893452&r1=893451&r2=893452&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_connect.c (original)
+++ tomcat/jk/trunk/native/common/jk_connect.c Wed Dec 23 10:01:47 2009
@@ -694,8 +694,8 @@
char dummy[512];
int rc = 0;
int rd = 0;
+ int rp = 0;
int save_errno;
- fd_set rs;
struct timeval tv;
time_t start = time(NULL);
@@ -722,10 +722,16 @@
return rc;
}
- /* Set up to wait for readable data on socket... */
- FD_ZERO(&rs);
-
do {
+#ifdef HAVE_POLL
+ struct pollfd fds;
+
+ fds.fd = sd;
+ fds.events = POLLIN;
+#else
+ fd_set rs;
+
+ FD_ZERO(&rs);
/* Read all data from the peer until we reach "end-of-file"
* (FIN from peer) or we've exceeded our overall timeout. If the
* backend does not send us bytes within 2 seconds
@@ -735,8 +741,14 @@
FD_SET(sd, &rs);
tv.tv_sec = SECONDS_TO_LINGER;
tv.tv_usec = 0;
-
- if (select((int)sd + 1, &rs, NULL, NULL, &tv) > 0) {
+#endif
+ rp = 0;
+#ifdef HAVE_POLL
+ if (poll(&fds, 1, SECONDS_TO_LINGER * 1000) > 0)
+#else
+ if (select((int)sd + 1, &rs, NULL, NULL, &tv) > 0)
+#endif
+ {
do {
#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__))
rc = recv(sd, &dummy[0], sizeof(dummy), 0);
@@ -746,7 +758,7 @@
rc = read(sd, &dummy[0], sizeof(dummy));
#endif
if (rc > 0)
- rd += rc;
+ rp += rc;
} while (JK_IS_SOCKET_ERROR(rc) && (errno == EINTR || errno == EAGAIN));
if (rc <= 0)
@@ -754,7 +766,27 @@
}
else
break;
-
+ rd += rp;
+ if (rp < sizeof(dummy)) {
+ /* We have readed less then size of buffer
+ * It's a good chance there will be no more data
+ * to read.
+ */
+ if ((rc = sononblock(sd))) {
+ rc = jk_close_socket(sd, l);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "error setting socket %d to nonblocking", sd);
+ errno = save_errno;
+ JK_TRACE_EXIT(l);
+ return rc;
+ }
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "shutting down the read side of socket %d", sd);
+ shutdown(sd, SHUT_RD);
+ break;
+ }
} while (difftime(time(NULL), start) < MAX_SECS_TO_LINGER);
rc = jk_close_socket(sd, l);
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org