#region Apache License // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to you 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; #if NETCF using System.Collections; #endif 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 #if NETCF /// /// The thread local data slot to use to store a PropertiesDictionary. /// private readonly static LocalDataStoreSlot s_threadLocalSlot = System.Threading.Thread.AllocateDataSlot(); #else /// /// Each thread will automatically have its instance. /// [ThreadStatic] private static PropertiesDictionary _dictionary; #endif #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 { #if NETCF PropertiesDictionary _dictionary = GetProperties(false); #endif 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) { #if NETCF PropertiesDictionary _dictionary = GetProperties(false); #endif if (_dictionary != null) { _dictionary.Remove(key); } } /// /// Get the keys stored in the properties. /// /// /// Gets the keys stored in the properties. /// /// a set of the defined keys public string[] GetKeys() { #if NETCF PropertiesDictionary _dictionary = GetProperties(false); #endif if (_dictionary != null) { return _dictionary.GetKeys(); } return null; } /// /// Clear all properties /// /// /// /// Clear all properties /// /// public void Clear() { #if NETCF PropertiesDictionary _dictionary = GetProperties(false); #endif 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 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) { #if NETCF PropertiesDictionary _dictionary = (PropertiesDictionary)System.Threading.Thread.GetData(s_threadLocalSlot); #endif if (_dictionary == null && create) { _dictionary = new PropertiesDictionary(); #if NETCF System.Threading.Thread.SetData(s_threadLocalSlot, _dictionary); #endif } return _dictionary; } #endregion Internal Instance Methods } }