You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/01/31 20:25:07 UTC

svn commit: r1441152 - in /tomcat/trunk/java/org/apache/tomcat/websocket: WsRemoteEndpointBase.java WsRemoteEndpointClient.java server/WsRemoteEndpointServer.java

Author: markt
Date: Thu Jan 31 19:25:07 2013
New Revision: 1441152

URL: http://svn.apache.org/viewvc?rev=1441152&view=rev
Log:
Rename and expand the header buffer to make it an output buffer prior to implementing masking and batching

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java
    tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointClient.java
    tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointServer.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java?rev=1441152&r1=1441151&r2=1441152&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointBase.java Thu Jan 31 19:25:07 2013
@@ -44,16 +44,15 @@ public abstract class WsRemoteEndpointBa
     private static final StringManager sm =
             StringManager.getManager(Constants.PACKAGE_NAME);
 
-    // TODO Make the size of this conversion buffer configurable
-    private final ByteBuffer toBytes = ByteBuffer.allocate(8192);
-    private final AtomicBoolean toBytesInProgress = new AtomicBoolean(false);
+    // TODO Make the size of these buffers configurable
+    private final ByteBuffer intermediateBuffer = ByteBuffer.allocate(8192);
+    protected final ByteBuffer outputBuffer = ByteBuffer.allocate(8192);
+    private final AtomicBoolean charToByteInProgress = new AtomicBoolean(false);
     private final CharsetEncoder encoder = Charset.forName("UTF8").newEncoder();
     private final MessageSendStateMachine state = new MessageSendStateMachine();
 
     private volatile long asyncSendTimeout = -1;
 
-    // Max length for WebSocket frame header is 14 bytes
-    protected final ByteBuffer header = ByteBuffer.allocate(14);
     protected ByteBuffer payload = null;
 
 
@@ -108,27 +107,29 @@ public abstract class WsRemoteEndpointBa
 
         // The toBytes buffer needs to be protected from multiple threads and
         // the state check happens to late.
-        if (!toBytesInProgress.compareAndSet(false, true)) {
+        if (!charToByteInProgress.compareAndSet(false, true)) {
             throw new IllegalStateException(sm.getString(
                     "wsRemoteEndpoint.concurrentMessageSend"));
         }
 
         try {
             encoder.reset();
-            toBytes.clear();
+            intermediateBuffer.clear();
             CharBuffer cb = CharBuffer.wrap(fragment);
-            CoderResult cr = encoder.encode(cb, toBytes, true);
-            toBytes.flip();
+            CoderResult cr = encoder.encode(cb, intermediateBuffer, true);
+            intermediateBuffer.flip();
             while (cr.isOverflow()) {
-                sendMessageBlocking(Constants.OPCODE_TEXT, toBytes, false);
-                toBytes.clear();
-                cr = encoder.encode(cb, toBytes, true);
-                toBytes.flip();
+                sendMessageBlocking(
+                        Constants.OPCODE_TEXT, intermediateBuffer, false);
+                intermediateBuffer.clear();
+                cr = encoder.encode(cb, intermediateBuffer, true);
+                intermediateBuffer.flip();
             }
-            sendMessageBlocking(Constants.OPCODE_TEXT, toBytes, isLast);
+            sendMessageBlocking(
+                    Constants.OPCODE_TEXT, intermediateBuffer, isLast);
         } finally {
             // Make sure flag is reset before method exists
-            toBytesInProgress.set(false);
+            charToByteInProgress.set(false);
         }
     }
 
@@ -206,7 +207,7 @@ public abstract class WsRemoteEndpointBa
 
         boolean isFirst = state.startMessage(opCode, isLast);
 
-        header.clear();
+        outputBuffer.clear();
         byte first = 0;
 
         if (isLast) {
@@ -220,37 +221,37 @@ public abstract class WsRemoteEndpointBa
         }
         // If not the first fragment, it is a continuation with opCode of zero
 
-        header.put(first);
+        outputBuffer.put(first);
 
         byte masked = getMasked();
 
         // Next write the mask && length length
         if (payload.limit() < 126) {
-            header.put((byte) (payload.limit() | masked));
+            outputBuffer.put((byte) (payload.limit() | masked));
         } else if (payload.limit() < 65536) {
-            header.put((byte) (126 | masked));
-            header.put((byte) (payload.limit() >>> 8));
-            header.put((byte) (payload.limit() & 0xFF));
+            outputBuffer.put((byte) (126 | masked));
+            outputBuffer.put((byte) (payload.limit() >>> 8));
+            outputBuffer.put((byte) (payload.limit() & 0xFF));
         } else {
             // Will never be more than 2^31-1
-            header.put((byte) (127 | masked));
-            header.put((byte) 0);
-            header.put((byte) 0);
-            header.put((byte) 0);
-            header.put((byte) 0);
-            header.put((byte) (payload.limit() >>> 24));
-            header.put((byte) (payload.limit() >>> 16));
-            header.put((byte) (payload.limit() >>> 8));
-            header.put((byte) (payload.limit() & 0xFF));
+            outputBuffer.put((byte) (127 | masked));
+            outputBuffer.put((byte) 0);
+            outputBuffer.put((byte) 0);
+            outputBuffer.put((byte) 0);
+            outputBuffer.put((byte) 0);
+            outputBuffer.put((byte) (payload.limit() >>> 24));
+            outputBuffer.put((byte) (payload.limit() >>> 16));
+            outputBuffer.put((byte) (payload.limit() >>> 8));
+            outputBuffer.put((byte) (payload.limit() & 0xFF));
         }
         if (masked != 0) {
             // TODO Mask the data properly
-            header.put((byte) 0);
-            header.put((byte) 0);
-            header.put((byte) 0);
-            header.put((byte) 0);
+            outputBuffer.put((byte) 0);
+            outputBuffer.put((byte) 0);
+            outputBuffer.put((byte) 0);
+            outputBuffer.put((byte) 0);
         }
-        header.flip();
+        outputBuffer.flip();
 
         sendMessage(handler);
     }

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointClient.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointClient.java?rev=1441152&r1=1441151&r2=1441152&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointClient.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointClient.java Thu Jan 31 19:25:07 2013
@@ -43,7 +43,7 @@ public class WsRemoteEndpointClient exte
             timeout = Long.MAX_VALUE;
 
         }
-        channel.write(new ByteBuffer[] {header, payload}, 0, 2,
+        channel.write(new ByteBuffer[] {outputBuffer, payload}, 0, 2,
                 getAsyncSendTimeout(), TimeUnit.MILLISECONDS, null, handler);
     }
 

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointServer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointServer.java?rev=1441152&r1=1441151&r2=1441152&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointServer.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/server/WsRemoteEndpointServer.java Thu Jan 31 19:25:07 2013
@@ -76,9 +76,9 @@ public class WsRemoteEndpointServer exte
                 if (!headerWritten) {
                     headerWritten = true;
                     size = Long.valueOf(
-                            header.remaining() + payload.remaining());
-                    sos.write(header.array(), header.arrayOffset(),
-                            header.limit());
+                            outputBuffer.remaining() + payload.remaining());
+                    sos.write(outputBuffer.array(), outputBuffer.arrayOffset(),
+                            outputBuffer.limit());
                 } else if (!payloadWritten) {
                     payloadWritten = true;
                     sos.write(payload.array(), payload.arrayOffset(),



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org