equal
deleted
inserted
replaced
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() { |