hotspot/src/share/vm/prims/jvmtiImpl.cpp
changeset 6975 dc9b63952682
parent 5547 f4b087cbb361
child 7123 523bb0f29d61
equal deleted inserted replaced
6971:11c11e616b91 6975:dc9b63952682
    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