#region Copyright & License // // Copyright 2001-2005 The Apache Software Foundation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #endregion using System; using System.Collections; namespace log4net.Util { /// /// Implementation of Properties collection for the /// /// /// /// Class implements a collection of properties that is specific to each thread. /// The class is not synchronized as each thread has its own . /// /// /// Nicko Cadell public sealed class ThreadContextProperties : ContextPropertiesBase { #region Private Instance Fields /// /// The thread local data slot to use to store a PropertiesDictionary. /// private readonly static LocalDataStoreSlot s_threadLocalSlot = System.Threading.Thread.AllocateDataSlot(); #endregion Private Instance Fields #region Public Instance Constructors /// /// Internal constructor /// /// /// /// Initializes a new instance of the class. /// /// internal ThreadContextProperties() { } #endregion Public Instance Constructors #region Public Instance Properties /// /// Gets or sets the value of a property /// /// /// The value for the property with the specified key /// /// /// /// Gets or sets the value of a property /// /// override public object this[string key] { get { PropertiesDictionary dictionary = GetProperties(false); if (dictionary != null) { return dictionary[key]; } return null; } set { GetProperties(true)[key] = value; } } #endregion Public Instance Properties #region Public Instance Methods /// /// Remove a property /// /// the key for the entry to remove /// /// /// Remove a property /// /// public void Remove(string key) { PropertiesDictionary dictionary = GetProperties(false); if (dictionary != null) { dictionary.Remove(key); } } /// /// Clear all properties /// /// /// /// Clear all properties /// /// public void Clear() { PropertiesDictionary dictionary = GetProperties(false); if (dictionary != null) { dictionary.Clear(); } } #endregion Public Instance Methods #region Internal Instance Methods /// /// Get the PropertiesDictionary for this thread. /// /// create the dictionary if it does not exist, otherwise return null if is does not exist /// the properties for this thread /// /// /// The collection returned is only to be used on the calling thread. If the /// caller needs to share the collection between different threads then the /// caller must clone the collection before doing so. /// /// internal PropertiesDictionary GetProperties(bool create) { PropertiesDictionary properties = (PropertiesDictionary)System.Threading.Thread.GetData(s_threadLocalSlot); if (properties == null && create) { properties = new PropertiesDictionary(); System.Threading.Thread.SetData(s_threadLocalSlot, properties); } return properties; } #endregion Internal Instance Methods } }