コード例 #1
0
 void AddQuery(object query)
 {
     lock (queryLock) {
         if (query is VersionInfoQuery)
         {
             VersionInfoQuery vi = (VersionInfoQuery)query;
             vi.Paths.RemoveAll(p => filesInQueryQueue.Contains(p) || directoriesInQueryQueue.Contains(p.ParentDirectory));
             if (vi.Paths.Count == 0)
             {
                 return;
             }
             filesInQueryQueue.UnionWith(vi.Paths);
             fileQueryQueue.Enqueue(vi);
             //	Console.WriteLine ("GetVersionInfo AddQuery " + string.Join (", ", vi.Paths.Select (p => p.FullPath)));
         }
         else if (query is DirectoryInfoQuery)
         {
             DirectoryInfoQuery di = (DirectoryInfoQuery)query;
             if (!directoriesInQueryQueue.Add(di.Directory))
             {
                 return;
             }
             directoryQueryQueue.Enqueue(di);
             //	Console.WriteLine ("GetDirectoryVersionInfo AddQuery " + ((DirectoryInfoQuery)query).Directory);
         }
         if (!queryRunning)
         {
             queryRunning = true;
             System.Threading.ThreadPool.QueueUserWorkItem(RunQueries);
         }
     }
 }
コード例 #2
0
        public VersionInfo[] GetDirectoryVersionInfo(FilePath localDirectory, bool getRemoteStatus, bool recursive)
        {
            try {
                if (recursive)
                {
                    return(OnGetDirectoryVersionInfo(localDirectory, getRemoteStatus, recursive));
                }

                var status = infoCache.GetDirectoryStatus(localDirectory);
                if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
                {
                    return(status.FileInfo);
                }

                // If there is no cached status, query it asynchronously
                DirectoryInfoQuery q = new DirectoryInfoQuery()
                {
                    Directory       = localDirectory,
                    GetRemoteStatus = getRemoteStatus
                };
                AddQuery(q);

                // If we have a status value but the value was invalidated (RequiresRefresh == true)
                // then we return the invalidated value while we start an async query to get the new one

                if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
                {
                    return(status.FileInfo);
                }
                return(new VersionInfo[0]);
            } finally {
                //Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds);
            }
        }
コード例 #3
0
ファイル: Repository.cs プロジェクト: alinen/monodevelop
        public VersionInfo[] GetDirectoryVersionInfo(FilePath localDirectory, bool getRemoteStatus, bool recursive)
        {
            try {
                if (recursive)
                {
                    RecursiveDirectoryInfoQuery rq = AcquireLockForQuery(localDirectory, getRemoteStatus);
                    rq.ResetEvent.WaitOne();

                    lock (queryLock)
                        if (Interlocked.Decrement(ref rq.Count) == 0)
                        {
                            rq.ResetEvent.Dispose();
                        }
                    return(rq.Result);
                }

                var status = infoCache.GetDirectoryStatus(localDirectory);
                if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
                {
                    return(status.FileInfo);
                }

                // If there is no cached status, query it asynchronously
                DirectoryInfoQuery q = new DirectoryInfoQuery()
                {
                    Directory       = localDirectory,
                    GetRemoteStatus = getRemoteStatus
                };
                AddQuery(q);

                // If we have a status value but the value was invalidated (RequiresRefresh == true)
                // then we return the invalidated value while we start an async query to get the new one

                if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
                {
                    return(status.FileInfo);
                }
                return(new VersionInfo[0]);
            } finally {
                //Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds);
            }
        }
コード例 #4
0
		public VersionInfo[] GetDirectoryVersionInfo (FilePath localDirectory, bool getRemoteStatus, bool recursive)
		{
			try {
				if (recursive) {
					RecursiveDirectoryInfoQuery rq = AcquireLockForQuery (localDirectory, getRemoteStatus);
					rq.ResetEvent.WaitOne ();

					lock (queryLock)
						if (Interlocked.Decrement (ref rq.Count) == 0)
							rq.ResetEvent.Dispose ();
					return rq.Result;
				}

				var status = infoCache.GetDirectoryStatus (localDirectory);
				if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
					return status.FileInfo;

				// If there is no cached status, query it asynchronously
				DirectoryInfoQuery q = new DirectoryInfoQuery () {
					Directory = localDirectory,
					GetRemoteStatus = getRemoteStatus
				};
				AddQuery (q);

				// If we have a status value but the value was invalidated (RequiresRefresh == true)
				// then we return the invalidated value while we start an async query to get the new one

				if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
					return status.FileInfo;
				return new VersionInfo[0];
			} finally {
				//Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds);
			}
		}
コード例 #5
0
ファイル: Repository.cs プロジェクト: pjt33/monodevelop
		public VersionInfo[] GetDirectoryVersionInfo (FilePath localDirectory, bool getRemoteStatus, bool recursive)
		{
			try {
				if (recursive)
					return OnGetDirectoryVersionInfo (localDirectory, getRemoteStatus, recursive);

				var status = infoCache.GetDirectoryStatus (localDirectory);
				if (status != null && !status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
					return status.FileInfo;

				// If there is no cached status, query it asynchronously
				DirectoryInfoQuery q = new DirectoryInfoQuery () {
					Directory = localDirectory,
					GetRemoteStatus = getRemoteStatus
				};
				AddQuery (q);

				// If we have a status value but the value was invalidated (RequiresRefresh == true)
				// then we return the invalidated value while we start an async query to get the new one

				if (status != null && status.RequiresRefresh && (!getRemoteStatus || status.HasRemoteStatus))
					return status.FileInfo;
				else
					return new VersionInfo[0];
			} finally {
				//Console.WriteLine ("GetDirectoryVersionInfo " + localDirectory + " - " + (DateTime.Now - now).TotalMilliseconds);
			}
		}