[Mono-bugs] [Bug 561239] New: Monitor.Pulse() Monitor.Wait() Thread.Abort() cause mono hang

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Sun Dec 6 20:50:43 EST 2009


http://bugzilla.novell.com/show_bug.cgi?id=561239

http://bugzilla.novell.com/show_bug.cgi?id=561239#c0


           Summary: Monitor.Pulse() Monitor.Wait() Thread.Abort() cause
                    mono hang
    Classification: Mono
           Product: Mono: Runtime
           Version: SVN
          Platform: i686
        OS/Version: Ubuntu
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: misc
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: wmrieker at nii.net
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


Created an attachment (id=331278)
 --> (http://bugzilla.novell.com/attachment.cgi?id=331278)
fixed monitor.c (original from svn 138189) and test program

User-Agent:       Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64;
GTB6.3; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)

1)Have a main program create a thread with new Thread() and start it with
thread.Start()
2)Have the main program lock an object with Monitor.Enter() then wait for the
thread to set a flag by waiting with Monitor.Wait()
3)Have the thread lock the object with Monitor.Enter(), set the flag, do a
Monitor.Pulse() to wake the main program, then wait forever with Monitor.Wait()
4)When the main program wakes, have it abort the thread with thread.Abort()
while thread is still waiting in Monitor.Wait()
5)Have main program wait for thread to complete with thread.Join()
6)repeat back to step 1

After a few (< 100 or so) iterations, it hangs because the Monitor.Pulse()
never wakes the main thread.

The reason is that the event placed in the mon->wait_list struct by the
thread's Monitor.Wait() is never freed off as the thread is aborted with
thread.Abort().  So when that mon struct gets reused by a later thread, it has
that old event in there, and the Monitor.Pulse() wakes that old event, not
waking the event placed in there by the main thread.


Reproducible: Always

Steps to Reproduce:
see description above, or use test program in attachment
Actual Results:  
attached program hangs after < 100 iterations (at least on my system)

Expected Results:  
it should keep running and running as it does when my change (in the
attachment) is applied


(the descriptions of the categories are terrible, yes I know that runtime is
runtime, but I'm not really sure what you consider runtime vs classes).

-- 
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list