RFR: 8252406: Introduce Thread::as_Java_thread() convenience function [v5]
Kim Barrett
kim.barrett at oracle.com
Wed Sep 9 09:09:12 UTC 2020
Hi David. Thanks for clarifying some bits I was confused abut.
>> src/hotspot/share/jvmci/jvmciEnv.cpp
>> 243 void JVMCIEnv::describe_pending_exception(bool clear) {
>> 244 JavaThread* THREAD = JavaThread::current();
>> This change looks suspicious. The old code used Thread::current() here and
>> later cast to a JavaThread*. But that use and cast is conditional, and
>> might not be executed at all, depending on the result of !is_hotspot(). So
>> previously if !is_hotspot() then the current thread could be a non-JavaThread.
>> (At least locally; there could be things being called in the !is_hotspot()
>> case that also require a current JavaThread.)
>
> Yes - if you look at JNIAccessMark it manifests JavaThread::current() by default.
>
>> It also looks like the THREAD variable could be eliminated and it's one use
>> changed to JavaThread::current().
>
> Or I can keep it and also use it for the JNIAccessMark constructor.
I see; good.
>> src/hotspot/share/prims/jvm.cpp
>> 992 assert(THREAD->is_Java_thread(), "must be a JavaThread");
>> It's not obvious why this assert is being removed.
>
> The fact THREAD must be a JavaThread is already established by the JVM_ENTRY calls that then invoke this local method.
Right. I keep forgetting which of these macros does what with which kinds of threads.
>> src/hotspot/share/gc/shared/concurrentGCBreakpoints.cpp
>> 63 #define assert_Java_thread() \
>> 64 assert(Thread::current()->is_Java_thread(), "precondition")
>> 65
>> 66 void ConcurrentGCBreakpoints::run_to_idle_impl(bool acquiring_control) {
>> 67 assert_Java_thread();
>> 68 MonitorLocker ml(monitor());
>> =>
>> 63 void ConcurrentGCBreakpoints::run_to_idle_impl(bool acquiring_control) {
>> 64 MonitorLocker ml(JavaThread::current(), monitor());
>> and related later changes in this file.
>> I prefer the original code, which intentionally made the precondition check
>> explicit.
>
> The same precondition is already present in the use of JavaThread::current(). Is that not explicit enough? Plus the old code will manifest the current thread twice in debug builds. Cleaning up this kind of redundancy is one of the key aims here. :(
I'm not that concerned by a little redundant work in a debug build. I think
the explicit assert is clearer here. It removes the question for the future
reader of why it's asking for a JavaThread for the mutex locker, when any
thread can be used there. It's not obvious that the reason is to get the
associated assertion.
>> src/hotspot/share/runtime/objectMonitor.cpp
>> 1255 bool ObjectMonitor::reenter(intx recursions, TRAPS) {
>> 1256 Thread * const Self = THREAD;
>> 1257 JavaThread * jt = Self->as_Java_thread();
>> The only use of Self could just be THREAD, which is also used in this
>> function. And I don't see any references to jt at all here. Maybe that
>> should just be an `assert(THREAD->is_Java_thread(), "precondition");`.
>> Hm, there are other functions in this file that have a peculiar mix of
>> Self/THREAD usage and bound but unused jt.
>> Cleaning that up should probably be a separate task; this changeset is
>> already quite big enough!
>
> Right, I tried to avoid the temptation of dealing with the Self/THREAD/jt mess in this change. I have another RFE filed that will do further cleanup here:
>
> https://bugs.openjdk.java.net/browse/JDK-8252685
Good.
More information about the serviceability-dev
mailing list