Author: mturk Date: Mon Dec 21 07:04:42 2009 New Revision: 892708 URL: http://svn.apache.org/viewvc?rev=892708&view=rev Log: Use poll instead select
Modified: tomcat/jk/trunk/native/common/jk_connect.c tomcat/jk/trunk/native/common/portable.h.sample tomcat/jk/trunk/native/configure.in tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Modified: tomcat/jk/trunk/native/common/jk_connect.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_connect.c?rev=892708&r1=892707&r2=892708&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_connect.c (original) +++ tomcat/jk/trunk/native/common/jk_connect.c Mon Dec 21 07:04:42 2009 @@ -42,6 +42,10 @@ /* FIONREAD on Solaris et al. */ #include <sys/filio.h> #endif +#ifdef HAVE_POLL_H +/* Use poll instead select */ +#include <poll.h> +#endif #if defined(WIN32) || (defined(NETWARE) && defined(__NOVELL_LIBC__)) #define JK_IS_SOCKET_ERROR(x) ((x) == SOCKET_ERROR) @@ -864,6 +868,51 @@ * to allow for iterative waiting * @remark Cares about errno */ +#ifdef HAVE_POLL +int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l) +{ + struct pollfd fds; + int rc; + int save_errno; + + JK_TRACE_ENTER(l); + + errno = 0; + fds.fd = sd; + fds.events = POLLIN; + + do { + rc = poll(&fds, 1, timeout); + } while (rc < 0 && errno == EINTR); + + if (rc == 0) { + /* Timeout. Set the errno to timeout */ + errno = ETIMEDOUT; + JK_TRACE_EXIT(l); + return JK_FALSE; + } + else if (rc < 0) { + save_errno = errno; + jk_log(l, JK_LOG_WARNING, + "error during poll on socket sd = %d (errno=%d)", sd, errno); + errno = save_errno; + JK_TRACE_EXIT(l); + return JK_FALSE; + } + if ((fds.revents & (POLLERR | POLLHUP))) { + save_errno = fds.revents & (POLLERR | POLLHUP); + jk_log(l, JK_LOG_WARNING, + "error event during poll on socket sd = %d (event=%d)", + sd, save_errno); + errno = save_errno; + JK_TRACE_EXIT(l); + return JK_FALSE; + } + errno = 0; + JK_TRACE_EXIT(l); + return JK_TRUE; +} +#else int jk_is_input_event(jk_sock_t sd, int timeout, jk_logger_t *l) { fd_set rset; @@ -905,6 +954,7 @@ JK_TRACE_EXIT(l); return JK_TRUE; } +#endif /** Test if a socket is still connected * @param sd socket to use @@ -914,6 +964,46 @@ * @remark Always closes socket in case of error * @remark Cares about errno */ +#ifdef HAVE_POLL +int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l) +{ + struct pollfd fds; + int rc; + + JK_TRACE_ENTER(l); + + errno = 0; + fds.fd = sd; + fds.events = POLLIN; + + do { + rc = poll(&fds, 1, 0); + } while (rc < 0 && errno == EINTR); + + errno = 0; + if (rc == 0) { + /* If we get a timeout, then we are still connected */ + JK_TRACE_EXIT(l); + return JK_TRUE; + } + else if (rc == 1 && fds.revents == POLLIN) { + char buf; + do { + rc = (int)recvfrom(sd, &buf, 1, MSG_PEEK, NULL, NULL); + } while (rc < 0 && errno == EINTR); + if (rc == 1) { + /* There is at least one byte to read. */ + JK_TRACE_EXIT(l); + return JK_TRUE; + } + } + jk_shutdown_socket(sd, l); + + JK_TRACE_EXIT(l); + return JK_FALSE; +} + +#else int jk_is_socket_connected(jk_sock_t sd, jk_logger_t *l) { fd_set fd; @@ -970,3 +1060,5 @@ JK_TRACE_EXIT(l); return JK_FALSE; } +#endif + Modified: tomcat/jk/trunk/native/common/portable.h.sample URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/portable.h.sample?rev=892708&r1=892707&r2=892708&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/portable.h.sample (original) +++ tomcat/jk/trunk/native/common/portable.h.sample Mon Dec 21 07:04:42 2009 @@ -24,6 +24,12 @@ /* Have flock() */ #define HAVE_FLOCK 1 +/* Have poll() */ +#define HAVE_POLL 1 + +/* Define to 1 if you have the <poll.h> header file. */ +#define HAVE_POLL_H 1 + /* Define to 1 if you have the <inttypes.h> header file. */ #define HAVE_INTTYPES_H 1 @@ -112,4 +118,5 @@ #define USE_SO_SNDTIMEO 1 /* Version number of package */ -#define VERSION "1.2.28" +#define VERSION "1.2.29" + Modified: tomcat/jk/trunk/native/configure.in URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/configure.in?rev=892708&r1=892707&r2=892708&view=diff ============================================================================== --- tomcat/jk/trunk/native/configure.in (original) +++ tomcat/jk/trunk/native/configure.in Mon Dec 21 07:04:42 2009 @@ -319,6 +319,11 @@ JK_CHECK_SETSOCKOPT(SO_RCVTIMEO) JK_CHECK_SETSOCKOPT(SO_SNDTIMEO) +dnl check for poll.h header +AC_CHECK_HEADERS(poll.h) +dnl check for poll function +AC_CHECK_FUNC(poll, AC_DEFINE(HAVE_POLL,1,[Have poll()])) + dnl Apache-2.0 needs the os subdirectory to include os.h dnl this include is copy from os/config.m4 sinclude(../support/os_apache.m4) Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=892708&r1=892707&r2=892708&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Mon Dec 21 07:04:42 2009 @@ -44,6 +44,10 @@ <subsection name="Native"> <changelog> <fix> + <bug>48410</bug>: Use poll instead select so we can work with more. + then 1024 sockets. (mturk) + </fix> + <fix> <bug>47867</bug>: IIS: crash during startup, when compiled with VS2008 and workers.properties contains unsupported properties. Patch provided by Indrek Juhani (rjung) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org