You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2006/05/29 16:09:14 UTC
svn commit: r410095 -
/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
Author: remm
Date: Mon May 29 07:09:13 2006
New Revision: 410095
URL: http://svn.apache.org/viewvc?rev=410095&view=rev
Log:
- I had some problems when shutting down pollers which had active connections in them. I can't
reproduce any problem anymore, unfortunately, but I think it was because there was a poll going
on while the sockets in the poller were being destroyed, which could then lead to these sockets
being destroyed again. So I'm adding code to wait until the poll call is done before doing the
poller stop.
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=410095&r1=410094&r2=410095&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Mon May 29 07:09:13 2006
@@ -826,7 +826,7 @@
// Close all APR memory pools and resources
Pool.destroy(rootPool);
rootPool = 0;
- initialized = false ;
+ initialized = false;
}
@@ -1132,7 +1132,7 @@
if (comet) {
// FIXME: Find an appropriate timeout value, for now, "longer than usual"
// semms appropriate
- timeout = soTimeout * 20;
+ timeout = soTimeout * 50;
}
serverPollset = allocatePoller(size, pool, timeout);
if (serverPollset == 0 && size > 1024) {
@@ -1153,6 +1153,16 @@
* Destroy the poller.
*/
protected void destroy() {
+ // Wait for polltime before doing anything, so that the poller threads
+ // exit, otherwise parallel descturction of sockets which are still
+ // in the poller can cause problems
+ try {
+ synchronized (this) {
+ this.wait(pollTime / 1000);
+ }
+ } catch (InterruptedException e) {
+ // Ignore
+ }
// Close all sockets in the add queue
for (int i = 0; i < addCount; i++) {
if (comet) {
@@ -1216,7 +1226,6 @@
// Loop if endpoint is paused
while (paused) {
try {
- // TODO: We can easly do the maintenance here
Thread.sleep(1000);
} catch (InterruptedException e) {
// Ignore
@@ -1293,7 +1302,7 @@
continue;
}
}
- if (soTimeout > 0 && maintainTime > 1000000L) {
+ if (soTimeout > 0 && maintainTime > 1000000L && running) {
rv = Poll.maintain(serverPollset, desc, true);
maintainTime = 0;
if (rv > 0) {
@@ -1301,8 +1310,6 @@
for (int n = 0; n < rv; n++) {
// Close socket and clear pool
if (comet) {
- // FIXME: should really close in case of timeout ?
- // FIXME: maybe comet should use an extended timeout
processSocket(desc[n], true);
} else {
Socket.destroy(desc[n]);
@@ -1316,8 +1323,12 @@
}
- }
+ synchronized (this) {
+ this.notifyAll();
+ }
+ }
+
}
@@ -1523,6 +1534,16 @@
* Destroy the poller.
*/
protected void destroy() {
+ // Wait for polltime before doing anything, so that the poller threads
+ // exit, otherwise parallel descturction of sockets which are still
+ // in the poller can cause problems
+ try {
+ synchronized (this) {
+ this.wait(pollTime / 1000);
+ }
+ } catch (InterruptedException e) {
+ // Ignore
+ }
// Close any socket remaining in the add queue
for (int i = (addS.size() - 1); i >= 0; i--) {
SendfileData data = addS.get(i);
@@ -1725,6 +1746,10 @@
} catch (Throwable t) {
log.error(sm.getString("endpoint.poll.error"), t);
}
+ }
+
+ synchronized (this) {
+ this.notifyAll();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org