src/share/vm/runtime/synchronizer.cpp

Print this page




 796   }
 797 
 798   oop obj = h_obj();
 799   address owner = NULL;
 800 
 801   markOop mark = ReadStableMark (obj) ;
 802 
 803   // Uncontended case, header points to stack
 804   if (mark->has_locker()) {
 805     owner = (address) mark->locker();
 806   }
 807 
 808   // Contended case, header points to ObjectMonitor (tagged pointer)
 809   if (mark->has_monitor()) {
 810     ObjectMonitor* monitor = mark->monitor();
 811     assert(monitor != NULL, "monitor should be non-null");
 812     owner = (address) monitor->owner();
 813   }
 814 
 815   if (owner != NULL) {

 816     return Threads::owning_thread_from_monitor_owner(owner, doLock);
 817   }
 818 
 819   // Unlocked case, header in place
 820   // Cannot have assertion since this object may have been
 821   // locked by another thread when reaching here.
 822   // assert(mark->is_neutral(), "sanity check");
 823 
 824   return NULL;
 825 }
 826 // Visitors ...
 827 
 828 void ObjectSynchronizer::monitors_iterate(MonitorClosure* closure) {
 829   ObjectMonitor* block = gBlockList;
 830   ObjectMonitor* mid;
 831   while (block) {
 832     assert(block->object() == CHAINMARKER, "must be a block header");
 833     for (int i = _BLOCKSIZE - 1; i > 0; i--) {
 834       mid = block + i;
 835       oop object = (oop) mid->object();




 796   }
 797 
 798   oop obj = h_obj();
 799   address owner = NULL;
 800 
 801   markOop mark = ReadStableMark (obj) ;
 802 
 803   // Uncontended case, header points to stack
 804   if (mark->has_locker()) {
 805     owner = (address) mark->locker();
 806   }
 807 
 808   // Contended case, header points to ObjectMonitor (tagged pointer)
 809   if (mark->has_monitor()) {
 810     ObjectMonitor* monitor = mark->monitor();
 811     assert(monitor != NULL, "monitor should be non-null");
 812     owner = (address) monitor->owner();
 813   }
 814 
 815   if (owner != NULL) {
 816     // owning_thread_from_monitor_owner() may also return NULL here
 817     return Threads::owning_thread_from_monitor_owner(owner, doLock);
 818   }
 819 
 820   // Unlocked case, header in place
 821   // Cannot have assertion since this object may have been
 822   // locked by another thread when reaching here.
 823   // assert(mark->is_neutral(), "sanity check");
 824 
 825   return NULL;
 826 }
 827 // Visitors ...
 828 
 829 void ObjectSynchronizer::monitors_iterate(MonitorClosure* closure) {
 830   ObjectMonitor* block = gBlockList;
 831   ObjectMonitor* mid;
 832   while (block) {
 833     assert(block->object() == CHAINMARKER, "must be a block header");
 834     for (int i = _BLOCKSIZE - 1; i > 0; i--) {
 835       mid = block + i;
 836       oop object = (oop) mid->object();