request for review (S): 6814943: getcpool001 catches more than one JvmtiThreadState problem
Keith McGuigan
keith.mcguigan at oracle.com
Mon Jan 10 17:18:02 PST 2011
On Jan 10, 2011, at 7:07 PM, David Holmes wrote:
> Hi Keith,
>
> Keith McGuigan said the following on 01/11/11 03:36:
>> This closes a race condition hole between
>> JvmtiThreadState::state_for_while_locked() and ~JavaThread().
>> Without this, the state_for_while_locked() could see a value of
>> false for thread->is_exiting(), then the entirety of ~JavaThread()
>> could run, the state_for_while_locked() could then finish leaving
>> the JvmtiThreadState referring to a zombie thread.
>> webrev: http://cr.openjdk.java.net/~kamg/6814943/webrev.00/
>
> I think it would be slightly cleaner, as per my private email, to
> keep the locking internal to the JVMTI methods ie:
>
> void
> JvmtiEventControllerPrivate::thread_ended(JavaThread *thread) {
> // Removes the JvmtiThreadState associated with the specified thread.
> // May be called after all environments have been disposed.
>
> EC_TRACE(("JVMTI [%s] # thread ended",
> JvmtiTrace::safe_get_thread_name(thread)));
> MutexLocker mu(JvmtiThreadState_lock);
> JvmtiThreadState *state = thread->jvmti_thread_state();
> if (state != NULL) {
> delete state;
> }
> }
>
> and then in JavaThread::exit just do:
>
> if (JvmtiEnv::environments_might_exist()) {
> JvmtiExport::cleanup_thread(this);
> }
>
> as cleanup_thread already does a null check. Note that if an
> environment comes into existence we are still relying on another
> thread seeing that this thread has terminated prior to the above
> check.
Sure that sounds reasonable. I'll change the code to do that.
Thanks!
--
- Keith
More information about the serviceability-dev
mailing list