[Mono-bugs] [Bug 54860][Wis] New - w32api
bugzilla-daemon@bugzilla.ximian.com
bugzilla-daemon@bugzilla.ximian.com
Wed, 25 Feb 2004 16:59:57 -0500 (EST)
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 derek.mcumber@datamtnsol.com.
http://bugzilla.ximian.com/show_bug.cgi?id=54860
--- shadow/54860 2004-02-25 16:59:57.000000000 -0500
+++ shadow/54860.tmp.15196 2004-02-25 16:59:57.000000000 -0500
@@ -0,0 +1,77 @@
+Bug#: 54860
+Product: Mono/Runtime
+Version: unspecified
+OS:
+OS Details:
+Status: NEW
+Resolution:
+Severity:
+Priority: Wishlist
+Component: misc
+AssignedTo: mono-bugs@ximian.com
+ReportedBy: derek.mcumber@datamtnsol.com
+QAContact: mono-bugs@ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: w32api
+
+On windowsxp/2k/etc., the GetFileAttributes w32api
+command in MonoIO.cs will raise an unhandled exception and will halt
+the executibles and require a restart. This occurs under heavy load,
+primarily during a codegen and compile of code behinds in .aspx pages.
+
+Changes to metadata/file-io.c
+ and System/Microsoft.CSharp/
+
+Note: (I forgot) This also requires my native mcs compile solution,
+which omits the need for msft .net on the windows machine. I will
+post this code as well. (VC++ 6.0). The MONO_PATH needs to be changed
+to a directory containing corlib.dll and the mcs class libraries before
+the standard mcs.exe (renamed to mcs3.exe in my code).
+
+I tried a number of things,
+and have gotten a somewhat stable solution, but more work is required.
+
+On calls to GetFileAttributes in MonoIO.cs, the following needs to be
+added to catch the exception and keep on trying:
+
+ public static bool Exists (string path, out MonoIOError error)
+ {
+ FileAttributes attrs = (FileAttributes)(-1);
+ error = MonoIOError.ERROR_SUCCESS;
+ Exception exc = new IOException();
+ do {
+ try {
+ attrs = GetFileAttributes (path,
+ out error);
+ exc = null;
+ } catch (Exception e) {
+ exc = e;
+ }
+ } while (exc !=null);
+ if (attrs == InvalidFileAttributes)
+ return false;
+
+ return true;
+ }
+
+This should be added to ExistsFile and ExistsDirectory, too.
+
+I also changed the System/Microsoft.CSharp/CSharpCodeCompiler.cs
+to not use the FileInfo class (which repeatedly calls the Existence
+routines in MonoIO), and create files with File.Create and move with
+File.Move.
+
+Finally, I wrote a simple cache in the mono.exe runtime in
+metadata/file-io.c that will cache the last 20 requests to
+GetFileAttributes (omitting tmp files, .cs files, and dlls)
+so that a surge in requests will not unload the kernel and
+halt the app.
+
+I will send this cache if there is interest or just keep this hack
+to myself. I am able to run mono on multi-CPU windows machines
+with these in place, but it still requires more optimization.
+Perhaps do away with the w32api for file and directory existence
+calls alltogether. This cache may be better served in MonoIO.cs
+so the performance gain is greater. Early tests show promise.