From: <ls...@us...> - 2009-03-01 09:15:36
|
Revision: 5078 http://jnode.svn.sourceforge.net/jnode/?rev=5078&view=rev Author: lsantha Date: 2009-03-01 09:15:24 +0000 (Sun, 01 Mar 2009) Log Message: ----------- Improved String interning. Modified Paths: -------------- trunk/core/src/core/org/jnode/util/BootableHashMap.java trunk/core/src/core/org/jnode/vm/VmSystemObject.java trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java trunk/core/src/core/org/jnode/vm/classmgr/Signature.java trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java trunk/core/src/core/org/jnode/vm/classmgr/VmType.java trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java trunk/core/src/openjdk/vm/java/lang/NativeString.java Added Paths: ----------- trunk/core/src/core/org/jnode/vm/InternString.java Modified: trunk/core/src/core/org/jnode/util/BootableHashMap.java =================================================================== --- trunk/core/src/core/org/jnode/util/BootableHashMap.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/util/BootableHashMap.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -250,4 +250,7 @@ locked = true; } + public boolean isLocked() { + return locked; + } } Added: trunk/core/src/core/org/jnode/vm/InternString.java =================================================================== --- trunk/core/src/core/org/jnode/vm/InternString.java (rev 0) +++ trunk/core/src/core/org/jnode/vm/InternString.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -0,0 +1,48 @@ +package org.jnode.vm; + +import org.jnode.util.BootableHashMap; + +/** + * + */ +public class InternString extends VmSystemObject { + private static BootableHashMap<String, String> bootInternTable; + private static boolean booted = false; + + public static String internString(String instance) { + if (booted) { + return instance.intern(); + } else { + if (Vm.getVm().isBootstrap()) { + if (bootInternTable == null) { + bootInternTable = new BootableHashMap<String, String>(); + } + + instance = instance.intern(); + //todo the string interned after emiting bootInternTable will be lost + if (!bootInternTable.isLocked()) { + synchronized (bootInternTable) { + final String str = bootInternTable.get(instance); + if (str != null) { + return str; + } + bootInternTable.put(instance, instance); + } + } + return instance; + } else { + return instance.intern(); + } + } + } + + //todo protect it + public static void boot() { + booted = true; + } + + //todo protect it + public static BootableHashMap<String, String> getBootInternTable() { + return bootInternTable; + } +} Modified: trunk/core/src/core/org/jnode/vm/VmSystemObject.java =================================================================== --- trunk/core/src/core/org/jnode/vm/VmSystemObject.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/VmSystemObject.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -43,7 +43,7 @@ res.append(Integer.toHexString(ch)); } } - return res.toString().intern(); + return InternString.internString(res.toString()); } /** @@ -64,7 +64,7 @@ res.append(v.length()); res.append(v); } - return res.toString().intern(); + return InternString.internString(res.toString()); } /** Modified: trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -22,6 +22,7 @@ import org.jnode.util.BootableHashMap; import org.jnode.vm.VmSystemObject; +import org.jnode.vm.InternString; /** * This class is used to maintain a mapping between a method signature (name+type) @@ -42,7 +43,7 @@ * @return The global unique selector */ public int get(String name, String signature) { - final String id = (name + '#' + signature).intern(); + final String id = InternString.internString(name + '#' + signature); final Integer selector = (Integer) map.get(id); if (selector != null) { return selector.intValue(); Modified: trunk/core/src/core/org/jnode/vm/classmgr/Signature.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/Signature.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/Signature.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -23,6 +23,7 @@ import java.util.ArrayList; import org.jnode.vm.JvmType; +import org.jnode.vm.InternString; /** * <description> @@ -247,8 +248,8 @@ } } ofs++; - String sig = new String(signature, start, ofs - start).intern() - .replace('/', '.'); + String sig = new String(signature, start, ofs - start).replace('/', '.'); + sig = InternString.internString(sig); vmClass = loader.loadClass(sig, true); break; } @@ -258,8 +259,8 @@ while (signature[ofs] != ';') { ofs++; } - String sig = new String(signature, start, ofs - start).intern() - .replace('/', '.'); + String sig = new String(signature, start, ofs - start).replace('/', '.'); + sig = InternString.internString(sig); ofs++; vmClass = loader.loadClass(sig, true); break; Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -21,6 +21,7 @@ package org.jnode.vm.classmgr; import org.jnode.vm.VmSystemObject; +import org.jnode.vm.InternString; /** * A VmCP is the runtime representation of a constant pool @@ -162,7 +163,7 @@ } protected void setUTF8(int index, String value) { - set(index, value.intern()); + set(index, InternString.internString(value)); } public VmConstString getString(int index) { Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -20,6 +20,8 @@ package org.jnode.vm.classmgr; +import org.jnode.vm.InternString; + /** * Entry of a constantpool describing a class reference. * @@ -38,7 +40,7 @@ * @param name */ VmConstClass(String name) { - this.data = name.replace('/', '.').intern(); + this.data = InternString.internString(name.replace('/', '.')); } /** Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -21,6 +21,7 @@ package org.jnode.vm.classmgr; import org.jnode.vm.annotation.KernelSpace; +import org.jnode.vm.InternString; import org.vmmagic.pragma.Uninterruptible; /** @@ -68,7 +69,7 @@ if (Modifier.isWide(signature)) { modifiers |= Modifier.ACC_WIDE; } - this.name = name.intern(); //todo review interning, this might not be needed here + this.name = InternString.internString(name); //todo review interning, this might not be needed here this.signature = signature; this.modifiers = modifiers; this.declaringClass = declaringClass; Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -27,6 +27,7 @@ import org.jnode.vm.LoadCompileService; import org.jnode.vm.Vm; import org.jnode.vm.VmAddress; +import org.jnode.vm.InternString; import org.jnode.vm.annotation.MagicPermission; import org.jnode.vm.isolate.VmIsolateLocal; import org.vmmagic.unboxed.Address; @@ -254,8 +255,8 @@ */ public final String getMangledName() { if (mangledName == null) { - mangledName = (declaringClass.getMangledName() - + mangle("#" + getName() + '.' + getSignature())).intern(); + mangledName = InternString.internString(declaringClass.getMangledName() + + mangle("#" + getName() + '.' + getSignature())); } return mangledName; } Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmType.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/VmType.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/VmType.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -38,6 +38,7 @@ import org.jnode.vm.VmMagic; import org.jnode.vm.VmReflection; import org.jnode.vm.VmSystemClassLoader; +import org.jnode.vm.InternString; import org.jnode.vm.annotation.Inline; import org.jnode.vm.annotation.KernelSpace; import org.jnode.vm.annotation.LoadStatics; @@ -313,10 +314,9 @@ } } - this.name = name.intern(); + this.name = InternString.internString(name); this.superClass = superClass; - this.superClassName = (superClassName == null) ? null : superClassName - .intern(); + this.superClassName = (superClassName == null) ? null : InternString.internString(superClassName); this.modifiers = modifiers; this.state = VmTypeState.ST_LOADED; this.loader = loader; @@ -507,7 +507,7 @@ result[i + 2] = name.charAt(i); } } - arrayClassName = new String(result).intern(); + arrayClassName = InternString.internString(new String(result)); } return arrayClassName; } Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java =================================================================== --- trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -22,6 +22,7 @@ import java.io.UTFDataFormatException; import java.nio.ByteBuffer; +import org.jnode.vm.InternString; /** * VM_UTF8Convert @@ -127,7 +128,7 @@ + i); } } - return new String(result, 0, result_index).intern(); + return InternString.internString(new String(result, 0, result_index)); } /** Modified: trunk/core/src/openjdk/vm/java/lang/NativeString.java =================================================================== --- trunk/core/src/openjdk/vm/java/lang/NativeString.java 2009-03-01 08:55:23 UTC (rev 5077) +++ trunk/core/src/openjdk/vm/java/lang/NativeString.java 2009-03-01 09:15:24 UTC (rev 5078) @@ -17,25 +17,53 @@ * along with this library; If not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - + package java.lang; import java.lang.ref.WeakReference; import java.util.WeakHashMap; +import org.jnode.vm.InternString; +import org.jnode.vm.annotation.SharedStatics; +import org.jnode.util.BootableHashMap; + /** * */ +@SharedStatics public class NativeString { - static final WeakHashMap<String, WeakReference<String>> internTable = new WeakHashMap<String, WeakReference<String>>(); + static final WeakHashMap<String, WeakReference<String>> internTable = + new WeakHashMap<String, WeakReference<String>>(); + static boolean booted = false; + //keeps live refrences to the string in bootheap + //TODO cleanup might still be good in case the bootiamge builder interns unnecessary strings + static BootableHashMap<String, String> bootInternTable; + static void boot() { + bootInternTable = InternString.getBootInternTable(); + for (String instance : bootInternTable.values()) { + final WeakReference<String> ref = internTable.get(instance); + if(ref == null) { + internTable.put(instance, new WeakReference<String>(instance)); + } else { + final String s = ref.get(); + if(s == null) { + internTable.put(instance, new WeakReference<String>(instance)); + } + } + } + InternString.boot(); + } + /** - * - * @param instance - * @return - * @see String#intern() + * @see String#intern() */ private static String intern(String instance){ synchronized (internTable) { + if(!booted) { + boot(); + booted = true; + } + final WeakReference<String> ref = internTable.get(instance); if (ref != null) { final String s = ref.get(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |