[Red5commits] [2223] protect access to string cache

jbauch luke at codegent.com
Wed Jul 18 21:10:07 EDT 2007


protect access to string cache


Timestamp: 07/18/07 20:07:45 EST (less than one hour ago) 
Change: 2223 
Author: jbauch

Files (see diff or trac for details): 
java/server/trunk/src/org/red5/io/amf/Output.java
java/server/trunk/src/org/red5/io/amf3/Output.java


Trac: http://mirror1.cvsdude.com/trac/osflash/red5/changeset/2223

Index: /java/server/trunk/src/org/red5/io/amf3/Output.java
===================================================================
--- /java/server/trunk/src/org/red5/io/amf3/Output.java (revision 2222)
+++ /java/server/trunk/src/org/red5/io/amf3/Output.java (revision 2223)
@@ -137,4 +137,20 @@
 
 	/** {@inheritDoc} */
+    protected static byte[] encodeString(String string) {
+    	byte[] encoded;
+    	synchronized (stringCache) {
+    		encoded = stringCache.get(string);
+    	}
+    	if (encoded == null) {
+    		final java.nio.ByteBuffer strBuf = AMF3.CHARSET.encode(string);
+    		encoded = strBuf.array();
+    		synchronized (stringCache) {
+    			stringCache.put(string, encoded);
+    		}
+    	}
+    	return encoded;
+    }
+    
+	/** {@inheritDoc} */
 	protected void putString(String str, byte[] encoded) {
 		final int len = encoded.length;
@@ -160,10 +176,5 @@
 		}
 
-    	byte[] encoded = stringCache.get(string);
-    	if (encoded == null) {
-    		final java.nio.ByteBuffer strBuf = AMF3.CHARSET.encode(string);
-    		encoded = strBuf.array();
-    		stringCache.put(string, encoded);
-    	}
+    	final byte[] encoded = encodeString(string);
 		putString(string, encoded);
 	}
@@ -190,10 +201,5 @@
 			putInteger(1);
 		} else {
-	    	byte[] encoded = stringCache.get(string);
-	    	if (encoded == null) {
-	    		final java.nio.ByteBuffer strBuf = AMF3.CHARSET.encode(string);
-	    		encoded = strBuf.array();
-	    		stringCache.put(string, encoded);
-	    	}
+	    	final byte[] encoded = encodeString(string);
 			putString(string, encoded);
 		}
Index: /java/server/trunk/src/org/red5/io/amf/Output.java
===================================================================
--- /java/server/trunk/src/org/red5/io/amf/Output.java (revision 2222)
+++ /java/server/trunk/src/org/red5/io/amf/Output.java (revision 2223)
@@ -25,4 +25,5 @@
 import java.lang.reflect.Modifier;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -54,5 +55,5 @@
 	 * Cache encoded strings.
 	 */
-	protected static Map<String, byte[]> stringCache = new LRUMap(10000);
+	protected static Map<String, byte[]> stringCache = new LRUMap(10000, true);
 	
     /**
@@ -404,10 +405,5 @@
 	/** {@inheritDoc} */
     public void writeString(String string) {
-    	byte[] encoded = stringCache.get(string);
-    	if (encoded == null) {
-    		final java.nio.ByteBuffer strBuf = AMF.CHARSET.encode(string);
-    		encoded = strBuf.array();
-    		stringCache.put(string, encoded);
-    	}
+    	final byte[] encoded = encodeString(string);
 		final int len = encoded.length;
 		if (len < AMF.LONG_STRING_LENGTH) {
@@ -422,4 +418,25 @@
 
     /**
+     * Return encoded string.
+     * 
+     * @param string
+     * @return
+     */
+    protected static byte[] encodeString(String string) {
+    	byte[] encoded;
+    	synchronized (stringCache) {
+    		encoded = stringCache.get(string);
+    	}
+    	if (encoded == null) {
+    		final java.nio.ByteBuffer strBuf = AMF.CHARSET.encode(string);
+    		encoded = strBuf.array();
+    		synchronized (stringCache) {
+    			stringCache.put(string, encoded);
+    		}
+    	}
+    	return encoded;
+    }
+    
+    /**
      * Write out string
      * @param buf         Byte buffer to write to
@@ -427,10 +444,5 @@
      */
     public static void putString(ByteBuffer buf, String string) {
-    	byte[] encoded = stringCache.get(string);
-    	if (encoded == null) {
-    		final java.nio.ByteBuffer strBuf = AMF.CHARSET.encode(string);
-    		encoded = strBuf.array();
-    		stringCache.put(string, encoded);
-    	}
+    	final byte[] encoded = encodeString(string);
 		buf.putShort((short) encoded.length);
 		buf.put(encoded);


Note:
Diffs are chopped if more than 25k.
This is to get past the limit on the mailing list.



More information about the Red5commits mailing list