re PR libgcj/22211 ([4.0 only] Thread.interrupt sometimes causes abort if thread is already dead)

PR libgcj/22211:
	* testsuite/libjava.lang/pr22211.java: New file.
	* java/lang/natThread.cc (finish_): Synchronize when updating
	alive_flag.
	(_Jv_AttachCurrentThread): Likewise.
	(interrupt): Only call _Jv_ThreadInterrupt if thread is alive.
	* java/lang/Thread.java (isAlive): Now synchronized.

From-SVN: r101430
This commit is contained in:
Tom Tromey 2005-06-29 17:36:16 +00:00 committed by Tom Tromey
parent 9fb93f8966
commit 3af9ac15a9
4 changed files with 30 additions and 4 deletions

View file

@ -1,6 +1,6 @@
// natThread.cc - Native part of Thread class.
/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation
/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005 Free Software Foundation
This file is part of libgcj.
@ -115,7 +115,9 @@ java::lang::Thread::interrupt (void)
{
checkAccess ();
natThread *nt = (natThread *) data;
_Jv_ThreadInterrupt (nt->thread);
JvSynchronize sync (this);
if (alive_flag)
_Jv_ThreadInterrupt (nt->thread);
}
void
@ -215,7 +217,12 @@ java::lang::Thread::finish_ ()
// Signal any threads that are waiting to join() us.
_Jv_MutexLock (&nt->join_mutex);
alive_flag = false;
{
JvSynchronize sync (this);
alive_flag = false;
}
_Jv_CondNotifyAll (&nt->join_cond, &nt->join_mutex);
_Jv_MutexUnlock (&nt->join_mutex);
}
@ -392,6 +399,7 @@ _Jv_SetCurrentJNIEnv (JNIEnv *env)
jint
_Jv_AttachCurrentThread(java::lang::Thread* thread)
{
JvSynchronize sync (thread);
if (thread == NULL || thread->startable_flag == false)
return -1;
thread->startable_flag = false;