2008-03-31 Marek Habersack <mhabersack@novell.com>
[mono.git] / mcs / class / System.Web / System.Web / HttpApplicationState.cs
index 6131f07c776d3d99bb8a006237d390bcd248cffd..de259d16d38dafa268a512c90bf653235043f8a3 100644 (file)
-// \r
-// System.Web.HttpApplicationState\r
-//\r
-// Author:\r
-//   Patrik Torstensson (Patrik.Torstensson@labs2.com)\r
-//\r
-using System;\r
-using System.Threading;\r
-using System.Web;\r
-using System.Collections.Specialized;\r
-\r
-namespace System.Web {\r
-\r
-   [MonoTODO("Performance - Use SWMR lock here")]\r
-   public sealed class HttpApplicationState : NameObjectCollectionBase {\r
-      private HttpStaticObjectsCollection _AppObjects;\r
-      private HttpStaticObjectsCollection _SessionObjects;\r
-\r
-      // TODO : Change to ReadWriteLock when ready\r
-      private Mutex _Lock; \r
-\r
-      private void LockRead() {\r
-         Monitor.Enter(this);\r
-      }\r
-\r
-      private void LockWrite() {\r
-         Monitor.Enter(this);\r
-      }\r
-\r
-      private void UnlockRead() {\r
-         Monitor.Exit(this);\r
-      }\r
-\r
-      private void UnlockWrite() {\r
-         Monitor.Exit(this);\r
-      }\r
-\r
-      internal HttpApplicationState() {\r
-         _AppObjects = new HttpStaticObjectsCollection();\r
-         _SessionObjects = new HttpStaticObjectsCollection();\r
-         _Lock = new Mutex();\r
-      }\r
-\r
-      internal HttpApplicationState(HttpStaticObjectsCollection AppObj, HttpStaticObjectsCollection SessionObj) {\r
-         if (null != AppObj) {\r
-            _AppObjects = AppObj;\r
-         } else {\r
-            _AppObjects = new HttpStaticObjectsCollection();\r
-         }\r
-\r
-         if (null != SessionObj) {\r
-            _SessionObjects = SessionObj;\r
-         } else {\r
-            _SessionObjects = new HttpStaticObjectsCollection();\r
-         }\r
-         _Lock = new Mutex();\r
-      }\r
-\r
-      public void Add(string name, object value) {\r
-\r
-         LockWrite(); \r
-         try {\r
-            BaseAdd(name, value);\r
-         }\r
-         finally {\r
-            UnlockWrite();\r
-         }\r
-      }\r
-\r
-      public void Clear() {\r
-\r
-         LockWrite(); \r
-         try {\r
-            BaseClear();\r
-         }\r
-         finally {\r
-            UnlockWrite();\r
-         }\r
-      } \r
-\r
-      public object Get(string name) {\r
-         object ret = null;\r
-\r
-         LockRead(); \r
-         try {\r
-            ret = BaseGet(name);\r
-         }\r
-         finally {\r
-            UnlockRead();\r
-         }\r
-\r
-         return ret;\r
-      }\r
-\r
-      public object Get(int index) {\r
-         object ret = null;\r
-         \r
-         LockRead(); \r
-         try {\r
-            ret = BaseGet(index);\r
-         }\r
-         finally {\r
-            UnlockRead();\r
-         }\r
-\r
-         return ret;\r
-      }   \r
-\r
-      public string GetKey(int index) {\r
-         string ret = null;\r
-\r
-         LockRead(); \r
-         try {\r
-            ret = BaseGetKey(index);\r
-         }\r
-         finally {\r
-            UnlockRead();\r
-         }\r
-\r
-         return ret;\r
-      }      \r
-\r
-      public void Lock() {\r
-         LockWrite();\r
-      }\r
-\r
-      public void Remove(string name) {\r
-         LockWrite(); \r
-         try {\r
-            BaseRemove(name);\r
-         }\r
-         finally {\r
-            UnlockWrite();\r
-         }      \r
-      }\r
-\r
-      public void RemoveAll() {\r
-         Clear();\r
-      }\r
-\r
-      public void RemoveAt(int index) {\r
-         LockWrite(); \r
-         try {\r
-            BaseRemoveAt(index);\r
-         }\r
-         finally {\r
-            UnlockWrite();\r
-         }      \r
-      }\r
-\r
-      public void Set(string name, object value) {\r
-         LockWrite(); \r
-         try {\r
-            BaseSet(name, value);\r
-         }\r
-         finally {\r
-            UnlockWrite();\r
-         }      \r
-      }   \r
-      \r
-      public void UnLock() {\r
-         UnlockWrite();\r
-      }\r
-   \r
-      public string [] AllKeys {\r
-         get {\r
-            string [] ret = null;\r
-\r
-            LockRead(); \r
-            try {\r
-               ret = BaseGetAllKeys();\r
-            }\r
-            finally {\r
-               UnlockRead();\r
-            }     \r
-\r
-            return ret;\r
-         }\r
-      }\r
-\r
-      public HttpApplicationState Contents {\r
-         get {\r
-            return this;\r
-         }\r
-      }\r
-\r
-      override public int Count {\r
-         get {\r
-            int ret = 0;\r
-\r
-            LockRead(); \r
-            try {\r
-               ret = base.Count;\r
-            }\r
-            finally {\r
-               UnlockRead();\r
-            }     \r
-\r
-            return ret;\r
-         }\r
-      }   \r
-\r
-      public object this[string name] {\r
-         get {\r
-            return Get(name);\r
-         }\r
-         set {\r
-            Set(name, value);\r
-         }\r
-      }\r
-\r
-      public object this[int index] {\r
-         get {\r
-            return Get(index);\r
-         }\r
-      }\r
-\r
-      //  ASP Session based objects\r
-      internal HttpStaticObjectsCollection SessionObjects {\r
-         get {\r
-            return _SessionObjects;\r
-         }\r
-      }\r
-\r
-      //  ASP App based objects\r
-      public HttpStaticObjectsCollection StaticObjects {\r
-         get {\r
-            return _AppObjects;\r
-         }\r
-      }\r
-   }\r
-}\r
+// 
+// System.Web.HttpApplicationState
+//
+// Author:
+//   Patrik Torstensson
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Threading;
+using System.Collections.Specialized;
+using System.Security.Permissions;
+
+namespace System.Web {
+
+       // CAS - no InheritanceDemand here as the class is sealed
+       [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
+       public sealed class HttpApplicationState : NameObjectCollectionBase \r
+       {
+               private HttpStaticObjectsCollection _AppObjects;
+               private HttpStaticObjectsCollection _SessionObjects;
+
+               private ReaderWriterLock _Lock; 
+
+               internal HttpApplicationState ()
+               {
+                       // do not use the public (empty) ctor as it required UnmanagedCode permission
+                       _AppObjects = new HttpStaticObjectsCollection (this);
+                       _SessionObjects = new HttpStaticObjectsCollection (this);
+                       _Lock = new ReaderWriterLock ();
+               }
+
+               internal HttpApplicationState (HttpStaticObjectsCollection AppObj,
+                       HttpStaticObjectsCollection SessionObj)
+               {
+                       if (null != AppObj) \r
+                       {
+                               _AppObjects = AppObj;
+                       } \r
+                       else \r
+                       {
+                               // do not use the public (empty) ctor as it required UnmanagedCode permission
+                               _AppObjects = new HttpStaticObjectsCollection (this);
+                       }
+
+                       if (null != SessionObj) \r
+                       {
+                               _SessionObjects = SessionObj;
+                       } \r
+                       else \r
+                       {
+                               // do not use the public (empty) ctor as it required UnmanagedCode permission
+                               _SessionObjects = new HttpStaticObjectsCollection (this);
+                       }
+                       _Lock = new ReaderWriterLock ();
+               }
+
+               public void Add (string name, object value)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseAdd (name, value);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }
+               }
+
+               public void Clear ()
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseClear ();
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }
+               } 
+
+               public object Get (string name)
+               {
+                       object ret = null;
+
+                       _Lock.AcquireReaderLock (-1); 
+                       try \r
+                       {
+                               ret = BaseGet (name);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseReaderLock ();
+                       }
+
+                       return ret;
+               }
+
+               public object Get (int index)
+               {
+                       object ret = null;
+
+                       _Lock.AcquireReaderLock (-1); 
+                       try \r
+                       {
+                               ret = BaseGet (index);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseReaderLock ();
+                       }
+
+                       return ret;
+               }   
+
+               public string GetKey (int index)
+               {
+                       string ret = null;
+
+                       _Lock.AcquireReaderLock (-1); 
+                       try \r
+                       {
+                               ret = BaseGetKey (index);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseReaderLock ();
+                       }
+
+                       return ret;
+               }      
+
+               public void Lock ()
+               {
+                       _Lock.AcquireWriterLock (-1);
+               }
+
+               public void Remove (string name)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseRemove (name);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }      
+               }
+
+               public void RemoveAll ()
+               {
+                       Clear ();
+               }
+
+               public void RemoveAt (int index)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseRemoveAt (index);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }      
+               }
+
+               public void Set (string name, object value)
+               {
+                       _Lock.AcquireWriterLock (-1); 
+                       try \r
+                       {
+                               BaseSet (name, value);
+                       } \r
+                       finally \r
+                       {
+                               _Lock.ReleaseWriterLock ();
+                       }      
+               }   
+
+               public void UnLock ()
+               {
+                       _Lock.ReleaseWriterLock ();
+               }
+
+               public string [] AllKeys \r
+               {
+                       get \r
+                       {
+                               string [] ret = null;
+
+                               _Lock.AcquireReaderLock (-1); 
+                               try \r
+                               {
+                                       ret = BaseGetAllKeys ();
+                               } \r
+                               finally \r
+                               {
+                                       _Lock.ReleaseReaderLock ();
+                               }     
+
+                               return ret;
+                       }
+               }
+
+               public HttpApplicationState Contents \r
+               {
+                       get { return this; }
+               }
+
+               public override int Count \r
+               {
+                       get \r
+                       {
+                               int ret = 0;
+
+                               _Lock.AcquireReaderLock (-1); 
+                               try \r
+                               {
+                                       ret = base.Count;
+                               } \r
+                               finally \r
+                               {
+                                       _Lock.ReleaseReaderLock ();
+                               }     
+
+                               return ret;
+                       }
+               }   
+
+               public object this [string name] \r
+               {
+                       get { return Get (name); }
+                       set { Set (name, value); }
+               }
+
+               public object this [int index] \r
+               {
+                       get { return Get (index); }
+               }
+
+               //  ASP Session based objects
+               internal HttpStaticObjectsCollection SessionObjects \r
+               {
+                       get { return _SessionObjects; }
+               }
+
+               //  ASP App based objects
+               public HttpStaticObjectsCollection StaticObjects \r
+               {
+                       get { return _AppObjects; }
+               }
+       }
+}
+