public static void Pop(ILoggingContext context) { var frameID = GetFrameID(context); var frame = new LoggingCallContextStackFrame(frameID); if (!frame.Deactivate()) { return; } using (var keySet = Keys().GetEditor()) { foreach (var key in frame.Keys) { var activeFrameData = new LoggingCallContextActiveFrameData(key); LoggingCallContextStackFrame currentFrame; while (activeFrameData.TryGetFrame(out currentFrame) && !currentFrame.IsActive()) { currentFrame.FreeKey(key); if (!activeFrameData.Pop()) { keySet.Remove(key); break; } } } CallContext.LogicalSetData(SERIALIZATION_KEY, SerializeToXML(keySet.DataStore())); } }
//private string CountKey() //{ // return string.Format("{0}[{1}]", _name, "count"); //} //public int Count() //{ // var data = CallContext.LogicalGetData(CountKey()); // if (data == null) { return 0; } // return (int)data; //} //private void IncrementCount() //{ // CallContext.LogicalSetData(CountKey(), Count() + 1); //} //private void DecrementCount() //{ // int count = Count(); // if (count > 1) // { // CallContext.LogicalSetData(CountKey(), count - 1); // } // else // { // CallContext.FreeNamedDataSlot(CountKey()); // } //} public void AddOrUpdate <T>(string key, Func <T> newDataFunc, Func <T, T> updateDataFunc) { var name = String.Format("{0}.{1}", _name, key); var data = CallContext.LogicalGetData(name); if (data == null) { var newData = newDataFunc(); if (newData == null) { throw new InvalidOperationException("Cannot insert null"); } CallContext.LogicalSetData(name, newData); //IncrementCount(); } else { var updateData = updateDataFunc((T)data); if (updateData == null) { throw new InvalidOperationException("Cannot update null"); } CallContext.LogicalSetData(name, updateData); } }
public void Push(T data) { int len = Length(); var name = IndexName(len); CallContext.LogicalSetData(name, data); CallContext.LogicalSetData(_size, len + 1); }
public bool Remove(string key) { var name = String.Format("{0}.{1}", _name, key); var data = CallContext.LogicalGetData(name); CallContext.FreeNamedDataSlot(name); //DecrementCount(); return(data == null); }
/// <summary> /// Bring back an xml version of the active context data, /// a cached version will be brought back under normal /// circumstances, and a special un-cached version will be used /// </summary> public static string SerializeToXML() { var contextSerialization = (string)CallContext.LogicalGetData(SERIALIZATION_KEY); if (contextSerialization == null) { contextSerialization = SerializeToXML(Keys().GetData()); CallContext.LogicalSetData(SERIALIZATION_KEY, contextSerialization); } return(contextSerialization); }
public CallContextSet(string name) { _name = name; _dataKeyName = String.Format("{0}.{1}", _name, "data"); var data = CallContext.LogicalGetData(_dataKeyName); if (data == null) { Update(new HashSet <T>()); } }
public CallContextStack(string name) { _name = name; _size = String.Format("{0}.{1}", _name, "size"); var size = CallContext.LogicalGetData(_size); if (size == null) { CallContext.LogicalSetData(_size, 0); } }
public bool TryGetValue(string key, out T data) { var name = String.Format("{0}.{1}", _name, key); var innerData = CallContext.LogicalGetData(name); if (innerData == null) { data = default(T); return(false); } data = (T)innerData; return(true); }
public bool Pop() { var len = Length(); if (len <= 0) { return(false); } len = len - 1; CallContext.FreeNamedDataSlot(IndexName(len)); CallContext.LogicalSetData(_size, len); return(true); }
public bool TryPeek(out T data) { int len = Length() - 1; var name = IndexName(len); var result = CallContext.LogicalGetData(name); if (result == null) { data = default(T); return(false); } data = (T)result; return(true); }
public static ILoggingContext Push(IEnumerable <KeyValuePair <string, object> > data) { var context = new LoggingContext(); var frame = LoggingCallContextStackFrame.Initialize(context, data); using (var keySet = Keys().GetEditor()) { foreach (var key in frame.Keys) { LoggingCallContextActiveFrameData.Initialize(frame, key); keySet.Add(key); } CallContext.LogicalSetData(SERIALIZATION_KEY, SerializeToXML(keySet.DataStore())); } return(context); }
public bool TryRemove(string key, out T result) { var name = String.Format("{0}.{1}", _name, key); var data = CallContext.LogicalGetData(name); CallContext.FreeNamedDataSlot(name); //DecrementCount(); if (data == null) { result = default(T); return(false); } else { result = (T)data; return(true); } }
internal void Update(HashSet <T> newData) { CallContext.LogicalSetData(_dataKeyName, newData); }
internal HashSet <T> Data() { return((HashSet <T>)CallContext.LogicalGetData(_dataKeyName)); }
private int Length() { return((int)CallContext.LogicalGetData(_size)); }