agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java

Print this page




  27 import java.io.*;
  28 import java.util.*;
  29 import sun.jvm.hotspot.debugger.*;
  30 import sun.jvm.hotspot.oops.*;
  31 import sun.jvm.hotspot.types.*;
  32 import sun.jvm.hotspot.runtime.*;
  33 import sun.jvm.hotspot.utilities.*;
  34 
  35 public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
  36   static {
  37     VM.registerVMInitializedObserver(new Observer() {
  38         public void update(Observable o, Object data) {
  39           initialize(VM.getVM().getTypeDataBase());
  40         }
  41       });
  42   }
  43 
  44   private static synchronized void initialize(TypeDataBase db) {
  45     Type type = db.lookupType("SymbolTable");
  46     theTableField  = type.getAddressField("_the_table");

  47   }
  48 
  49   // Fields
  50   private static AddressField theTableField;



  51 
  52   // Accessors
  53   public static SymbolTable getTheTable() {
  54     Address tmp = theTableField.getValue();
  55     return (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp);



  56   }
  57 
  58   public SymbolTable(Address addr) {
  59     super(addr);
  60   }
  61 
  62   /** Clone of VM's "temporary" probe routine, as the SA currently
  63       does not support mutation so lookup() would have no effect
  64       anyway. Returns null if the given string is not in the symbol
  65       table. */
  66   public Symbol probe(String name) {
  67     try {
  68       return probe(toModifiedUTF8Bytes(name));
  69     } catch (IOException e) {
  70       return null;
  71     }
  72   }
  73 
  74   /** Clone of VM's "temporary" probe routine, as the SA currently
  75       does not support mutation so lookup() would have no effect
  76       anyway. Returns null if the given string is not in the symbol
  77       table. */
  78   public Symbol probe(byte[] name) {

  79     long hashValue = hashSymbol(name);
  80     for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) {
  81       if (e.hash() == hashValue) {
  82          Symbol sym = Symbol.create(e.literalValue());
  83          if (sym.equals(name)) {
  84            return sym;
  85          }
  86       }
  87     }
  88     return null;


  89   }
  90 
  91   public interface SymbolVisitor {
  92     public void visit(Symbol sym);
  93   }
  94 
  95   public void symbolsDo(SymbolVisitor visitor) {
  96     int numBuckets = tableSize();
  97     for (int i = 0; i < numBuckets; i++) {
  98       for (HashtableEntry e = (HashtableEntry) bucket(i); e != null;
  99            e = (HashtableEntry) e.next()) {
 100         visitor.visit(Symbol.create(e.literalValue()));
 101       }
 102     }
 103   }
 104 
 105   private static byte[] toModifiedUTF8Bytes(String name) throws IOException {
 106     ByteArrayOutputStream baos = new ByteArrayOutputStream();
 107     DataOutputStream dos = new DataOutputStream(baos);
 108     dos.writeUTF(name);


  27 import java.io.*;
  28 import java.util.*;
  29 import sun.jvm.hotspot.debugger.*;
  30 import sun.jvm.hotspot.oops.*;
  31 import sun.jvm.hotspot.types.*;
  32 import sun.jvm.hotspot.runtime.*;
  33 import sun.jvm.hotspot.utilities.*;
  34 
  35 public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
  36   static {
  37     VM.registerVMInitializedObserver(new Observer() {
  38         public void update(Observable o, Object data) {
  39           initialize(VM.getVM().getTypeDataBase());
  40         }
  41       });
  42   }
  43 
  44   private static synchronized void initialize(TypeDataBase db) {
  45     Type type = db.lookupType("SymbolTable");
  46     theTableField  = type.getAddressField("_the_table");
  47     sharedTableField = type.getAddressField("_shared_table");
  48   }
  49 
  50   // Fields
  51   private static AddressField theTableField;
  52   private static AddressField sharedTableField;
  53  
  54   private CompactHashTable sharedTable;
  55 
  56   // Accessors
  57   public static SymbolTable getTheTable() {
  58     Address tmp = theTableField.getValue();
  59     SymbolTable table = (SymbolTable) VMObjectFactory.newObject(SymbolTable.class, tmp);
  60     Address shared = sharedTableField.getStaticFieldAddress();
  61     table.sharedTable = (CompactHashTable)VMObjectFactory.newObject(CompactHashTable.class, shared);
  62     return table;
  63   }
  64 
  65   public SymbolTable(Address addr) {
  66     super(addr);
  67   }
  68 
  69   /** Clone of VM's "temporary" probe routine, as the SA currently
  70       does not support mutation so lookup() would have no effect
  71       anyway. Returns null if the given string is not in the symbol
  72       table. */
  73   public Symbol probe(String name) {
  74     try {
  75       return probe(toModifiedUTF8Bytes(name));
  76     } catch (IOException e) {
  77       return null;
  78     }
  79   }
  80 
  81   /** Clone of VM's "temporary" probe routine, as the SA currently
  82       does not support mutation so lookup() would have no effect
  83       anyway. Returns null if the given string is not in the symbol
  84       table. */
  85   public Symbol probe(byte[] name) {
  86     Symbol sym;
  87     long hashValue = hashSymbol(name);
  88     for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) {
  89       if (e.hash() == hashValue) {
  90          sym = Symbol.create(e.literalValue());
  91          if (sym.equals(name)) {
  92            return sym;
  93          }
  94       }
  95     }
  96 
  97     sym = sharedTable.probe(name, hashValue);
  98     return sym;
  99   }
 100 
 101   public interface SymbolVisitor {
 102     public void visit(Symbol sym);
 103   }
 104 
 105   public void symbolsDo(SymbolVisitor visitor) {
 106     int numBuckets = tableSize();
 107     for (int i = 0; i < numBuckets; i++) {
 108       for (HashtableEntry e = (HashtableEntry) bucket(i); e != null;
 109            e = (HashtableEntry) e.next()) {
 110         visitor.visit(Symbol.create(e.literalValue()));
 111       }
 112     }
 113   }
 114 
 115   private static byte[] toModifiedUTF8Bytes(String name) throws IOException {
 116     ByteArrayOutputStream baos = new ByteArrayOutputStream();
 117     DataOutputStream dos = new DataOutputStream(baos);
 118     dos.writeUTF(name);