Forget internal directory references when appropriate Index: FileSystemQueryable/FileSystemQueryable.cs =================================================================== RCS file: /cvs/gnome/beagle/beagled/FileSystemQueryable/FileSystemQueryable.cs,v retrieving revision 1.80 diff -u -B -p -r1.80 FileSystemQueryable.cs --- FileSystemQueryable/FileSystemQueryable.cs 29 Aug 2005 06:57:01 -0000 1.80 +++ FileSystemQueryable/FileSystemQueryable.cs 29 Aug 2005 22:27:06 -0000 @@ -360,17 +360,8 @@ namespace Beagle.Daemon.FileSystemQuerya if (Debug) Logger.Log.Debug ("Expired '{0}'", expired_path); -#if false - DirectoryModel dir = (DirectoryModel) dir_models_by_id [unique_id]; - if (dir != null && dir.WatchHandle != null) - event_backend.ForgetWatch (dir.WatchHandle); -#endif - lock (dir_models_by_id) + lock (dir_models_by_path) dir_models_by_path.Remove (expired_path); - -#if false - dir_models_by_id.Remove (unique_id); -#endif } public void AddDirectory (DirectoryModel parent, string name) @@ -553,6 +544,17 @@ namespace Beagle.Daemon.FileSystemQuerya ActivateFileCrawling (); } + private void ForgetDirectoryRecursively (DirectoryModel dir) + { + foreach (DirectoryModel child in dir.Children) + ForgetDirectoryRecursively (child); + + if (dir.WatchHandle != null) + event_backend.ForgetWatch (dir.WatchHandle); + dir_models_by_id.Remove (dir.UniqueId); + // We rely on the expire event to remove it from dir_models_by_path + } + private void RemoveDirectory (DirectoryModel dir) { Uri uri; @@ -565,6 +567,9 @@ namespace Beagle.Daemon.FileSystemQuerya // easily remap it in the PostRemoveHook. indexable.LocalState ["RemovedUri"] = UriFu.PathToFileUri (dir.FullName); + // Forget watches and internal references + ForgetDirectoryRecursively (dir); + // Calling Remove will expire the path names, // so name caches will be cleaned up accordingly. dir.Remove ();