* CapabilitiesLoader.cs: added TARGET_JVM part of static members, added caching to...
authorVladimir Krasnov <krasnov@mono-cvs.ximian.com>
Mon, 12 Mar 2007 12:34:09 +0000 (12:34 -0000)
committerVladimir Krasnov <krasnov@mono-cvs.ximian.com>
Mon, 12 Mar 2007 12:34:09 +0000 (12:34 -0000)
svn path=/trunk/mcs/; revision=74117

mcs/class/System.Web/System.Web/CapabilitiesLoader.cs
mcs/class/System.Web/System.Web/ChangeLog

index 828b25d1270df934b55c3ff7e502fb0e85de68d0..0e05400fe7a67413e509e39c07c415c4b310498b 100644 (file)
@@ -143,10 +143,51 @@ namespace System.Web
        
        class CapabilitiesLoader : MarshalByRefObject
        {
-               static volatile bool loaded;
-               static ICollection alldata;
+               const int userAgentsCacheSize = 3000;
                static Hashtable defaultCaps;
                static readonly object lockobj = new object ();
+
+#if TARGET_JVM
+               static bool loaded {
+                       get {
+                               return alldata != null;
+                       }
+                       set {
+                               if (alldata == null)
+                                       alldata = new ArrayList ();
+                       }
+               }
+
+               const string alldataKey = "System.Web.CapabilitiesLoader.alldata";
+               static ICollection alldata {
+                       get {
+                               return (ICollection) AppDomain.CurrentDomain.GetData (alldataKey);
+                       }
+                       set {
+                               AppDomain.CurrentDomain.SetData (alldataKey, value);
+                       }
+               }
+
+               const string userAgentsCacheKey = "System.Web.CapabilitiesLoader.userAgentsCache";
+               static Hashtable userAgentsCache {
+                       get {
+                               lock (typeof (CapabilitiesLoader)) {
+                                       Hashtable agentsCache = (Hashtable) AppDomain.CurrentDomain.GetData (userAgentsCacheKey);
+                                       if (agentsCache == null) {
+                                               agentsCache = Hashtable.Synchronized (new Hashtable (userAgentsCacheSize + 10));
+                                               AppDomain.CurrentDomain.SetData (userAgentsCacheKey, agentsCache);
+                                       }
+
+                                       return agentsCache;
+                               }
+                       }
+               }
+#else
+               static volatile bool loaded;
+               static ICollection alldata;
+               static Hashtable userAgentsCache = Hashtable.Synchronized(new Hashtable(userAgentsCacheSize+10));
+#endif
+
                private CapabilitiesLoader () {}
 
                static CapabilitiesLoader ()
@@ -165,21 +206,33 @@ namespace System.Web
                        if (alldata == null || userAgent == null || userAgent == "")
                                return defaultCaps;
 
-                       foreach (BrowserData bd in alldata) {
-                               if (bd.IsMatch (userAgent)) {
-                                       Hashtable tbl;
+                       Hashtable userBrowserCaps = (Hashtable) userAgentsCache [userAgent];
+                       if (userBrowserCaps == null) {
+                               foreach (BrowserData bd in alldata) {
+                                       if (bd.IsMatch (userAgent)) {
+                                               Hashtable tbl;
 #if NET_2_0
-                                       tbl = new Hashtable (StringComparer.InvariantCultureIgnoreCase);
+                                               tbl = new Hashtable (StringComparer.InvariantCultureIgnoreCase);
 #else
-                                       tbl = new Hashtable (CaseInsensitiveHashCodeProvider.DefaultInvariant,
-                                                               CaseInsensitiveComparer.DefaultInvariant);
+                                               tbl = new Hashtable (CaseInsensitiveHashCodeProvider.DefaultInvariant,
+                                                       CaseInsensitiveComparer.DefaultInvariant);
 #endif
+                                               userBrowserCaps = bd.GetProperties (tbl);
+                                               break;
+                                       }
+                               }
 
-                                       return bd.GetProperties (tbl);
+                               if (userBrowserCaps == null)
+                                       userBrowserCaps = defaultCaps;
+
+                               lock (typeof (CapabilitiesLoader)) {
+                                       if (userAgentsCache.Count >= userAgentsCacheSize) {
+                                               userAgentsCache.Clear ();
+                                       }
                                }
+                               userAgentsCache [userAgent] = userBrowserCaps;
                        }
-                       
-                       return defaultCaps;
+                       return userBrowserCaps;
                }
 
                static void Init ()
index fb37903409749716a1895b70ae34411f8a1544ff..ca909e313b56b99b704bc25d823e8c7b33601905 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-12  Vladimir Krasnov  <vladimirk@mainsoft.com>
+
+       * CapabilitiesLoader.cs: added TARGET_JVM part of static members,
+       added caching to GetCapabilities method for performance improvement
+
 2007-03-12  Marek Habersack  <mhabersack@novell.com>
 
        * XmlSiteMapProvider.cs: support custom site map providers. Fixes