2004-11-29 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System / System.IO / DefaultWatcher.cs
index b68149c4ca3ed339ebcf8b6a2507da8761c8be9b..81ae631e6e4177effd482be99ed179c4e355862b 100644 (file)
@@ -132,34 +132,28 @@ namespace System.IO {
                        int zeroes = 0;
 
                        while (true) {
+                               Thread.Sleep (750);
+                               
+                               Hashtable my_watches;
                                lock (watches) {
-                                       if (watches.Count > 0) {
-                                               zeroes = 0;
-                                               ArrayList removed = null;
-                                               foreach (DefaultWatcherData data in watches.Values) {
-                                                       bool remove = UpdateDataAndDispatch (data, true);
-                                                       if (remove) {
-                                                               if (removed == null)
-                                                                       removed = new ArrayList ();
-
-                                                               removed.Add (data);
-                                                       }
-                                               }
-
-                                               if (removed != null) {
-                                                       foreach (DefaultWatcherData data in removed)
-                                                               watches.Remove (data.FSW);
-
-                                                       removed.Clear ();
-                                                       removed = null;
-                                               }
-                                       } else {
-                                               zeroes++;
-                                               if (zeroes == 20)
+                                       if (watches.Count == 0) {
+                                               if (++zeroes == 20)
                                                        break;
+                                               continue;
+                                       }
+                                       
+                                       my_watches = (Hashtable) watches.Clone ();
+                               }
+                               
+                               if (watches.Count != 0) {
+                                       zeroes = 0;
+                                       foreach (DefaultWatcherData data in my_watches.Values) {
+                                               bool remove = UpdateDataAndDispatch (data, true);
+                                               if (remove)
+                                                       lock (watches)
+                                                               watches.Remove (data.FSW);
                                        }
                                }
-                               Thread.Sleep (750);
                        }
 
                        lock (this) {
@@ -207,7 +201,7 @@ namespace System.IO {
                                files = Directory.GetFileSystemEntries (directory, data.FileMask);
                        } else {
                                // The pattern does not have wildcards
-                               if (File.Exists (data.FileMask))
+                               if (File.Exists (data.FileMask) || Directory.Exists (data.FileMask))
                                        files = new string [] { data.FileMask };
                                else
                                        files = NoStringsArray;