RFR 8054494: Remove sun.misc.Unsafe.monitorEnter, monitorExit and tryMonitorEnter
Paul Sandoz
paul.sandoz at oracle.com
Mon Jan 12 09:26:38 UTC 2015
On Jan 12, 2015, at 1:51 AM, David Holmes <david.holmes at oracle.com> wrote:
> Hi Paul,
>
> On 10/01/2015 1:52 AM, Paul Sandoz wrote:
>> Hi,
>>
>> http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8054494-dev-unsafe-monitor-remove/webrev/
>>
>> This "forest" webrev [*] removes the monitor related methods from Unsafe.
>
> Overall looks good to me. For hotspot runtime we also require copyright notices be updated.
>
Thanks, i updated locally.
>> The temptation to cleanup code in unsafe.cpp was resisted. I gather now that HotSpot Express no longer exists the grouping of registered native methods can be cleaned up plus there is dead code related to prefetch support. I propose to cleanup in a future patch.
>
> Yep lots of historical baggage in there.
>
>> The monitor methods resurface on WhiteBox because i noticed some associated Unsafe usages within hotspot Java tests. Rather than attempting to change such tests i thought it better to move the existing functionality.
>
> Unfortunate. :(
>
Although serendipitously it might be possible to avoid such WB methods, see below.
>> Now that WhiteBox has moved to the top level repository i could update ProcessBuilder/Basic.java to use WhiteBox. I held off doing that for now (it seems a little involved to get the relevant classes on the classpath for the executing tests with such a dependency).
>
> I think using WB would be a lot clearer/cleaner than what you had to implement to determine when the lock was held!
>
Yeah, i might take another swing at that.
When i rebased my repos this morning I had to update due to the integration of:
https://bugs.openjdk.java.net/browse/JDK-8050486
which added a method to WhiteBox, isMonitorInflated, and hotspot/test/compiler/testlibrary/rtm/AbortProvoker.java was updated to not use Unsafe. So that leaves just hotspot/test/compiler/testlibrary/rtm/BusyLock.java using tryMonitorEnter and monitorExit:
66 if (WB.tryMonitorEnter(monitor)) {
67 try {
68 barrier.await();
69 Thread.sleep(timeout);
70 } finally {
71 WB.monitorExit(monitor);
72 }
73 } else {
74 throw new RuntimeException("Monitor should be entered by " +
75 "::run() first.");
76 }
Could we replace that with:
if (!WB.isMonitorHeld(monitor)) {
synchronized(monitor) {
...
}
} else {
...
}
?
If so we would no longer require any updates to white box and i could also remove ObjectSynchronizer::jni_try_enter method. Plus jdk/test/java/lang/ProcessBuilder/Basic.java could be updated to use WB.isMonitorHeld method.
Filipp, I noticed you provided the fix for JDK-8050486 so perhaps you may know if BusyLock can be updated as suggested.
> Also the:
>
> System.out.println(thread.getState());
>
> seems to be leftover debugging code?
>
Removed locally.
>> A JPRT job using the hotspot testset passed. Is that the correct testset to use?
>
> Yes. It also has to be used when doing the forest push.
>
How does one do that?
Paul.
More information about the hotspot-runtime-dev
mailing list