public ThreadStaticValue(ThreadStatic <T> key, T value, ThreadStaticValue previous) { threadId = Thread.CurrentThread.ManagedThreadId; this.key = key; this.value = value; this.previous = previous; }
public IDisposable Use(T value) { ThreadStaticValue old; ThreadStatics.TryGetValue(this, out old); return(ThreadStatics[this] = new ThreadStaticValue(this, value, old)); }
private void DisposeCurrentScope(ThreadStaticValue valueToDispose) { valueToDispose.MarkAsDisposed(); if (valueToDispose.previous == null) { ThreadStatics.Remove(this); } else { ThreadStatics[this] = valueToDispose.previous; } }
private void DisposeScope(ThreadStaticValue valueToDispose) { if (Thread.CurrentThread.ManagedThreadId != valueToDispose.threadId) { throw new DisposingOnDifferentThreadToCreation(); // ncrunch: no coverage } ThreadStatics.TryGetValue(this, out innerMost); while (innerMost != valueToDispose) { DisposeInnerMostScopes(); } DisposeCurrentScope(valueToDispose); }
private void DisposeInnerMostScopes() { innerMost.MarkAsDisposed(); innerMost = innerMost.previous; }