You've already forked linux-packaging-mono
Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
parent
a569aebcfd
commit
e79aa3c0ed
@ -0,0 +1,99 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <copyright file="TimeStampChecker.cs" company="Microsoft">
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// </copyright>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace System.Web.Compilation {
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.IO;
|
||||
using System.Web;
|
||||
using System.Web.Hosting;
|
||||
using Debug = System.Web.Util.Debug;
|
||||
|
||||
internal class TimeStampChecker {
|
||||
internal const String CallContextSlotName = "TSC";
|
||||
|
||||
private Hashtable _timeStamps = new Hashtable(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
private static TimeStampChecker Current {
|
||||
get {
|
||||
TimeStampChecker tsc = (TimeStampChecker)System.Runtime.Remoting.Messaging.CallContext.GetData(
|
||||
CallContextSlotName) as TimeStampChecker;
|
||||
|
||||
// Create it on demand
|
||||
if (tsc == null) {
|
||||
tsc = new TimeStampChecker();
|
||||
Debug.Trace("TimeStampChecker", "Creating new TimeStampChecker");
|
||||
System.Runtime.Remoting.Messaging.CallContext.SetData(CallContextSlotName, tsc);
|
||||
}
|
||||
|
||||
return tsc;
|
||||
}
|
||||
}
|
||||
|
||||
internal static void AddFile(string virtualPath, string path) {
|
||||
Current.AddFileInternal(virtualPath, path);
|
||||
}
|
||||
|
||||
private void AddFileInternal(string virtualPath, string path) {
|
||||
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
|
||||
|
||||
if (_timeStamps.Contains(virtualPath)) {
|
||||
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
|
||||
|
||||
// Already found to have changed before
|
||||
if (storedValue == DateTime.MaxValue) {
|
||||
Debug.Trace("TimeStampChecker", "AddFileInternal: Same time stamp (" + path + ")");
|
||||
return;
|
||||
}
|
||||
|
||||
// If it's different, set it to MaxValue as marker of being invalid
|
||||
if (storedValue != lastWriteTimeUtc) {
|
||||
_timeStamps[virtualPath] = DateTime.MaxValue;
|
||||
Debug.Trace("TimeStampChecker", "AddFileInternal: Changed time stamp (" + path + ")");
|
||||
}
|
||||
}
|
||||
else {
|
||||
// New path: just add it
|
||||
_timeStamps[virtualPath] = lastWriteTimeUtc;
|
||||
Debug.Trace("TimeStampChecker", "AddFileInternal: New path (" + path + ")");
|
||||
}
|
||||
}
|
||||
|
||||
internal static bool CheckFilesStillValid(string key, ICollection virtualPaths) {
|
||||
if (virtualPaths == null)
|
||||
return true;
|
||||
|
||||
return Current.CheckFilesStillValidInternal(key, virtualPaths);
|
||||
}
|
||||
|
||||
private bool CheckFilesStillValidInternal(string key, ICollection virtualPaths) {
|
||||
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ")");
|
||||
|
||||
foreach (string virtualPath in virtualPaths) {
|
||||
|
||||
if (!_timeStamps.Contains(virtualPath))
|
||||
continue;
|
||||
|
||||
string path = HostingEnvironment.MapPath(virtualPath);
|
||||
|
||||
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
|
||||
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
|
||||
|
||||
// If it changed, then it's not valid
|
||||
if (lastWriteTimeUtc != storedValue) {
|
||||
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal: File (" + path + ") has changed!");
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ") is still valid");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user