hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java
changeset 2526 39a58a50be35
parent 764 67578bc37423
child 2861 073fc25fed0c
equal deleted inserted replaced
2364:7c9f46e9d37c 2526:39a58a50be35
    46   private static AddressField  anchorField;
    46   private static AddressField  anchorField;
    47   private static AddressField  lastJavaSPField;
    47   private static AddressField  lastJavaSPField;
    48   private static AddressField  lastJavaPCField;
    48   private static AddressField  lastJavaPCField;
    49   private static CIntegerField threadStateField;
    49   private static CIntegerField threadStateField;
    50   private static AddressField  osThreadField;
    50   private static AddressField  osThreadField;
       
    51   private static AddressField  stackBaseField;
       
    52   private static CIntegerField stackSizeField;
    51 
    53 
    52   private static JavaThreadPDAccess access;
    54   private static JavaThreadPDAccess access;
    53 
    55 
    54   // JavaThreadStates read from underlying process
    56   // JavaThreadStates read from underlying process
    55   private static int           UNINITIALIZED;
    57   private static int           UNINITIALIZED;
    81     anchorField       = type.getAddressField("_anchor");
    83     anchorField       = type.getAddressField("_anchor");
    82     lastJavaSPField   = anchorType.getAddressField("_last_Java_sp");
    84     lastJavaSPField   = anchorType.getAddressField("_last_Java_sp");
    83     lastJavaPCField   = anchorType.getAddressField("_last_Java_pc");
    85     lastJavaPCField   = anchorType.getAddressField("_last_Java_pc");
    84     threadStateField  = type.getCIntegerField("_thread_state");
    86     threadStateField  = type.getCIntegerField("_thread_state");
    85     osThreadField     = type.getAddressField("_osthread");
    87     osThreadField     = type.getAddressField("_osthread");
       
    88     stackBaseField    = type.getAddressField("_stack_base");
       
    89     stackSizeField    = type.getCIntegerField("_stack_size");
    86 
    90 
    87     UNINITIALIZED     = db.lookupIntConstant("_thread_uninitialized").intValue();
    91     UNINITIALIZED     = db.lookupIntConstant("_thread_uninitialized").intValue();
    88     NEW               = db.lookupIntConstant("_thread_new").intValue();
    92     NEW               = db.lookupIntConstant("_thread_new").intValue();
    89     NEW_TRANS         = db.lookupIntConstant("_thread_new_trans").intValue();
    93     NEW_TRANS         = db.lookupIntConstant("_thread_new_trans").intValue();
    90     IN_NATIVE         = db.lookupIntConstant("_thread_in_native").intValue();
    94     IN_NATIVE         = db.lookupIntConstant("_thread_in_native").intValue();
   310 
   314 
   311   public OSThread getOSThread() {
   315   public OSThread getOSThread() {
   312     return (OSThread) VMObjectFactory.newObject(OSThread.class, osThreadField.getValue(addr));
   316     return (OSThread) VMObjectFactory.newObject(OSThread.class, osThreadField.getValue(addr));
   313   }
   317   }
   314 
   318 
       
   319   public Address getStackBase() {
       
   320     return stackBaseField.getValue();
       
   321   }
       
   322 
       
   323   public long getStackSize() {
       
   324     return stackSizeField.getValue();
       
   325   }
       
   326 
   315   /** Gets the Java-side thread object for this JavaThread */
   327   /** Gets the Java-side thread object for this JavaThread */
   316   public Oop getThreadObj() {
   328   public Oop getThreadObj() {
   317     return VM.getVM().getObjectHeap().newOop(threadObjField.getValue(addr));
   329     return VM.getVM().getObjectHeap().newOop(threadObjField.getValue(addr));
   318   }
   330   }
   319 
   331 
   343 
   355 
   344   public boolean isInStack(Address a) {
   356   public boolean isInStack(Address a) {
   345     if (Assert.ASSERTS_ENABLED) {
   357     if (Assert.ASSERTS_ENABLED) {
   346       Assert.that(VM.getVM().isDebugging(), "Not yet implemented for non-debugging system");
   358       Assert.that(VM.getVM().isDebugging(), "Not yet implemented for non-debugging system");
   347     }
   359     }
   348     Address highest = highestLock();
       
   349     Address sp      = lastSPDbg();
   360     Address sp      = lastSPDbg();
       
   361     Address stackBase = getStackBase();
   350     // Be robust
   362     // Be robust
   351     if ((highest == null) || (sp == null)) return false;
   363     if (sp == null) return false;
   352     return (highest.greaterThanOrEqual(a) && sp.lessThanOrEqual(a));
   364     return stackBase.greaterThanOrEqual(a) && sp.lessThanOrEqual(a);
       
   365   }
       
   366 
       
   367   public boolean isLockOwned(Address a) {
       
   368     Address stackBase = getStackBase();
       
   369     Address stackLimit = stackBase.addOffsetTo(-getStackSize());
       
   370 
       
   371     return stackBase.greaterThanOrEqual(a) && stackLimit.lessThanOrEqual(a);
   353 
   372 
   354     // FIXME: should traverse MonitorArray/MonitorChunks as in VM
   373     // FIXME: should traverse MonitorArray/MonitorChunks as in VM
   355   }
   374   }
   356 
   375 
   357   public Oop getCurrentParkBlocker() {
   376   public Oop getCurrentParkBlocker() {