> Please consider this change which removes the manual transitions to blocked.
> This adds a preprocess template/functor which is executed in the destructor 
> of 'ThreadBlockInVM' if we are going to do any processing.
> This gives us a way to backout of the object/raw monitor before suspend or 
> other processing, such as a safepoint.
> 
> The object monitor code could be straight forward changed to use this instead 
> of manual transitions.
> 
> Raw monitors on the other hand are a bit more complicated due to 'implicit' 
> rules (consequences of the specs).
> Added a comment in hpp trying to explain it; we cannot simply transition with 
> a raw monitor held.
> This caused the change in the destructor ~ThreadInVMfromNative() (this 
> specific change have also been tested in unrelated exploration of 
> transition), now this RAII does the same as we do when going to native from 
> Java, just setting the state.
> Since we are going from an unsafe state, in VM, to a safe state, in native, 
> we do not need to check the poll.
> That made it possible to careful use ThreadInVMfromNative in raw monitors.
> 
> I also remove the early CAS in raw_enter.
> We lock a lock to do a CAS, in the uncontended case means CAS on lock then 
> CAS raw monitor.
> Now we instead do a transitions, in the uncontended case means fence, CAS raw 
> monitor, fence.
> (multiple fence (CAS is also a fence) very close to each other have little 
> additional performance impact on contemporary hardware)
> 
> Passes t1-t7 and manual stressing relevant test groups.

Robbin Ehn has updated the pull request incrementally with one additional 
commit since the last revision:

  Final fixes: last famous words

-------------

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/3875/files
  - new: https://git.openjdk.java.net/jdk/pull/3875/files/6faf1422..cc15431e

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=3875&range=05
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=3875&range=04-05

  Stats: 2 lines in 2 files changed: 1 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk/pull/3875.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/3875/head:pull/3875

PR: https://git.openjdk.java.net/jdk/pull/3875

Reply via email to