jvmtiEnvThreadState.hpp revision 3465:d2a62e0f25eb
1251881Speter/* 2251881Speter * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 3251881Speter * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4251881Speter * 5251881Speter * This code is free software; you can redistribute it and/or modify it 6251881Speter * under the terms of the GNU General Public License version 2 only, as 7251881Speter * published by the Free Software Foundation. 8251881Speter * 9251881Speter * This code is distributed in the hope that it will be useful, but WITHOUT 10251881Speter * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11251881Speter * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12251881Speter * version 2 for more details (a copy is included in the LICENSE file that 13251881Speter * accompanied this code). 14251881Speter * 15251881Speter * You should have received a copy of the GNU General Public License version 16251881Speter * 2 along with this work; if not, write to the Free Software Foundation, 17251881Speter * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18251881Speter * 19251881Speter * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20251881Speter * or visit www.oracle.com if you need additional information or have any 21251881Speter * questions. 22251881Speter * 23251881Speter */ 24251881Speter 25251881Speter#ifndef SHARE_VM_PRIMS_JVMTIENVTHREADSTATE_HPP 26251881Speter#define SHARE_VM_PRIMS_JVMTIENVTHREADSTATE_HPP 27251881Speter 28251881Speter#include "jvmtifiles/jvmti.h" 29251881Speter#include "memory/allocation.hpp" 30251881Speter#include "memory/allocation.inline.hpp" 31251881Speter#include "oops/instanceKlass.hpp" 32251881Speter#include "prims/jvmtiEventController.hpp" 33251881Speter#include "utilities/globalDefinitions.hpp" 34251881Speter#include "utilities/growableArray.hpp" 35251881Speter 36251881Speterclass JvmtiEnv; 37251881Speter 38251881Speter/////////////////////////////////////////////////////////////// 39251881Speter// 40251881Speter// class JvmtiFramePop 41251881Speter// Used by : JvmtiFramePops 42251881Speter// Used by JVMTI methods: none directly. 43251881Speter// 44251881Speter// Wrapper class for FramePop, used in the JvmtiFramePops class. 45251881Speter// 46251881Speter// Two problems: 1) this isn't being used as a ValueObj class, in 47251881Speter// several places there are constructors for it. 2) It seems like 48251881Speter// overkill as a means to get an assert and name the geater than 49251881Speter// operator. I'm trying to to rewrite everything. 50251881Speter 51251881Speterclass JvmtiFramePop VALUE_OBJ_CLASS_SPEC { 52251881Speter private: 53251881Speter // Frame number counting from BOTTOM (oldest) frame; 54251881Speter // bottom frame == #0 55251881Speter int _frame_number; 56251881Speter public: 57251881Speter JvmtiFramePop() {} 58251881Speter JvmtiFramePop(int frame_number) { 59251881Speter assert(frame_number >= 0, "invalid frame number"); 60251881Speter _frame_number = frame_number; 61251881Speter } 62251881Speter 63251881Speter int frame_number() { return _frame_number; } 64251881Speter int above_on_stack(JvmtiFramePop& other) { return _frame_number > other._frame_number; } 65251881Speter void print() PRODUCT_RETURN; 66251881Speter}; 67251881Speter 68251881Speter 69251881Speter/////////////////////////////////////////////////////////////// 70251881Speter// 71251881Speter// class JvmtiFramePops 72251881Speter// Used by : JvmtiThreadState 73251881Speter// Used by JVMTI methods: none directly. 74251881Speter// 75251881Speter// A collection of JvmtiFramePop. 76251881Speter// It records what frames on a threads stack should post frame_pop events when they're exited. 77251881Speter// 78251881Speter 79251881Speterclass JvmtiFramePops : public CHeapObj<mtInternal> { 80251881Speter private: 81251881Speter GrowableArray<int>* _pops; 82251881Speter 83251881Speter // should only be used by JvmtiEventControllerPrivate 84251881Speter // to insure they only occur at safepoints. 85251881Speter // Todo: add checks for safepoint 86251881Speter friend class JvmtiEventControllerPrivate; 87251881Speter void set(JvmtiFramePop& fp); 88251881Speter void clear(JvmtiFramePop& fp); 89251881Speter int clear_to(JvmtiFramePop& fp); 90251881Speter 91251881Speter public: 92251881Speter JvmtiFramePops(); 93251881Speter ~JvmtiFramePops(); 94251881Speter 95251881Speter bool contains(JvmtiFramePop& fp) { return _pops->contains(fp.frame_number()); } 96251881Speter int length() { return _pops->length(); } 97251881Speter void print() PRODUCT_RETURN; 98251881Speter}; 99251881Speter 100251881Speter 101251881Speter/////////////////////////////////////////////////////////////// 102// 103// class JvmtiEnvThreadState 104// 105// 2. Cache of pending frame_pop_events, created by NotifyFramePop 106// and lazily initialized. 107// 3: Location of last executed instruction, used to filter out duplicate 108// events due to instruction rewriting. 109 110class JvmtiEnvThreadState : public CHeapObj<mtInternal> { 111private: 112 friend class JvmtiEnv; 113 JavaThread *_thread; 114 JvmtiEnv *_env; 115 JvmtiEnvThreadState *_next; 116 jmethodID _current_method_id; 117 int _current_bci; 118 bool _breakpoint_posted; 119 bool _single_stepping_posted; 120 JvmtiEnvThreadEventEnable _event_enable; 121 void *_agent_thread_local_storage_data; // per env and per thread agent allocated data. 122 123 // Class used to store pending framepops. 124 // lazily initialized by get_frame_pops(); 125 JvmtiFramePops *_frame_pops; 126 127 inline void set_current_location(jmethodID method_id, int bci) { 128 _current_method_id = method_id; 129 _current_bci = bci; 130 } 131 132 friend class JvmtiEnvThreadStateIterator; 133 JvmtiEnvThreadState* next() { return _next; } 134 135 friend class JvmtiThreadState; 136 void set_next(JvmtiEnvThreadState* link) { _next = link; } 137 138public: 139 JvmtiEnvThreadState(JavaThread *thread, JvmtiEnvBase *env); 140 ~JvmtiEnvThreadState(); 141 142 bool is_enabled(jvmtiEvent event_type) { return _event_enable.is_enabled(event_type); } 143 144 JvmtiEnvThreadEventEnable *event_enable() { return &_event_enable; } 145 void *get_agent_thread_local_storage_data() { return _agent_thread_local_storage_data; } 146 void set_agent_thread_local_storage_data (void *data) { _agent_thread_local_storage_data = data; } 147 148 149 // If the thread is in the given method at the given 150 // location just return. Otherwise, reset the current location 151 // and reset _breakpoint_posted and _single_stepping_posted. 152 // _breakpoint_posted and _single_stepping_posted are only cleared 153 // here. 154 void compare_and_set_current_location(methodOop method, address location, jvmtiEvent event); 155 156 void clear_current_location() { set_current_location((jmethodID)NULL, 0); } 157 158 void reset_current_location(jvmtiEvent event, bool enabled); 159 160 inline void set_breakpoint_posted() { _breakpoint_posted = true; } 161 inline void set_single_stepping_posted() { 162 _single_stepping_posted = true; 163 } 164 inline bool breakpoint_posted() { return _breakpoint_posted; } 165 inline bool single_stepping_posted() { 166 return _single_stepping_posted; 167 } 168 169 inline JavaThread *get_thread() { return _thread; } 170 inline JvmtiEnv *get_env() { return _env; } 171 172 // lazily initialize _frame_pops 173 JvmtiFramePops* get_frame_pops(); 174 175 bool has_frame_pops(); 176 177 // quickly test whether we should deliver a frame pop event on return from sp 178 bool is_frame_pop(int cur_stack_depth); 179 180 void set_frame_pop(int frame_number); 181 void clear_frame_pop(int frame_number); 182 void clear_to_frame_pop(int frame_number); 183 184}; 185 186#endif // SHARE_VM_PRIMS_JVMTIENVTHREADSTATE_HPP 187