public void TakeDestroyReleaseWorkAsRemove() { SimpleElementsContainer <int> testInst = new SimpleElementsContainer <int>(); try { for (int i = 0; i < 10; i++) { testInst.Add(i, new PoolOperations(), true); } for (int i = 0; i < 10; i++) { var item = testInst.Take(); item.MarkElementDestroyed(); testInst.Release(item); Assert.IsTrue(item.IsRemoved); Assert.IsTrue(item.IsRemoved); Assert.AreEqual(10 - i - 1, testInst.AvailableCount); Assert.AreEqual(10 - i - 1, testInst.Count); } } finally { testInst.ProcessAllElements(o => o.MarkElementDestroyed()); } }
/// <summary> /// Destroys element and removes it from the Pool /// </summary> /// <param name="element">Element</param> private void DestroyAndRemoveElement(PoolElementWrapper <TElem> element) { Contract.Requires(element != null); Contract.Requires(element.IsBusy); Contract.Requires(!element.IsElementDestroyed); try { DestroyElementInner(element); } finally { _elementsContainer.Release(element); } Profiling.Profiler.ObjectPoolElementDestroyed(this.Name, this.ElementCount); }
/// <summary> /// Destroys element and removes it from the Pool /// </summary> /// <param name="element">Element</param> private void DestroyAndRemoveElement(PoolElementWrapper <TElem> element) { TurboContract.Requires(element != null, conditionString: "element != null"); TurboContract.Requires(element.IsBusy, conditionString: "element.IsBusy"); TurboContract.Requires(!element.IsElementDestroyed, conditionString: "!element.IsElementDestroyed"); try { DestroyElementInner(element); } finally { _elementsContainer.Release(element); } Profiling.Profiler.ObjectPoolElementDestroyed(this.Name, this.ElementCount); }
private static TimeSpan TestObjectPoolWithLListSimple(SimpleElementsContainer <PoolElem> pool, int threadCount, int opCount, int pauseSpin) { Thread[] threads = new Thread[threadCount]; Barrier startBar = new Barrier(threadCount + 1); int opCountPerThread = opCount / threadCount; Action thAct = () => { startBar.SignalAndWait(); int execOp = 0; while (execOp++ < opCountPerThread) { PoolElementWrapper <PoolElem> el = null; try { el = pool.Take(); //Thread.Sleep(pauseSpin); SpinWaitHelper.SpinWait(pauseSpin); } finally { pool.Release(el); } } }; for (int i = 0; i < threads.Length; i++) { threads[i] = new Thread(new ThreadStart(thAct)); } for (int i = 0; i < threads.Length; i++) { threads[i].Start(); } startBar.SignalAndWait(); Stopwatch sw = Stopwatch.StartNew(); for (int i = 0; i < threads.Length; i++) { threads[i].Join(); } sw.Stop(); Console.WriteLine("ObjectPoolWithLListSimple. Elapsed = " + sw.ElapsedMilliseconds.ToString() + "ms"); return(sw.Elapsed); }
/// <summary> /// Destroys element and removes it from the Pool /// </summary> /// <param name="element">Element</param> private void DestroyAndRemoveElement(PoolElementWrapper <TElem> element) { Contract.Requires(element != null); Contract.Requires(element.IsBusy); Contract.Requires(!element.IsElementDestroyed); try { this.DestroyElement(element.Element); element.MarkElementDestroyed(); } finally { if (element.IsElementDestroyed) { Interlocked.Decrement(ref _reservedCount); } _elementsContainer.Release(element); } Profiling.Profiler.ObjectPoolElementDestroyed(this.Name, this.ElementCount); }
private static void RunTestObjectPoolWithLListSimple(int threadCount, int elemCount, int opCount, int pauseSpin) { SimpleElementsContainer <PoolElem> pool = new SimpleElementsContainer <PoolElem>(); for (int i = 0; i < elemCount; i++) { pool.Add(new PoolElem(), new PoolElemOpSup(), true); } TestObjectPoolWithLListSimple(pool, threadCount, opCount, pauseSpin); PoolElementWrapper <PoolElem> tmp; while (pool.TryTake(out tmp, 0, new CancellationToken())) { tmp.MarkElementDestroyed(); pool.Release(tmp); } }
public void TestTakeUntilEmpty() { SimpleElementsContainer <int> testInst = new SimpleElementsContainer <int>(); try { for (int i = 0; i < 10; i++) { testInst.Add(i, new PoolOperations(), true); } List <PoolElementWrapper <int> > takenElems = new List <PoolElementWrapper <int> >(); PoolElementWrapper <int> item; for (int i = 0; i < 10; i++) { bool takeRes = testInst.TryTake(out item, 0, new CancellationToken()); takenElems.Add(item); Assert.IsTrue(takeRes); Assert.IsNotNull(item); Assert.IsTrue(item.IsBusy); } Assert.AreEqual(0, testInst.AvailableCount); bool takeResO = testInst.TryTake(out item, 0, new CancellationToken()); Assert.IsFalse(takeResO); for (int i = 0; i < takenElems.Count; i++) { testInst.Release(takenElems[i]); } } finally { testInst.ProcessAllElements(o => o.MarkElementDestroyed()); } }
public void TestSimpleTakeRelease() { SimpleElementsContainer <int> testInst = new SimpleElementsContainer <int>(); try { for (int i = 0; i < 10; i++) { testInst.Add(i, new PoolOperations(), true); } Assert.AreEqual(10, testInst.Count); Assert.AreEqual(10, testInst.AvailableCount); var item = testInst.Take(); Assert.IsNotNull(item); Assert.IsTrue(item.Element >= 0 && item.Element < 10); Assert.IsTrue(item.IsBusy); Assert.IsFalse(item.IsElementDestroyed); Assert.AreEqual(10, testInst.Count); Assert.AreEqual(9, testInst.AvailableCount); testInst.Release(item); Assert.IsFalse(item.IsBusy); Assert.AreEqual(10, testInst.Count); Assert.AreEqual(10, testInst.AvailableCount); } finally { testInst.ProcessAllElements(o => o.MarkElementDestroyed()); } }
private void RunComplexTest(SimpleElementsContainer <int> testInst, int threadCount, int opCount, int pauseSpin) { Assert.AreEqual(testInst.AvailableCount, testInst.Count); Thread[] threads = new Thread[threadCount]; Barrier startBar = new Barrier(threadCount + 1); int opCountPerThread = opCount / threadCount; Action thAct = () => { startBar.SignalAndWait(); TestContext.WriteLine("Inside thread. Signal and wait passed"); try { int execOp = 0; while (execOp++ < opCountPerThread) { PoolElementWrapper <int> item = null; try { item = testInst.Take(); //Thread.Sleep(pauseSpin); Thread.SpinWait(pauseSpin); } finally { testInst.Release(item); } } } catch (Exception ex) { TestContext.WriteLine("Unhandled exception: " + ex.ToString()); throw; } }; for (int i = 0; i < threads.Length; i++) { threads[i] = new Thread(new ThreadStart(thAct)); } TestContext.WriteLine("Threads created"); for (int i = 0; i < threads.Length; i++) { threads[i].Start(); } TestContext.WriteLine("Threads started"); startBar.SignalAndWait(); TestContext.WriteLine("Threads before join"); for (int i = 0; i < threads.Length; i++) { threads[i].Join(); } TestContext.WriteLine("All threads stopped"); Assert.AreEqual(testInst.AvailableCount, testInst.Count); }