Mercurial > hg > truffle
comparison src/share/vm/prims/jvmtiEnvBase.hpp @ 14653:0d8d78c0329a
6471769: Error: assert(_cur_stack_depth == count_frames(),"cur_stack_depth out of sync")
Summary: It is more safe to get/update data for suspended threads at a safepoint
Reviewed-by: dcubed, twisti, dholmes
Contributed-by: serguei.spitsyn@oracle.com
author | sspitsyn |
---|---|
date | Sat, 01 Mar 2014 08:05:55 -0800 |
parents | 402677ca28ed |
children | 92aa6797d639 |
comparison
equal
deleted
inserted
replaced
14652:ef7328717719 | 14653:0d8d78c0329a |
---|---|
27 | 27 |
28 #include "classfile/classLoader.hpp" | 28 #include "classfile/classLoader.hpp" |
29 #include "prims/jvmtiEnvThreadState.hpp" | 29 #include "prims/jvmtiEnvThreadState.hpp" |
30 #include "prims/jvmtiEventController.hpp" | 30 #include "prims/jvmtiEventController.hpp" |
31 #include "prims/jvmtiThreadState.hpp" | 31 #include "prims/jvmtiThreadState.hpp" |
32 #include "prims/jvmtiThreadState.inline.hpp" | |
32 #include "runtime/fieldDescriptor.hpp" | 33 #include "runtime/fieldDescriptor.hpp" |
33 #include "runtime/frame.hpp" | 34 #include "runtime/frame.hpp" |
34 #include "runtime/handles.inline.hpp" | 35 #include "runtime/handles.inline.hpp" |
35 #include "runtime/thread.hpp" | 36 #include "runtime/thread.hpp" |
36 #include "runtime/vm_operations.hpp" | 37 #include "runtime/vm_operations.hpp" |
332 } | 333 } |
333 JvmtiEnv* first() { return JvmtiEnvBase::head_environment(); } | 334 JvmtiEnv* first() { return JvmtiEnvBase::head_environment(); } |
334 JvmtiEnv* next(JvmtiEnvBase* env) { return env->next_environment(); } | 335 JvmtiEnv* next(JvmtiEnvBase* env) { return env->next_environment(); } |
335 }; | 336 }; |
336 | 337 |
338 // VM operation to update for pop top frame. | |
339 class VM_UpdateForPopTopFrame : public VM_Operation { | |
340 private: | |
341 JvmtiThreadState* _state; | |
342 jvmtiError _result; | |
343 | |
344 public: | |
345 VM_UpdateForPopTopFrame(JvmtiThreadState* state) { | |
346 _state = state; | |
347 _result = JVMTI_ERROR_NONE; | |
348 } | |
349 VMOp_Type type() const { return VMOp_UpdateForPopTopFrame; } | |
350 jvmtiError result() { return _result; } | |
351 void doit() { | |
352 JavaThread* jt = _state->get_thread(); | |
353 if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { | |
354 _state->update_for_pop_top_frame(); | |
355 } else { | |
356 _result = JVMTI_ERROR_THREAD_NOT_ALIVE; | |
357 } | |
358 } | |
359 }; | |
360 | |
361 // VM operation to set frame pop. | |
362 class VM_SetFramePop : public VM_Operation { | |
363 private: | |
364 JvmtiEnv *_env; | |
365 JvmtiThreadState* _state; | |
366 jint _depth; | |
367 jvmtiError _result; | |
368 | |
369 public: | |
370 VM_SetFramePop(JvmtiEnv *env, JvmtiThreadState* state, jint depth) { | |
371 _env = env; | |
372 _state = state; | |
373 _depth = depth; | |
374 _result = JVMTI_ERROR_NONE; | |
375 } | |
376 // Nested operation must be allowed for the VM_EnterInterpOnlyMode that is | |
377 // called from the JvmtiEventControllerPrivate::recompute_thread_enabled. | |
378 bool allow_nested_vm_operations() const { return true; } | |
379 VMOp_Type type() const { return VMOp_SetFramePop; } | |
380 jvmtiError result() { return _result; } | |
381 void doit() { | |
382 JavaThread* jt = _state->get_thread(); | |
383 if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) { | |
384 int frame_number = _state->count_frames() - _depth; | |
385 _state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_pop(frame_number); | |
386 } else { | |
387 _result = JVMTI_ERROR_THREAD_NOT_ALIVE; | |
388 } | |
389 } | |
390 }; | |
391 | |
337 | 392 |
338 // VM operation to get monitor information with stack depth. | 393 // VM operation to get monitor information with stack depth. |
339 class VM_GetOwnedMonitorInfo : public VM_Operation { | 394 class VM_GetOwnedMonitorInfo : public VM_Operation { |
340 private: | 395 private: |
341 JvmtiEnv *_env; | 396 JvmtiEnv *_env; |