Finalizer deadlock

Jacob Gladish jake@gladish.info
Tue Sep 14 19:45:00 GMT 2004



> -----Original Message-----
> From: java-owner@gcc.gnu.org [mailto:java-owner@gcc.gnu.org] On Behalf
Of
> Bryce McKinlay
> Sent: Wednesday, September 08, 2004 4:57 PM
> To: Gladish, Jacob
> Cc: java@gcc.gnu.org
> Subject: Re: Finalizer deadlock
> 
> Gladish, Jacob wrote:
> 
> >This was proposed about two months ago:
> >
> >
> >
> >>Yes, we could rewrite it using _Jv_CondWait/_Jv_CondNotify and other
> >>thread primitives defined in the thread headers.
> >>
> >>I'm also not sure this peice of code in FinalizerThread is safe:
> >>public static void finalizerReady ()
> >>{
> >>  synchronized (lock)
> >>    {
> >>  if (! thread_started)
> >>    runFinalizers ();
> >>
> >>Isn't there a race here? Unlikely to happen, perhaps, but it seems
like
> >>
> >>
> >if >a finalizer needs to be run before the finalizer thread has
finished
> >
> >
> >>starting, we'll try to run finalizers from the inside the GC's
thread.
> >>
> >>Regards
> >>
> >>Bryce
> >>
> >>
> >>
> >
> >
> >Is this that case? The two threads are deadlocked. The finalizer is
> >waiting for a monitor on the PlainSocketImpl.
> >
> 
> Hmm, looking at this more, I think a race condition is still possible
-
> although very unlikely ...
> 
> // Main loop for the finalizer thread.
> void
> gnu::gcj::runtime::FinalizerThread::run ()
> {
>   while (true)
>     {
>       _Jv_MutexLock (&mutex);
>       if (! finalizer_ready)
>     _Jv_CondWait (&condition, &mutex, 0, 0);
>       finalizer_ready = false;
>       _Jv_MutexUnlock (&mutex);
>       _Jv_RunFinalizers ();
>     }
> }


I applied this patch, but changed the if (!finalizer_ready) to while
(!finalizer_ready)


> 
> If the finalizer thread were suspended by a GC cycle being invoked
from
> another thread, while it holds the mutex, then a deadlock could occur
if
> that GC then invokes finalizerReady().
> 
> Perhaps we need some kind of "GC critical section" call to ensure that
> the GC does not attempt to suspend the finalizer thread while the lock
> is held. Or, perhaps there is an easier solution - could this be
> implemented purely with atomic operations? Java finalization sure is
> tricky to implement (reliably)...
> 
> Still, I think this is very unlikely to actually happen (note that the
> mutex is released by _Jv_CondWait), and is unlikely to be the cause of
> the bug you saw.
> 
> Regards
> 
> Bryce




More information about the Java mailing list