RFR (S/T): 8231737: Cleanup JvmtiRawMonitor code

David Holmes david.holmes at oracle.com
Tue Oct 8 05:03:59 UTC 2019


On 8/10/2019 2:57 pm, serguei.spitsyn at oracle.com wrote:
> Hi David,
> 
> Thank you for making the changes!
> 
> Initially, I did not notice there are several spots with a wrong indent:

Well spotted! I thought I had done a global re-indent - oops. Fixed now.

Thanks,
David

> 124 if (Atomic::replace_if_null(self, &_owner)) {
> 125 return;
>   126     }
>   ...
> 136 if (_owner == NULL && Atomic::replace_if_null(self, &_owner)) {
> 137 _entryList = node._next;
> 138 RawMonitor_lock->unlock();
> 139 return;
>   140     }
> 141 RawMonitor_lock->unlock();
> 142 while (node.tState == QNode::TS_ENTER) {
> 143 self->_ParkEvent->park();
>   144     }
>   ...
> 
>   158   if (w != NULL) {
> 159 _entryList = w->_next;
>   160   }
> 161 RawMonitor_lock->unlock();
>   162   if (w != NULL) {
> 163 guarantee(w ->tState == QNode::TS_ENTER, "invariant");
> 164 // Once we set tState to TS_RUN the waiting thread can complete
> 165 // simpleEnter and 'w' is pointing into random stack space. So we have
>   166       // to ensure we extract the ParkEvent (which is in type-stable memory)
>   167       // before we set the state, and then don't access 'w'.
> 168 ParkEvent* ev = w->_event;
>   169       OrderAccess::loadstore();
> 170 w->tState = QNode::TS_RUN;
> 171 OrderAccess::fence();
> 172 ev->unpark();
>   173   }
>   ...
>   250   for (;;) {
> 251 QNode* w = _waitSet;
> 252 if (w == NULL) break;
> 253 _waitSet = w->_next;
> 254 if (ev != NULL) {
> 255 ev->unpark();
> 256 ev = NULL;
> 257 }
> 258 ev = w->_event;
> 259 OrderAccess::loadstore();
> 260 w->tState = QNode::TS_RUN;
>   261       OrderAccess::storeload();
> 262 if (!all) {
> 263 break;
> 264 }
> 265 } ... 294 if (contended == self) {
> 295 _recursions++;
> 296 return;
>   297   }
>   298
> 299 if (contended == NULL) {
> 300 guarantee(_owner == self, "invariant");
> 301 guarantee(_recursions == 0, "invariant");
> 302 return;
>   303   }
>   ...
> 307 if (!self->is_Java_thread()) {
> 308 simpleEnter(self);
>   309   } else {
> 
> 
> Thanks,
> Serguei
> 
> 
> On 10/7/19 21:42, David Holmes wrote:
>> Hi Serguei,
>>
>> On 8/10/2019 2:18 pm, serguei.spitsyn at oracle.com wrote:
>>> Hi David,
>>>
>>> Looks good in general.
>>
>> Thanks for looking at it.
>>
>>> A couple of places still need a cleanup.
>>>
>>> http://cr.openjdk.java.net/~dholmes/8231737/webrev/src/hotspot/share/prims/jvmtiRawMonitor.hpp.frames.html 
>>>
>>>
>>>
>>> QNode pointer is not unified:
>>>
>>> 47 QNode * volatile _next;
>>> 48 QNode * volatile _prev;
>>> 68 void simpleEnter(Thread * self) ;
>>> 69 void simpleExit(Thread * self) ;
>>> but:53 QNode(Thread* thread); 56 Thread* volatile _owner; // pointer 
>>> to owning thread 58 QNode* volatile _entryList; // Threads blocked on 
>>> entry or reentry.
>>>     61 QNode* volatile _waitSet; // Threads wait()ing on the monitor 
>>> There are more places where a space is placed or not between the type 
>>> name and the '*'.
>>
>> Okay I have switched everything to the:
>>
>> type* var
>>
>> style. It seems most prevelant based on a grep for "Thread* t" type 
>> usage.
>>
>>> Missed space before ';':
>>>
>>> 68 void simpleEnter(Thread * self) ;
>>> 69 void simpleExit(Thread * self) ;
>>> 70 int simpleWait(Thread * self, jlong millis) ;
>>> 71 void simpleNotify(Thread * self, bool all) ;
>>
>> Fixed.
>>
>>> http://cr.openjdk.java.net/~dholmes/8231737/webrev/src/hotspot/share/prims/jvmtiRawMonitor.cpp.frames.html 
>>>
>>>
>>> Space is not needed after the cast: 280 jt = (JavaThread*) self; 370 
>>> jt = (JavaThread*) self;
>>>
>>> Other places do not have it:
>>>
>>> 150 OrderAccess::release_store(&_owner, (Thread*)NULL); 288 contended 
>>> = Atomic::cmpxchg(jt, &_owner, (Thread*)NULL); 291 contended = 
>>> Atomic::cmpxchg(self, &_owner, (Thread*)NULL);
>>
>> Fixed.
>>
>> webrev updated in place.
>>
>> Thanks,
>> David
>> -----
>>
>>>
>>> Thanks,
>>> Serguei
>>>
>>>
>>> On 10/7/19 18:58, David Holmes wrote:
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8231737
>>>> webrev: http://cr.openjdk.java.net/~dholmes/8231737/webrev/
>>>>
>>>> Stylistic code cleanup of JvmtiRawMonitor code as previously promised:
>>>> - Self -> self
>>>> - SimpleX -> simpleX
>>>> - Contended -> contended
>>>> - Node -> node
>>>> - TState -> tState (variable name)
>>>> - _WaitSet -> _waitSet
>>>> - _EntryList -> _entryList;
>>>> - All -> all
>>>> - remove extra space before ( in function calls
>>>> - remove extra space before ;
>>>> - remove extra space before ++ and --
>>>> - add spaces around binary operators
>>>> - use { } on all blocks
>>>> - use one statement per line.
>>>> - fix indent and alignment (ie remove artificial alignment)
>>>>
>>>> Probably simplest to look at new code and see if it looks okay 
>>>> rather than trying to spot each individual change. :)
>>>>
>>>> Thanks,
>>>> David
>>>
> 


More information about the serviceability-dev mailing list