summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/tanya/memory/mmappool.d2
-rw-r--r--source/tanya/memory/package.d25
2 files changed, 19 insertions, 8 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(p); }();
+ p = null;
+}
+
+unittest
+{
+ struct S
+ {
+ ~this()
+ {
+ }
}
- () @trusted { allocator.deallocate(array); }();
- array = null;
+ auto p = cast(S[]) defaultAllocator.allocate(S.sizeof);
+
+ defaultAllocator.dispose(p);
}