[Mono-bugs] [Bug 74678][Nor] New - Writing to console should be safe from finalizer

bugzilla-daemon@bugzilla.ximian.com bugzilla-daemon@bugzilla.ximian.com
Wed, 20 Apr 2005 19:48:02 -0400 (EDT)


Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by michi@zeroc.com.

http://bugzilla.ximian.com/show_bug.cgi?id=74678

--- shadow/74678	2005-04-20 19:48:02.000000000 -0400
+++ shadow/74678.tmp.14873	2005-04-20 19:48:02.000000000 -0400
@@ -0,0 +1,67 @@
+Bug#: 74678
+Product: Mono: Runtime
+Version: 1.1
+OS: Red Hat 8.0
+OS Details: Dual-CPU
+Status: NEW   
+Resolution: 
+Severity: 
+Priority: Normal
+Component: io-layer
+AssignedTo: mono-bugs@ximian.com                            
+ReportedBy: michi@zeroc.com               
+QAContact: mono-bugs@ximian.com
+TargetMilestone: ---
+URL: 
+Cc: 
+Summary: Writing to console should be safe from finalizer
+
+Hi, I have an object with a destructor that writes to the console. No 
+problem, works fine. Except when my process calls System.Environment.Exit
+(), in which case it dies with a NullPointerException. This doesn't 
+happen deterministicalle -- on my dual-CPU machine, I get the error maybe 
+once in every ten runs.
+
+Obviously what is happening is that the GC occasionally destroys stdout 
+and stderr before the finalizer for my object runs, so things blow up 
+then.
+
+The interesting thing is that the .NET runtime does *not* do that. From 
+one of the .NET developers (Brian Grunkemeyer):
+
+"Back during the implementation of V1.0, I was debugging a problem where 
+a finalizer didn’t seem to be called. To help figure out if the finalizer 
+was running at all, I added a call to Console.WriteLine inside it, but 
+then my app started blowing up with an unhandled ObjectDisposedException. 
+How could simply adding a call to Console.WriteLine to the finalizer 
+break the app?
+
+The problem turned out to be that the underlying console stream was being 
+finalized before my instance. The lesson I learned was to follow this 
+guideline: only use non-finalizable instance data from your own 
+finalizer. But I also happened to own the code for the Console class, so 
+I special cased Console.WriteLine—now we never close the handles for 
+stdout, stdin, or stderr. This is somewhat useful for printf-style 
+debugging and logging, and turned out later to be required to support 
+multiple appdomains within the same process (i.e. you don’t want 
+arbitrary appdomains closing your process-wide handle for stdout). So 
+bottom line: using Console from your finalizer is actually a safe thing 
+to do, but watch out for everything else."
+
+This is taken from: http://www.bluebytesoftware.com/blog/PermaLink.aspx?
+guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae
+
+The quoted comment appears about two-thirds down the page.
+
+Even though the spec does not guarantee that stdout and stderr should be 
+available in finalizers, the .NET runtime is implemented that way, 
+meaning that a program that was developed under .NET and ported to Mono 
+(as is the case for me) may randomly fail during process shutdown. That's 
+not a good thing. And being able to use the console in finalizers is 
+useful during debugging.
+
+So, could you change Mono to provide the same guarantee please?
+
+Cheers,
+
+Michi.