From 4c4e65b3739ca30b587eb20d4fcea3abb5e1550b Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Thu, 12 Jan 2017 19:31:49 +0100 Subject: [PATCH] MmapPool: (p[] is null) != (p[].ptr is null) --- source/tanya/memory/mmappool.d | 2 +- source/tanya/memory/package.d | 27 +++++++++++++++++++-------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/source/tanya/memory/mmappool.d b/source/tanya/memory/mmappool.d index eac7418..a363219 100644 --- a/source/tanya/memory/mmappool.d +++ b/source/tanya/memory/mmappool.d @@ -156,7 +156,7 @@ final class MmapPool : Allocator */ bool deallocate(void[] p) shared nothrow @nogc { - if (p is null) + if (p.ptr is null) { return true; } diff --git a/source/tanya/memory/package.d b/source/tanya/memory/package.d index 60a45a6..3979fe0 100644 --- a/source/tanya/memory/package.d +++ b/source/tanya/memory/package.d @@ -220,15 +220,26 @@ void dispose(T)(shared Allocator allocator, auto ref T p) } /// Ditto. -void dispose(T)(shared Allocator allocator, auto ref T[] array) +void dispose(T)(shared Allocator allocator, auto ref T[] p) { - static if (hasElaborateDestructor!(typeof(array[0]))) + static if (hasElaborateDestructor!(typeof(p[0]))) { - foreach (ref e; array) - { - destroy(e); + import std.algorithm.iteration; + p.each!(e => destroy(e)); } - } - () @trusted { allocator.deallocate(array); }(); - array = null; + () @trusted { allocator.deallocate(p); }(); + p = null; +} + +unittest +{ + struct S + { + ~this() + { + } + } + auto p = cast(S[]) defaultAllocator.allocate(S.sizeof); + + defaultAllocator.dispose(p); }