/// <summary> /// Takes element from the <see cref="_elementsContainer"/> then destroys it and removes from the Pool /// </summary> /// <returns>Whether the element was presented in <see cref="_elementsContainer"/></returns> private bool TakeDestroyAndRemoveElement() { PoolElementWrapper <TElem> element = null; if (_elementsContainer.TryTake(out element, 0, new CancellationToken())) { DestroyAndRemoveElement(element); return(true); } return(false); }
public void TestTakeBlocks() { SimpleElementsContainer <int> testInst = new SimpleElementsContainer <int>(); CancellationTokenSource tokSrc = new CancellationTokenSource(); bool wasCancelled = false; bool wasEntered = false; bool wasExited = false; Task.Run(() => { try { Volatile.Write(ref wasEntered, true); PoolElementWrapper <int> item; testInst.TryTake(out item, -1, tokSrc.Token); } catch (OperationCanceledException) { Volatile.Write(ref wasCancelled, true); } Volatile.Write(ref wasExited, true); }); TimingAssert.IsTrue(10000, () => Volatile.Read(ref wasEntered)); Thread.Sleep(100); Assert.IsFalse(Volatile.Read(ref wasExited)); tokSrc.Cancel(); TimingAssert.IsTrue(10000, () => Volatile.Read(ref wasExited)); Assert.IsTrue(Volatile.Read(ref wasCancelled)); }
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()); } }
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 TestRemoveOnTake() { SimpleElementsContainer <int> testInst = new SimpleElementsContainer <int>(); try { for (int i = 0; i < 10; i++) { testInst.Add(i, new PoolOperations(), true); } testInst.ProcessAllElements(o => o.MarkElementDestroyed()); PoolElementWrapper <int> item; bool takeResult = testInst.TryTake(out item, 0, new CancellationToken()); Assert.IsFalse(takeResult); Assert.AreEqual(0, testInst.Count); } finally { testInst.ProcessAllElements(o => o.MarkElementDestroyed()); } }