mturk 2005/02/19 01:13:35 Modified: jk/native/common jk_ajp_common.c jk_connect.c Log: Use alternative is_socket_connected implementation using select with 1 microsecond timeout. It should be both faster and usable on netware too. Revision Changes Path 1.91 +7 -9 jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c Index: jk_ajp_common.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c,v retrieving revision 1.90 retrieving revision 1.91 diff -u -r1.90 -r1.91 --- jk_ajp_common.c 18 Feb 2005 08:27:21 -0000 1.90 +++ jk_ajp_common.c 19 Feb 2005 09:13:35 -0000 1.91 @@ -847,10 +847,9 @@ if (ae->worker->cache_timeout > 0 || ae->worker->recycle_timeout > 0) ae->last_access = time(NULL); if (ae->worker->socket_timeout > 0) { - int rc = 0; - if ((rc = jk_is_socket_connected(ae->sd, ae->worker->socket_timeout)) != 1) { - jk_log(l, JK_LOG_INFO, - "Socket is not connected any more (status=%d)", rc); + if (!jk_is_socket_connected(ae->sd, ae->worker->socket_timeout)) { + jk_log(l, JK_LOG_INFO, + "Socket is not connected any more (errno=%d)", errno); jk_close_socket(ae->sd); ae->sd = -1; JK_TRACE_EXIT(l); @@ -1161,10 +1160,9 @@ while ((ae->sd > 0)) { err = 0; if (ae->worker->socket_timeout) { - int rc = 0; - if ((rc = jk_is_socket_connected(ae->sd, ae->worker->socket_timeout)) != 1) { - jk_log(l, JK_LOG_INFO, - "Socket is not connected any more (status=%d)", rc); + if (!jk_is_socket_connected(ae->sd, ae->worker->socket_timeout)) { + jk_log(l, JK_LOG_INFO, + "Socket is not connected any more (errno=%d)", errno); jk_close_socket(ae->sd); ae->sd = -1; err++; 1.43 +48 -2 jakarta-tomcat-connectors/jk/native/common/jk_connect.c Index: jk_connect.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_connect.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- jk_connect.c 17 Feb 2005 08:26:42 -0000 1.42 +++ jk_connect.c 19 Feb 2005 09:13:35 -0000 1.43 @@ -194,18 +194,36 @@ sock_buf); } -#ifdef WIN32 if (timeout > 0) { +#ifdef WIN32 timeout = timeout * 1000; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &timeout, sizeof(int)); setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &timeout, sizeof(int)); +#else + /* TODO: How to set the timeout for other platforms? */ +#endif if (JK_IS_DEBUG_LEVEL(l)) jk_log(l, JK_LOG_DEBUG, "timeout %d set for socket=%d", timeout, sock); } +#ifdef SO_NOSIGPIPE + /* The preferred method on Mac OS X (10.2 and later) to prevent SIGPIPEs when + * sending data to a dead peer. Possibly also existing and in use on other BSD + * systems? + */ + set = 1; + if (setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (const char *)&set, + sizeof(int))) { + JK_GET_SOCKET_ERRNO(); + jk_log(l, JK_LOG_ERROR, + "failed setting SO_NOSIGPIPE with errno=%d", errno); + jk_close_socket(sock); + JK_TRACE_EXIT(l); + return -1; + } #endif /* Tries to connect to Tomcat (continues trying while error is EINTR) */ do { @@ -405,6 +423,32 @@ return 0; } +#if 1 +int jk_is_socket_connected(int sd, int timeout) +{ + fd_set fd; + struct timeval tv; + + FD_ZERO(&fd); + FD_SET(sd, &fd); + + /* Wait one microsecond */ + tv.tv_sec = 0; + tv.tv_usec = 1; + + /* If we get a timeout, then we are still connected */ + if (select(1, &fd, NULL, NULL, &tv) == 0) + return 1; + else { +#if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) + errno = WSAGetLastError() - WSABASEERR; +#endif + return 0; + } +} + +#else + #if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) #define EWOULDBLOCK (WSAEWOULDBLOCK - WSABASEERR) #endif @@ -434,3 +478,5 @@ else return rc; } + +#endif
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]