119 assert((flock->box_node() == this) && flock->obj_node()->eqv_uncast(obj),""); 120 } 121 // Don't check monitor info in safepoints since the referenced object could 122 // be different from the locked object. It could be Phi node of different 123 // cast nodes which point to this locked object. 124 // We assume that no other objects could be referenced in monitor info 125 // associated with this BoxLock node because all associated locks and 126 // unlocks are reference only this one object. 127 } 128 #endif 129 if (unique_lock != NULL && has_one_lock) { 130 *unique_lock = lock; 131 } 132 return true; 133 } 134 135 //============================================================================= 136 //-----------------------------hash-------------------------------------------- 137 uint FastLockNode::hash() const { return NO_HASH; } 138 139 //------------------------------cmp-------------------------------------------- 140 uint FastLockNode::cmp( const Node &n ) const { 141 return (&n == this); // Always fail except on self 142 } 143 144 //============================================================================= 145 //-----------------------------hash-------------------------------------------- 146 uint FastUnlockNode::hash() const { return NO_HASH; } 147 148 //------------------------------cmp-------------------------------------------- 149 uint FastUnlockNode::cmp( const Node &n ) const { 150 return (&n == this); // Always fail except on self 151 } 152 153 // 154 // Create a counter which counts the number of times this lock is acquired 155 // 156 void FastLockNode::create_lock_counter(JVMState* state) { 157 BiasedLockingNamedCounter* blnc = (BiasedLockingNamedCounter*) 158 OptoRuntime::new_named_counter(state, NamedCounter::BiasedLockingCounter); 159 _counters = blnc->counters(); 160 } 161 162 //============================================================================= 163 //------------------------------do_monitor_enter------------------------------- 164 void Parse::do_monitor_enter() { 165 kill_dead_locals(); 166 167 // Null check; get casted pointer. 168 Node* obj = null_check(peek()); 169 // Check for locking null object 170 if (stopped()) return; 171 172 // the monitor object is not part of debug info expression stack 173 pop(); 174 175 // Insert a FastLockNode which takes as arguments the current thread pointer, 176 // the obj pointer & the address of the stack slot pair used for the lock. 177 shared_lock(obj); 178 } 179 180 //------------------------------do_monitor_exit-------------------------------- 181 void Parse::do_monitor_exit() { | 119 assert((flock->box_node() == this) && flock->obj_node()->eqv_uncast(obj),""); 120 } 121 // Don't check monitor info in safepoints since the referenced object could 122 // be different from the locked object. It could be Phi node of different 123 // cast nodes which point to this locked object. 124 // We assume that no other objects could be referenced in monitor info 125 // associated with this BoxLock node because all associated locks and 126 // unlocks are reference only this one object. 127 } 128 #endif 129 if (unique_lock != NULL && has_one_lock) { 130 *unique_lock = lock; 131 } 132 return true; 133 } 134 135 //============================================================================= 136 //-----------------------------hash-------------------------------------------- 137 uint FastLockNode::hash() const { return NO_HASH; } 138 139 uint FastLockNode::size_of() const { return sizeof(*this); } 140 141 //------------------------------cmp-------------------------------------------- 142 uint FastLockNode::cmp( const Node &n ) const { 143 return (&n == this); // Always fail except on self 144 } 145 146 //============================================================================= 147 //-----------------------------hash-------------------------------------------- 148 uint FastUnlockNode::hash() const { return NO_HASH; } 149 150 //------------------------------cmp-------------------------------------------- 151 uint FastUnlockNode::cmp( const Node &n ) const { 152 return (&n == this); // Always fail except on self 153 } 154 155 // 156 // Create a counter which counts the number of times this lock is acquired 157 // 158 void FastLockNode::create_lock_counter(JVMState* state) { 159 BiasedLockingNamedCounter* blnc = (BiasedLockingNamedCounter*) 160 OptoRuntime::new_named_counter(state, NamedCounter::BiasedLockingCounter); 161 _counters = blnc->counters(); 162 } 163 164 void FastLockNode::create_rtm_lock_counter(JVMState* state) { 165 #if INCLUDE_RTM_OPT 166 Compile* C = Compile::current(); 167 if (C->profile_rtm() || (PrintPreciseRTMLockingStatistics && C->use_rtm())) { 168 RTMLockingNamedCounter* rlnc = (RTMLockingNamedCounter*) 169 OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter); 170 _rtmcounters = rlnc->counters(); 171 if (UseRTMForStackLocks) { 172 rlnc = (RTMLockingNamedCounter*) 173 OptoRuntime::new_named_counter(state, NamedCounter::RTMLockingCounter); 174 _stackrtmcounters = rlnc->counters(); 175 } 176 } 177 #endif 178 } 179 180 //============================================================================= 181 //------------------------------do_monitor_enter------------------------------- 182 void Parse::do_monitor_enter() { 183 kill_dead_locals(); 184 185 // Null check; get casted pointer. 186 Node* obj = null_check(peek()); 187 // Check for locking null object 188 if (stopped()) return; 189 190 // the monitor object is not part of debug info expression stack 191 pop(); 192 193 // Insert a FastLockNode which takes as arguments the current thread pointer, 194 // the obj pointer & the address of the stack slot pair used for the lock. 195 shared_lock(obj); 196 } 197 198 //------------------------------do_monitor_exit-------------------------------- 199 void Parse::do_monitor_exit() { |