mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
6471769: Error: assert(_cur_stack_depth == count_frames(),"cur_stack_depth out of sync")
It is more safe to get/update data for suspended threads at a safepoint Reviewed-by: dcubed, twisti, dholmes
This commit is contained in:
parent
e1998b8813
commit
791b5d2b0d
6 changed files with 108 additions and 56 deletions
|
@ -29,6 +29,7 @@
|
|||
#include "prims/jvmtiEnvThreadState.hpp"
|
||||
#include "prims/jvmtiEventController.hpp"
|
||||
#include "prims/jvmtiThreadState.hpp"
|
||||
#include "prims/jvmtiThreadState.inline.hpp"
|
||||
#include "runtime/fieldDescriptor.hpp"
|
||||
#include "runtime/frame.hpp"
|
||||
#include "runtime/handles.inline.hpp"
|
||||
|
@ -334,6 +335,60 @@ class JvmtiEnvIterator : public StackObj {
|
|||
JvmtiEnv* next(JvmtiEnvBase* env) { return env->next_environment(); }
|
||||
};
|
||||
|
||||
// VM operation to update for pop top frame.
|
||||
class VM_UpdateForPopTopFrame : public VM_Operation {
|
||||
private:
|
||||
JvmtiThreadState* _state;
|
||||
jvmtiError _result;
|
||||
|
||||
public:
|
||||
VM_UpdateForPopTopFrame(JvmtiThreadState* state) {
|
||||
_state = state;
|
||||
_result = JVMTI_ERROR_NONE;
|
||||
}
|
||||
VMOp_Type type() const { return VMOp_UpdateForPopTopFrame; }
|
||||
jvmtiError result() { return _result; }
|
||||
void doit() {
|
||||
JavaThread* jt = _state->get_thread();
|
||||
if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) {
|
||||
_state->update_for_pop_top_frame();
|
||||
} else {
|
||||
_result = JVMTI_ERROR_THREAD_NOT_ALIVE;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// VM operation to set frame pop.
|
||||
class VM_SetFramePop : public VM_Operation {
|
||||
private:
|
||||
JvmtiEnv *_env;
|
||||
JvmtiThreadState* _state;
|
||||
jint _depth;
|
||||
jvmtiError _result;
|
||||
|
||||
public:
|
||||
VM_SetFramePop(JvmtiEnv *env, JvmtiThreadState* state, jint depth) {
|
||||
_env = env;
|
||||
_state = state;
|
||||
_depth = depth;
|
||||
_result = JVMTI_ERROR_NONE;
|
||||
}
|
||||
// Nested operation must be allowed for the VM_EnterInterpOnlyMode that is
|
||||
// called from the JvmtiEventControllerPrivate::recompute_thread_enabled.
|
||||
bool allow_nested_vm_operations() const { return true; }
|
||||
VMOp_Type type() const { return VMOp_SetFramePop; }
|
||||
jvmtiError result() { return _result; }
|
||||
void doit() {
|
||||
JavaThread* jt = _state->get_thread();
|
||||
if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) {
|
||||
int frame_number = _state->count_frames() - _depth;
|
||||
_state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_pop(frame_number);
|
||||
} else {
|
||||
_result = JVMTI_ERROR_THREAD_NOT_ALIVE;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// VM operation to get monitor information with stack depth.
|
||||
class VM_GetOwnedMonitorInfo : public VM_Operation {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue