23 */ |
23 */ |
24 |
24 |
25 # include "incls/_precompiled.incl" |
25 # include "incls/_precompiled.incl" |
26 # include "incls/_jvmtiImpl.cpp.incl" |
26 # include "incls/_jvmtiImpl.cpp.incl" |
27 |
27 |
28 GrowableArray<JvmtiRawMonitor*> *JvmtiPendingMonitors::_monitors = new (ResourceObj::C_HEAP) GrowableArray<JvmtiRawMonitor*>(1,true); |
|
29 |
|
30 void JvmtiPendingMonitors::transition_raw_monitors() { |
|
31 assert((Threads::number_of_threads()==1), |
|
32 "Java thread has not created yet or more than one java thread \ |
|
33 is running. Raw monitor transition will not work"); |
|
34 JavaThread *current_java_thread = JavaThread::current(); |
|
35 assert(current_java_thread->thread_state() == _thread_in_vm, "Must be in vm"); |
|
36 { |
|
37 ThreadBlockInVM __tbivm(current_java_thread); |
|
38 for(int i=0; i< count(); i++) { |
|
39 JvmtiRawMonitor *rmonitor = monitors()->at(i); |
|
40 int r = rmonitor->raw_enter(current_java_thread); |
|
41 assert(r == ObjectMonitor::OM_OK, "raw_enter should have worked"); |
|
42 } |
|
43 } |
|
44 // pending monitors are converted to real monitor so delete them all. |
|
45 dispose(); |
|
46 } |
|
47 |
|
48 // |
28 // |
49 // class JvmtiAgentThread |
29 // class JvmtiAgentThread |
50 // |
30 // |
51 // JavaThread used to wrap a thread started by an agent |
31 // JavaThread used to wrap a thread started by an agent |
52 // using the JVMTI method RunAgentThread. |
32 // using the JVMTI method RunAgentThread. |
213 // recompute the new cache value after GC |
193 // recompute the new cache value after GC |
214 for (int i=0; i<len; i++) { |
194 for (int i=0; i<len; i++) { |
215 _cache[i] = _elements->at(i)->getCacheValue(); |
195 _cache[i] = _elements->at(i)->getCacheValue(); |
216 } |
196 } |
217 } |
197 } |
218 |
|
219 |
|
220 // |
|
221 // class JvmtiRawMonitor |
|
222 // |
|
223 |
|
224 JvmtiRawMonitor::JvmtiRawMonitor(const char *name) { |
|
225 #ifdef ASSERT |
|
226 _name = strcpy(NEW_C_HEAP_ARRAY(char, strlen(name) + 1), name); |
|
227 #else |
|
228 _name = NULL; |
|
229 #endif |
|
230 _magic = JVMTI_RM_MAGIC; |
|
231 } |
|
232 |
|
233 JvmtiRawMonitor::~JvmtiRawMonitor() { |
|
234 #ifdef ASSERT |
|
235 FreeHeap(_name); |
|
236 #endif |
|
237 _magic = 0; |
|
238 } |
|
239 |
|
240 |
|
241 bool |
|
242 JvmtiRawMonitor::is_valid() { |
|
243 int value = 0; |
|
244 |
|
245 // This object might not be a JvmtiRawMonitor so we can't assume |
|
246 // the _magic field is properly aligned. Get the value in a safe |
|
247 // way and then check against JVMTI_RM_MAGIC. |
|
248 |
|
249 switch (sizeof(_magic)) { |
|
250 case 2: |
|
251 value = Bytes::get_native_u2((address)&_magic); |
|
252 break; |
|
253 |
|
254 case 4: |
|
255 value = Bytes::get_native_u4((address)&_magic); |
|
256 break; |
|
257 |
|
258 case 8: |
|
259 value = Bytes::get_native_u8((address)&_magic); |
|
260 break; |
|
261 |
|
262 default: |
|
263 guarantee(false, "_magic field is an unexpected size"); |
|
264 } |
|
265 |
|
266 return value == JVMTI_RM_MAGIC; |
|
267 } |
|
268 |
|
269 |
198 |
270 // |
199 // |
271 // class JvmtiBreakpoint |
200 // class JvmtiBreakpoint |
272 // |
201 // |
273 |
202 |