Author: mturk
Date: Thu Sep 28 00:40:37 2006
New Revision: 450737

URL: http://svn.apache.org/viewvc?view=rev&rev=450737
Log:
Fix #40525. When the Poll.create ttl was < 0 the
Poll.pool was returning immediately instead considering
this as infinite timeout and using provided timeout
param. Also the Poll.maintain was not considering the
ttl == 0, while it should maintain all sockets.

Modified:
    tomcat/connectors/trunk/jni/native/src/poll.c

Modified: tomcat/connectors/trunk/jni/native/src/poll.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jni/native/src/poll.c?view=diff&rev=450737&r1=450736&r2=450737
==============================================================================
--- tomcat/connectors/trunk/jni/native/src/poll.c (original)
+++ tomcat/connectors/trunk/jni/native/src/poll.c Thu Sep 28 00:40:37 2006
@@ -178,7 +178,11 @@
     fd.reqevents = (apr_int16_t)reqevents;
     fd.desc.s    = s->sock;
     fd.client_data = s;
-    p->socket_ttl[p->nelts] = apr_time_now();
+    if (p->max_ttl > 0)
+        p->socket_ttl[p->nelts] = apr_time_now();
+    else
+        p->socket_ttl[p->nelts] = 0;
+
     p->socket_set[p->nelts] = fd;
     p->nelts++;
 #ifdef TCN_DO_STATISTICS
@@ -219,6 +223,18 @@
     return apr_pollset_remove(p->pollset, fd);
 }
 
+static void remove_all(tcn_pollset_t *p)
+{
+    apr_int32_t i;
+    for (i = 0; i < p->nelts; i++) {
+        apr_pollset_remove(p->pollset, &(p->socket_set[i]));
+#ifdef TCN_DO_STATISTICS
+        p->sp_removed++;
+#endif
+    }
+    p->nelts = 0;
+}
+
 TCN_IMPLEMENT_CALL(jint, Poll, remove)(TCN_STDARGS, jlong pollset,
                                        jlong socket)
 {
@@ -257,7 +273,7 @@
      p->sp_poll++;
 #endif
 
-    if (timeout > 0) {
+    if (ptime > 0 && p->max_ttl >= 0) {
         apr_time_t now = apr_time_now();
 
         /* Find the minimum timeout */
@@ -272,6 +288,8 @@
             }
         }
     }
+    else if (ptime < 0)
+        ptime = 0;
     for (;;) {
         rv = apr_pollset_poll(p->pollset, ptime, &num, &fd);
         if (rv != APR_SUCCESS) {
@@ -341,6 +359,19 @@
                 fd.desc.s = (J2P(p->set[i], tcn_socket_t *))->sock;
                 do_remove(p, &fd);
             }
+        }
+    }
+    else if (p->max_ttl == 0) {
+        for (i = 0; i < p->nelts; i++) {
+            fd = p->socket_set[i];
+            p->set[num++] = P2J(fd.client_data);
+        }
+        if (remove) {
+            remove_all(p);
+#ifdef TCN_DO_STATISTICS
+            p->sp_maintained += num;
+            p->sp_max_maintained = TCN_MAX(p->sp_max_maintained, num);
+#endif
         }
     }
     if (num)



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to