Skip to content

Commit

Permalink
Change PollerEvent to reference the socket wrapper
Browse files Browse the repository at this point in the history
This forces going through it rather than keep around a NioChannel, and
is safer.
Inspired by 45aeed6
  • Loading branch information
rmaucher committed Nov 20, 2020
1 parent 8bb2553 commit e024807
Showing 1 changed file with 16 additions and 18 deletions.
34 changes: 16 additions & 18 deletions java/org/apache/tomcat/util/net/NioEndpoint.java
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ protected boolean setSocketOptions(SocketChannel socket) {
socketWrapper.setReadTimeout(getConnectionTimeout());
socketWrapper.setWriteTimeout(getConnectionTimeout());
socketWrapper.setKeepAliveLeft(NioEndpoint.this.getMaxKeepAliveRequests());
poller.register(channel, socketWrapper);
poller.register(socketWrapper);
return true;
} catch (Throwable t) {
ExceptionUtils.handleThrowable(t);
Expand Down Expand Up @@ -429,20 +429,20 @@ protected SocketProcessorBase<NioChannel> createSocketProcessor(
*/
public static class PollerEvent {

private NioChannel socket;
private NioSocketWrapper socketWrapper;
private int interestOps;

public PollerEvent(NioChannel ch, int intOps) {
reset(ch, intOps);
public PollerEvent(NioSocketWrapper socketWrapper, int intOps) {
reset(socketWrapper, intOps);
}

public void reset(NioChannel ch, int intOps) {
socket = ch;
public void reset(NioSocketWrapper socketWrapper, int intOps) {
this.socketWrapper = socketWrapper;
interestOps = intOps;
}

public NioChannel getSocket() {
return socket;
public NioSocketWrapper getSocketWrapper() {
return socketWrapper;
}

public int getInterestOps() {
Expand All @@ -455,7 +455,7 @@ public void reset() {

@Override
public String toString() {
return "Poller event: socket [" + socket + "], socketWrapper [" + socket.getSocketWrapper() +
return "Poller event: socket [" + socketWrapper.getSocket() + "], socketWrapper [" + socketWrapper +
"], interestOps [" + interestOps + "]";
}
}
Expand Down Expand Up @@ -519,9 +519,9 @@ public void add(NioSocketWrapper socketWrapper, int interestOps) {
r = eventCache.pop();
}
if (r == null) {
r = new PollerEvent(socketWrapper.getSocket(), interestOps);
r = new PollerEvent(socketWrapper, interestOps);
} else {
r.reset(socketWrapper.getSocket(), interestOps);
r.reset(socketWrapper, interestOps);
}
addEvent(r);
if (close) {
Expand All @@ -541,9 +541,8 @@ public boolean events() {
PollerEvent pe = null;
for (int i = 0, size = events.size(); i < size && (pe = events.poll()) != null; i++ ) {
result = true;
NioChannel channel = pe.getSocket();
SocketChannel sc = channel.getIOChannel();
NioSocketWrapper socketWrapper = channel.getSocketWrapper();
NioSocketWrapper socketWrapper = pe.getSocketWrapper();
SocketChannel sc = socketWrapper.getSocket().getIOChannel();
int interestOps = pe.getInterestOps();
if (sc == null) {
log.warn(sm.getString("endpoint.nio.nullSocketChannel"));
Expand Down Expand Up @@ -593,19 +592,18 @@ public boolean events() {
/**
* Registers a newly created socket with the poller.
*
* @param socket The newly created socket
* @param socketWrapper The socket wrapper
*/
public void register(final NioChannel socket, final NioSocketWrapper socketWrapper) {
public void register(final NioSocketWrapper socketWrapper) {
socketWrapper.interestOps(SelectionKey.OP_READ);//this is what OP_REGISTER turns into.
PollerEvent event = null;
if (eventCache != null) {
event = eventCache.pop();
}
if (event == null) {
event = new PollerEvent(socket, OP_REGISTER);
event = new PollerEvent(socketWrapper, OP_REGISTER);
} else {
event.reset(socket, OP_REGISTER);
event.reset(socketWrapper, OP_REGISTER);
}
addEvent(event);
}
Expand Down

0 comments on commit e024807

Please sign in to comment.