示例#1
0
        public void RefCountOfPooled()
        {
            var pool = new RetainableMemoryPool <byte>(null, 16,
                                                       1024 * 1024, 50, 2);

            var buf = (ArrayMemory <byte>)pool.Rent(100);

            Assert.IsTrue(buf.IsPoolable);

            Console.WriteLine($"rented: {buf.ReferenceCount}");

            pool.ReturnInternal(buf);

            Assert.IsTrue(buf.IsDisposed);
            Assert.IsTrue(buf.IsPooled);

            Console.WriteLine($"returned: {buf.ReferenceCount}");
            Console.WriteLine($"pooled: {buf.IsPooled}");

            Assert.Throws <ObjectDisposedException>(() =>
            {
                var _ = buf.Retain();
            });

            pool.Dispose();
        }
示例#2
0
        public void RefCountOfPooled()
        {
            var pool = new RetainableMemoryPool <Byte>(RetainableMemoryPool <Byte> .DefaultFactory);

            var buf = (PrivateMemory <byte>)pool.Rent(100);

            Assert.IsTrue(buf.IsPoolable);

            Console.WriteLine($"rented: {buf.ReferenceCount}");

            buf.Dispose();

            Assert.IsTrue(buf.IsDisposed);
            Assert.IsTrue(buf.IsPooled);

            Console.WriteLine($"returned: {buf.ReferenceCount}");
            Console.WriteLine($"pooled: {buf.IsPooled}");

            Assert.Throws <ObjectDisposedException>(() =>
            {
                var _ = buf.Retain();
            });

            pool.Dispose();
        }
示例#3
0
        public void PoolReturnsSameSizeUsingSlices(int maxBucketsToTry)
        {
            var pool = new RetainableMemoryPool <byte>(null, 16,
                                                       8 * 1024 * 1024, maxBuffersPerBucketPerCore: 8, maxBucketsToTry);

            var cw = new ConditionalWeakTable <byte[], object>();

            var list = new List <ArrayMemory <byte> >();

            ArraySegment <byte> prev = default;

            for (int r = 0; r < TestUtils.GetBenchCount(50, 5); r++)
            {
                for (int i = 0; i < TestUtils.GetBenchCount(10240, 1024); i++)
                {
                    const int sizeKb = 1;
                    var       buf    = (ArrayMemory <byte>)pool.Rent(sizeKb * 1024);
                    list.Add(buf);
                    if (!cw.TryGetValue(buf.Array, out var id))
                    {
                        id = (object)i;
                        cw.Add(buf.Array, id);
                    }

                    Assert.IsFalse(buf.ArraySegment.Array == prev.Array && buf.ArraySegment.Offset == prev.Offset,
                                   $"different segments at {i}");
                    prev = buf.ArraySegment;

                    Assert.AreEqual(sizeKb * 1024, buf.Length, $"at {i}");

                    //Console.Write(
                    //    $"{i}: {(int) id} - {buf.Array.Length} - {buf.ArraySegment.Offset} - {buf.ArraySegment.Count}");

                    //Console.WriteLine();

                    //if (i > 8 && i <= 23)
                    //{
                    //    Assert.AreEqual(sizeKb * 2 * 1024, buf.Array.Length, $"at {i}");
                    //    Assert.AreEqual((i & 1) * sizeKb * 1024, buf.ArraySegment.Offset, $"at {i}");
                    //}
                }

                foreach (var buf in list)
                {
                    buf.Dispose();
                    //pool.Return(buf);
                }

                list.Clear();
            }

            pool.Dispose();
        }