On Mon, 22 Feb 2021 01:37:25 GMT, David Holmes <[email protected]> wrote:

>> Daniel D. Daugherty has updated the pull request incrementally with one 
>> additional commit since the last revision:
>> 
>>   Address dholmes-ora CR1 comments.
>
> src/hotspot/share/compiler/compileBroker.cpp line 1115:
> 
>> 1113:       if (ct == NULL) break;
>> 1114:       ThreadsListHandle tlh;
>> 1115:       assert(tlh.includes(ct), "ct=" INTPTR_FORMAT " exited 
>> unexpectedly.", p2i(ct));
> 
> This seems to be the fully dynamic case. Here the TLH is potentially racing 
> with thread termination and so may or may not capture ct. Rather than an 
> assertion the call to  `get_thread_name()` below should be guarded by 
> `tlh.includes(ct)`.

Agreed. Here's the new block:

      JavaThread *ct = make_thread(compiler_t, compiler2_object(i), 
_c2_compile_queue, _compilers[1], THREAD);
      if (ct == NULL) break;
      ThreadsListHandle tlh;
      if (!tlh.includes(ct)) break;
      _compilers[1]->set_num_compiler_threads(i + 1);
So we "break" if the `tlh` doesn't include the JavaThread which is the same
behavior as when `ct == NULL)`. Please note that I followed the existing
code style of putting the if-statement break on a single line.

> src/hotspot/share/compiler/compileBroker.cpp line 1136:
> 
>> 1134:       if (ct == NULL) break;
>> 1135:       ThreadsListHandle tlh;
>> 1136:       assert(tlh.includes(ct), "ct=" INTPTR_FORMAT " exited 
>> unexpectedly.", p2i(ct));
> 
> Ditto - the assert is not appropriate for this case.

Ditto for the resolution.

> src/hotspot/share/runtime/thread.cpp line 485:
> 
>> 483: #endif
>> 484: 
>> 485: // Is the target JavaThread protected by the calling Thread:
> 
> s/calling/current/ ?
> 
> We could also expand this to clarify that even if a target JavaThread is not 
> explicitly protected by the current thread it can still be safe to access if 
> the two threads engage in a suitable protocol.

That comment used to be:

`// Is the target JavaThread protected by this Thread:`

so I changed it to "the calling Thread" because I wanted it to be clear that
we're checking to see if the Thread that's calling is_JavaThread_protected()
is protecting the target JavaThread. I didn't use "current" because I thought
"calling" would be more clear.

I could add more comments about the target JavaThread being possibly
protected by other protocols, but I thought that might raise questions
about why the code doesn't check for those things and I didn't want to
go down that rabbit hole...

> src/hotspot/share/runtime/thread.cpp line 2568:
> 
>> 2566:   // this->is_handshake_safe_for() may crash, but we have debug bits 
>> so...
>> 2567:   assert(SafepointSynchronize::is_at_safepoint() ||
>> 2568:          this->is_handshake_safe_for(current_thread), "JavaThread="
> 
> I agree this is a pre-existing bug as accessing `this` may not be safe if the 
> target is not protected. But if we crash attempting the access that implies 
> the assert failed so ...

... that will tell us that we have a spot in the code where a TLH is
missing once we've analyzed the crash. So are you okay with this
assert() having a bug since the original assert has the same bug?

> src/hotspot/share/services/management.cpp line 848:
> 
>> 846:   {
>> 847:     JavaThreadIteratorWithHandle jtiwh;
>> 848:     Threads::threads_do(&jtiwh, &vmtcc);
> 
> I'm not sure this is at all necessary. Threads::add and Threads::remove still 
> use the Threads_lock so this code is safe as it stands. Switching to  use 
> JTIWH may be an alternative, and may even be desirable, but that hasn't been 
> established, and is not necessary for safety and so seems outside the scope 
> of this bug IMO.

Holding the Threads_lock is no longer being considered as
proper protection for the JavaThread::get_thread_name() call
so I had to change the code to use a JavaThreadIteratorWithHandle
so that we have the protection of the TLH. That closure eventually
gets us down to a JavaThread::get_thread_name() call...

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

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

Reply via email to