< prev index next >

src/hotspot/share/runtime/synchronizer.cpp

Print this page
rev 47287 : Port 09.17.Thread_SMR_logging_update from JDK9 to JDK10


 879     return self->is_lock_owned((address)mark->locker()) ?
 880       owner_self : owner_other;
 881   }
 882 
 883   // CASE: inflated. Mark (tagged pointer) points to an objectMonitor.
 884   // The Object:ObjectMonitor relationship is stable as long as we're
 885   // not at a safepoint.
 886   if (mark->has_monitor()) {
 887     void * owner = mark->monitor()->_owner;
 888     if (owner == NULL) return owner_none;
 889     return (owner == self ||
 890             self->is_lock_owned((address)owner)) ? owner_self : owner_other;
 891   }
 892 
 893   // CASE: neutral
 894   assert(mark->is_neutral(), "sanity check");
 895   return owner_none;           // it's unlocked
 896 }
 897 
 898 // FIXME: jvmti should call this
 899 JavaThread* ObjectSynchronizer::get_lock_owner(Handle h_obj, bool doLock) {
 900   if (UseBiasedLocking) {
 901     if (SafepointSynchronize::is_at_safepoint()) {
 902       BiasedLocking::revoke_at_safepoint(h_obj);
 903     } else {
 904       BiasedLocking::revoke_and_rebias(h_obj, false, JavaThread::current());
 905     }
 906     assert(!h_obj->mark()->has_bias_pattern(), "biases should be revoked by now");
 907   }
 908 
 909   oop obj = h_obj();
 910   address owner = NULL;
 911 
 912   markOop mark = ReadStableMark(obj);
 913 
 914   // Uncontended case, header points to stack
 915   if (mark->has_locker()) {
 916     owner = (address) mark->locker();
 917   }
 918 
 919   // Contended case, header points to ObjectMonitor (tagged pointer)
 920   if (mark->has_monitor()) {
 921     ObjectMonitor* monitor = mark->monitor();
 922     assert(monitor != NULL, "monitor should be non-null");
 923     owner = (address) monitor->owner();
 924   }
 925 
 926   if (owner != NULL) {
 927     // owning_thread_from_monitor_owner() may also return NULL here
 928     return Threads::owning_thread_from_monitor_owner(owner, doLock);
 929   }
 930 
 931   // Unlocked case, header in place
 932   // Cannot have assertion since this object may have been
 933   // locked by another thread when reaching here.
 934   // assert(mark->is_neutral(), "sanity check");
 935 
 936   return NULL;
 937 }
 938 
 939 // Visitors ...
 940 
 941 void ObjectSynchronizer::monitors_iterate(MonitorClosure* closure) {
 942   PaddedEnd<ObjectMonitor> * block =
 943     (PaddedEnd<ObjectMonitor> *)OrderAccess::load_ptr_acquire(&gBlockList);
 944   while (block != NULL) {
 945     assert(block->object() == CHAINMARKER, "must be a block header");
 946     for (int i = _BLOCKSIZE - 1; i > 0; i--) {
 947       ObjectMonitor* mid = (ObjectMonitor *)(block + i);
 948       oop object = (oop)mid->object();




 879     return self->is_lock_owned((address)mark->locker()) ?
 880       owner_self : owner_other;
 881   }
 882 
 883   // CASE: inflated. Mark (tagged pointer) points to an objectMonitor.
 884   // The Object:ObjectMonitor relationship is stable as long as we're
 885   // not at a safepoint.
 886   if (mark->has_monitor()) {
 887     void * owner = mark->monitor()->_owner;
 888     if (owner == NULL) return owner_none;
 889     return (owner == self ||
 890             self->is_lock_owned((address)owner)) ? owner_self : owner_other;
 891   }
 892 
 893   // CASE: neutral
 894   assert(mark->is_neutral(), "sanity check");
 895   return owner_none;           // it's unlocked
 896 }
 897 
 898 // FIXME: jvmti should call this
 899 JavaThread* ObjectSynchronizer::get_lock_owner(ThreadsList * t_list, Handle h_obj) {
 900   if (UseBiasedLocking) {
 901     if (SafepointSynchronize::is_at_safepoint()) {
 902       BiasedLocking::revoke_at_safepoint(h_obj);
 903     } else {
 904       BiasedLocking::revoke_and_rebias(h_obj, false, JavaThread::current());
 905     }
 906     assert(!h_obj->mark()->has_bias_pattern(), "biases should be revoked by now");
 907   }
 908 
 909   oop obj = h_obj();
 910   address owner = NULL;
 911 
 912   markOop mark = ReadStableMark(obj);
 913 
 914   // Uncontended case, header points to stack
 915   if (mark->has_locker()) {
 916     owner = (address) mark->locker();
 917   }
 918 
 919   // Contended case, header points to ObjectMonitor (tagged pointer)
 920   if (mark->has_monitor()) {
 921     ObjectMonitor* monitor = mark->monitor();
 922     assert(monitor != NULL, "monitor should be non-null");
 923     owner = (address) monitor->owner();
 924   }
 925 
 926   if (owner != NULL) {
 927     // owning_thread_from_monitor_owner() may also return NULL here
 928     return Threads::owning_thread_from_monitor_owner(t_list, owner);
 929   }
 930 
 931   // Unlocked case, header in place
 932   // Cannot have assertion since this object may have been
 933   // locked by another thread when reaching here.
 934   // assert(mark->is_neutral(), "sanity check");
 935 
 936   return NULL;
 937 }
 938 
 939 // Visitors ...
 940 
 941 void ObjectSynchronizer::monitors_iterate(MonitorClosure* closure) {
 942   PaddedEnd<ObjectMonitor> * block =
 943     (PaddedEnd<ObjectMonitor> *)OrderAccess::load_ptr_acquire(&gBlockList);
 944   while (block != NULL) {
 945     assert(block->object() == CHAINMARKER, "must be a block header");
 946     for (int i = _BLOCKSIZE - 1; i > 0; i--) {
 947       ObjectMonitor* mid = (ObjectMonitor *)(block + i);
 948       oop object = (oop)mid->object();


< prev index next >