}
- public void recycle() {
+ /**
+ * Recycle the processor, ready for the next request which may be on the
+ * same connection or a different connection.
+ *
+ * @param socketClosing Indicates if the socket is about to be closed
+ * allowing the processor to perform any additional
+ * clean-up that may be required
+ */
+ public void recycle(boolean socketClosing) {
asyncStateMachine.recycle();
// Recycle Request object
request.updateCounters();
rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE);
- recycle();
+ recycle(false);
}
rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);
* Recycle the processor.
*/
@Override
- public void recycle() {
- super.recycle();
+ public void recycle(boolean socketClosing) {
+ super.recycle(socketClosing);
inputBuffer.clear();
inputBuffer.limit(0);
} else if (state == SocketState.OPEN){
// In keep-alive but between requests. OK to recycle
// processor. Continue to poll for the next request.
- processor.recycle();
+ processor.recycle(false);
recycledProcessors.offer(processor);
((AprEndpoint)proto.endpoint).getPoller().add(
socket.getSocket().longValue());
} else {
- processor.recycle();
+ processor.recycle(true);
recycledProcessors.offer(processor);
}
return state;
// less-than-verbose logs.
log.error(sm.getString("ajpprotocol.proto.error"), e);
}
- processor.recycle();
+ processor.recycle(true);
recycledProcessors.offer(processor);
return SocketState.CLOSED;
}
} catch (IOException e) {
error = true;
}
- recycle();
+ recycle(true);
continue;
} else if(type != Constants.JK_AJP13_FORWARD_REQUEST) {
// Usually the servlet didn't read the previous request body
if(log.isDebugEnabled()) {
log.debug("Unexpected message: "+type);
}
- recycle();
+ recycle(false);
continue;
}
request.setStartTime(System.currentTimeMillis());
socket.setTimeout(keepAliveTimeout);
}
- recycle();
+ recycle(true);
}
rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);
if (entry.getKey().getSocket().getIOChannel()==socket) {
it.remove();
AjpNioProcessor result = entry.getValue();
- result.recycle();
+ result.recycle(true);
unregister(result);
released = true;
break;
/**
* Use this only if the processor is not available, otherwise use
- * {@link #release(SocketWrapper, AjpNioProcessor)}.
+ * {@link #release(SocketWrapper, AjpNioProcessor, boolean)}.
*/
@Override
public void release(SocketWrapper<NioChannel> socket) {
AjpNioProcessor processor = connections.remove(socket);
if (processor != null) {
- processor.recycle();
+ processor.recycle(true);
recycledProcessors.offer(processor);
}
}
public void release(SocketWrapper<NioChannel> socket,
- AjpNioProcessor processor) {
+ AjpNioProcessor processor, boolean isSocketClosing) {
connections.remove(socket);
- processor.recycle();
+ processor.recycle(isSocketClosing);
recycledProcessors.offer(processor);
}
} else if (state == SocketState.OPEN){
// In keep-alive but between requests. OK to recycle
// processor. Continue to poll for the next request.
- release(socket, processor);
+ release(socket, processor, false);
socket.getSocket().getPoller().add(socket.getSocket());
} else {
// Connection closed. OK to recycle the processor.
- release(socket, processor);
+ release(socket, processor, true);
}
return state;
// less-than-verbose logs.
log.error(sm.getString("ajpprotocol.proto.error"), e);
}
- release(socket, processor);
+ release(socket, processor, true);
return SocketState.CLOSED;
}
request.updateCounters();
rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE);
- recycle();
+ recycle(false);
}
rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);
}
@Override
- public void recycle() {
- super.recycle();
- input = null;
- output = null;
+ public void recycle(boolean socketClosing) {
+ super.recycle(socketClosing);
+ if (socketClosing) {
+ input = null;
+ output = null;
+ }
}
// ----------------------------------------------------- ActionHook Methods
if (state == SocketState.LONG) {
connections.put(socket, processor);
+ } else if (state == SocketState.OPEN){
+ processor.recycle(false);
+ recycledProcessors.offer(processor);
} else {
- processor.recycle();
+ processor.recycle(true);
recycledProcessors.offer(processor);
}
return state;
// less-than-verbose logs.
log.error(sm.getString("ajpprotocol.proto.error"), e);
}
- processor.recycle();
+ processor.recycle(true);
recycledProcessors.offer(processor);
return SocketState.CLOSED;
}