MmapPool: (p[] is null) != (p[].ptr is null)
This commit is contained in:
		| @@ -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; | ||||
| 		} | ||||
|   | ||||
| @@ -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); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user