Imported Upstream version 5.4.0.167

Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2017-08-21 15:34:15 +00:00
parent e49d6f06c0
commit 536cd135cc
12856 changed files with 563812 additions and 223249 deletions

View File

@ -9,7 +9,9 @@ namespace System.Web.Hosting {
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Configuration.Provider;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
@ -88,9 +90,6 @@ namespace System.Web.Hosting {
// single instance of app manager
private static ApplicationManager _theAppManager;
// single instance of cache manager
private static CacheManager _cm;
// store fatal exception to assist debugging
private static Exception _fatalException = null;
@ -105,52 +104,6 @@ namespace System.Web.Hosting {
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
}
private void InitCacheManager(long privateBytesLimit) {
if (_cm == null) {
lock (_applicationManagerStaticLock) {
if (_cm == null && !_shutdownInProgress) {
_cm = new CacheManager(this, privateBytesLimit);
}
}
}
}
private void DisposeCacheManager() {
if (_cm != null) {
lock (_applicationManagerStaticLock) {
if (_cm != null) {
_cm.Dispose();
_cm = null;
}
}
}
}
// Each cache must update the total with the difference between it's current size and it's previous size.
// To reduce cross-domain costs, this also returns the updated total size.
internal long GetUpdatedTotalCacheSize(long sizeUpdate) {
CacheManager cm = _cm;
return (cm != null) ? cm.GetUpdatedTotalCacheSize(sizeUpdate) : 0;
}
internal long TrimCaches(int percent) {
long trimmedOrExpired = 0;
Dictionary<string, LockableAppDomainContext> apps = CloneAppDomainsCollection();
foreach (LockableAppDomainContext ac in apps.Values) {
lock (ac) {
HostingEnvironment env = ac.HostEnv;
if (_shutdownInProgress) {
break;
}
if (env == null) {
continue;
}
trimmedOrExpired += env.TrimCache(percent);
}
}
return trimmedOrExpired;
}
internal bool ShutdownInProgress {
get {
return _shutdownInProgress;
@ -468,6 +421,10 @@ namespace System.Web.Hosting {
return GetAppDomain(appID);
}
internal AppDomain GetDefaultAppDomain() {
return AppDomain.CurrentDomain;
}
[SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Justification = "This isn't a dangerous method.")]
private string CreateSimpleAppID(IApplicationHost appHost) {
if (appHost == null) {
@ -565,8 +522,6 @@ namespace System.Web.Hosting {
_shutdownInProgress = true;
Dictionary <string, LockableAppDomainContext> oldTable = null;
DisposeCacheManager();
lock (this) {
oldTable = _appDomains;
// don't keep references to hosting environments anymore
@ -769,13 +724,8 @@ namespace System.Web.Hosting {
// communication with hosting environments
//
internal void HostingEnvironmentActivated(long privateBytesLimit) {
internal void HostingEnvironmentActivated() {
int count = Interlocked.Increment(ref _activeHostingEnvCount);
// initialize CacheManager once, without blocking
if (count == 1) {
InitCacheManager(privateBytesLimit);
}
}
internal void HostingEnvironmentShutdownComplete(String appId, IApplicationHost appHost) {
@ -1021,7 +971,7 @@ namespace System.Web.Hosting {
//Hosted by IIS, we already have an IISMap.
if (appHost is ISAPIApplicationHost) {
string cacheKey = System.Web.Caching.CacheInternal.PrefixMapPath + siteID + virtualPath.VirtualPathString;
MapPathCacheInfo cacheInfo = (MapPathCacheInfo)HttpRuntime.CacheInternal.Remove(cacheKey);
MapPathCacheInfo cacheInfo = (MapPathCacheInfo)HttpRuntime.Cache.InternalCache.Remove(cacheKey);
appConfig = WebConfigurationManager.OpenWebConfiguration(appSegment, siteID);
}
// For non-IIS hosting scenarios, we need to get config map from application host in a generic way.
@ -1117,6 +1067,25 @@ namespace System.Web.Hosting {
}
}
// Allow apps to use their own CacheStoreProvider implementations
CacheSection cacheConfig = (CacheSection)appConfig.GetSection("system.web/caching/cache");
if (cacheConfig != null && cacheConfig.DefaultProvider != null && !String.IsNullOrWhiteSpace(cacheConfig.DefaultProvider)) {
ProviderSettingsCollection cacheProviders = cacheConfig.Providers;
if (cacheProviders == null || cacheProviders.Count < 1) {
throw new ProviderException(SR.GetString(SR.Def_provider_not_found));
}
ProviderSettings cacheProviderSettings = cacheProviders[cacheConfig.DefaultProvider];
if (cacheProviderSettings == null) {
throw new ProviderException(SR.GetString(SR.Def_provider_not_found));
} else {
NameValueCollection settings = cacheProviderSettings.Parameters;
settings["name"] = cacheProviderSettings.Name;
settings["type"] = cacheProviderSettings.Type;
appDomainAdditionalData[".defaultObjectCacheProvider"] = settings;
}
}
// If we were launched from a development environment, we might want to enable the application to do things
// it otherwise wouldn't normally allow, such as enabling an administrative control panel. For security reasons,
// we only do this check if <deployment retail="false" /> [the default value] is specified, since the