mturk 2005/04/23 08:57:24 Modified: util/java/org/apache/tomcat/util/net AprEndpoint.java Log: Make Senfile usable. Sendfile should be added to the poller, only if it returns EAGAIN status. In any other case the poller will break. Revision Changes Path 1.15 +31 -9 jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java Index: AprEndpoint.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/AprEndpoint.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- AprEndpoint.java 20 Apr 2005 16:13:23 -0000 1.14 +++ AprEndpoint.java 23 Apr 2005 15:57:24 -0000 1.15 @@ -839,7 +839,6 @@ } else if (rv < 0) { // FIXME: Log with WARN at least // Handle poll critical failure - Pool.clear(serverSockPool); synchronized (this) { destroy(); init(); @@ -1023,7 +1022,6 @@ protected long pool = 0; protected long[] desc; protected HashMap sendfileData; - protected void init() { pool = Pool.create(serverSockPool); try { @@ -1063,12 +1061,36 @@ | File.APR_FOPEN_SENDFILE_ENABLED | File.APR_FOPEN_BINARY, 0, data.fdpool); data.pos = data.start; + // Set the socket to nonblocking mode + Socket.optSet(socket, Socket.APR_SO_NONBLOCK, 1); + int nw = Socket.sendfile(socket, data.fd, null, null, + data.pos, (int)data.end, 0); + if (nw < 0) { + if (!Status.APR_STATUS_IS_EAGAIN(-nw)) { + Poll.destroy(data.pool); + return; + } + } + else { + data.pos = data.pos + nw; + if (data.pos >= data.end) { + // Entire file has been send + Poll.destroy(data.pool); + return; + } + else { + //FIXME: Ether EAGAIN of full data should be returned + Poll.destroy(data.pool); + return; + } + } } catch (Error e) { // FIXME: more appropriate logging e.printStackTrace(); return; } synchronized (this) { + // Add socket to the poller sendfileData.put(new Long(socket), data); int rv = Poll.add(sendfilePollset, socket, 0, Poll.APR_POLLOUT); if (rv == Status.APR_SUCCESS) { @@ -1088,6 +1110,8 @@ if (rv == Status.APR_SUCCESS) { sendfileCount--; } + // Set the socket to blocking mode again + Socket.optSet(socket, Socket.APR_SO_NONBLOCK, 0); sendfileData.remove(new Long(socket)); } } @@ -1138,18 +1162,18 @@ continue; } // Write some data using sendfile - int nw = Socket.sendfilet(desc[n*4+1], state.fd, - null, null, state.pos, - (int) (state.end - state.pos), 0, 0); + int nw = Socket.sendfile(desc[n*4+1], state.fd, + null, null, state.pos, + (int) (state.end - state.pos), 0); if (nw < 0) { // Close socket and clear pool remove(desc[n*4+1]); - // Destroy file descriptor pool, which should close the file - Pool.destroy(state.fdpool); // Close the socket, as the reponse would be incomplete + // This will close the file too. Pool.destroy(state.pool); continue; } + state.pos = state.pos + nw; if (state.pos >= state.end) { remove(desc[n*4+1]); @@ -1163,7 +1187,6 @@ } else if (rv < 0) { // Handle poll critical failure // FIXME: Log with WARN at least - Pool.clear(serverSockPool); synchronized (this) { destroy(); init(); @@ -1173,7 +1196,6 @@ // FIXME: Proper logging t.printStackTrace(); } - } // Notify the threadStop() method that we have shut ourselves down
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]