Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>2006-04-11 01:21:22 +0400
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>2006-04-11 01:21:22 +0400
commit3790aca1cf050161cdb52d31c6ca62d184a466f1 (patch)
tree8122a541f059523417bfa55cf3f2612424191b9c /mcs/class/System/System.IO/FAMWatcher.cs
parent3670c064852db9901c9ec2561621169671609ae2 (diff)
2006-04-10 Gonzalo Paniagua Javier <gonzalo@ximian.com>
* FAMWatcher.cs: fix race condition when a directory is created and populated before we start monitoring it. Patch by Thong Nguyen. svn path=/trunk/mcs/; revision=59322
Diffstat (limited to 'mcs/class/System/System.IO/FAMWatcher.cs')
-rw-r--r--mcs/class/System/System.IO/FAMWatcher.cs71
1 files changed, 54 insertions, 17 deletions
diff --git a/mcs/class/System/System.IO/FAMWatcher.cs b/mcs/class/System/System.IO/FAMWatcher.cs
index 40973d699d8..e88469fc030 100644
--- a/mcs/class/System/System.IO/FAMWatcher.cs
+++ b/mcs/class/System/System.IO/FAMWatcher.cs
@@ -133,7 +133,7 @@ namespace System.IO {
data.SubDirs = new Hashtable ();
data.Enabled = true;
- StartMonitoringDirectory (data);
+ StartMonitoringDirectory (data, false);
lock (this) {
watches [fsw] = data;
requests [data.Request.ReqNum] = data;
@@ -144,26 +144,63 @@ namespace System.IO {
static void StartMonitoringDirectory (FAMData data)
{
+ StartMonitoringDirectory (data, false);
+ }
+
+ static void StartMonitoringDirectory (FAMData data, bool justcreated)
+ {
FAMRequest fr;
+ FileSystemWatcher fsw;
if (FAMMonitorDirectory (ref conn, data.Directory, out fr, IntPtr.Zero) == -1)
throw new Win32Exception ();
+ fsw = data.FSW;
data.Request = fr;
- if (!data.IncludeSubdirs)
- return;
-
- foreach (string directory in Directory.GetDirectories (data.Directory)) {
- FAMData fd = new FAMData ();
- fd.FSW = data.FSW;
- fd.Directory = directory;
- fd.FileMask = data.FSW.MangledFilter;
- fd.IncludeSubdirs = true;
- fd.SubDirs = new Hashtable ();
- fd.Enabled = true;
-
- StartMonitoringDirectory (fd);
- data.SubDirs [directory] = fd;
- requests [fd.Request.ReqNum] = fd;
+
+ if (data.IncludeSubdirs) {
+ foreach (string directory in Directory.GetDirectories (data.Directory)) {
+ FAMData fd = new FAMData ();
+ fd.FSW = data.FSW;
+ fd.Directory = directory;
+ fd.FileMask = data.FSW.MangledFilter;
+ fd.IncludeSubdirs = true;
+ fd.SubDirs = new Hashtable ();
+ fd.Enabled = true;
+
+ if (justcreated) {
+ lock (fsw) {
+ RenamedEventArgs renamed = null;
+
+ fsw.DispatchEvents (FileAction.Added, directory, ref renamed);
+
+ if (fsw.Waiting) {
+ fsw.Waiting = false;
+ System.Threading.Monitor.PulseAll (fsw);
+ }
+ }
+ }
+
+ StartMonitoringDirectory (fd, justcreated);
+ data.SubDirs [directory] = fd;
+ requests [fd.Request.ReqNum] = fd;
+ }
+ }
+
+ if (justcreated) {
+ foreach (string filename in Directory.GetFiles(data.Directory)) {
+ lock (fsw) {
+ RenamedEventArgs renamed = null;
+
+ fsw.DispatchEvents (FileAction.Added, filename, ref renamed);
+ /* If a file has been created, then it has been written to */
+ fsw.DispatchEvents (FileAction.Modified, filename, ref renamed);
+
+ if (fsw.Waiting) {
+ fsw.Waiting = false;
+ System.Threading.Monitor.PulseAll(fsw);
+ }
+ }
+ }
}
}
@@ -326,7 +363,7 @@ namespace System.IO {
for (int n = 0; n < count; n += 2) {
FAMData newdir = (FAMData) newdirs [n];
FAMData parent = (FAMData) newdirs [n + 1];
- StartMonitoringDirectory (newdir);
+ StartMonitoringDirectory (newdir, true);
requests [newdir.Request.ReqNum] = newdir;
lock (parent) {
parent.SubDirs [newdir.Directory] = newdir;