summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/tanya/memory/allocator.d4
-rw-r--r--source/tanya/memory/mmappool.d55
2 files changed, 30 insertions, 29 deletions
diff --git a/source/tanya/memory/allocator.d b/source/tanya/memory/allocator.d
index 33b47e2..ab0ed7b 100644
--- a/source/tanya/memory/allocator.d
+++ b/source/tanya/memory/allocator.d
@@ -28,7 +28,7 @@ interface Allocator
*
* Returns: Pointer to the new allocated memory.
*/
- void[] allocate(size_t size) shared nothrow @nogc;
+ void[] allocate(in size_t size) shared nothrow @nogc;
/**
* Deallocates a memory block.
@@ -49,7 +49,7 @@ interface Allocator
*
* Returns: Pointer to the allocated memory.
*/
- bool reallocate(ref void[] p, size_t size) shared nothrow @nogc;
+ bool reallocate(ref void[] p, in size_t size) shared nothrow @nogc;
}
/**
diff --git a/source/tanya/memory/mmappool.d b/source/tanya/memory/mmappool.d
index 5682b52..9fefcbd 100644
--- a/source/tanya/memory/mmappool.d
+++ b/source/tanya/memory/mmappool.d
@@ -58,7 +58,7 @@ final class MmapPool : Allocator
*
* Returns: Pointer to the new allocated memory.
*/
- void[] allocate(size_t size) shared nothrow @nogc
+ void[] allocate(in size_t size) shared nothrow @nogc
{
if (!size)
{
@@ -90,11 +90,11 @@ final class MmapPool : Allocator
* into two blocks if the block is too large.
*
* Params:
- * size = Minimum size the block should have.
+ * size = Minimum size the block should have (aligned).
*
* Returns: Data the block points to or $(D_KEYWORD null).
*/
- private void* findBlock(size_t size) shared nothrow @nogc
+ private void* findBlock(in ref size_t size) shared nothrow @nogc
{
Block block1;
RegionLoop: for (auto r = head; r !is null; r = r.next)
@@ -122,11 +122,15 @@ final class MmapPool : Allocator
block2.size = block1.size - blockEntrySize - size;
block2.region = block1.region;
+ if (block1.next !is null)
+ {
+ block1.next.prev = block2;
+ }
block1.next = block2;
block1.size = size;
}
block1.free = false;
- atomicOp!"+="(block1.region.blocks, 1);
+ block1.region.blocks = block1.region.blocks + 1;
return cast(void*) block1 + blockEntrySize;
}
@@ -170,34 +174,31 @@ final class MmapPool : Allocator
return VirtualFree(cast(void*) block.region, 0, MEM_RELEASE) == 0;
}
}
- else
+ // Merge blocks if neigbours are free.
+ if (block.next !is null && block.next.free)
{
- // Merge blocks if neigbours are free.
- if (block.next !is null && block.next.free)
- {
- block.size = blockEntrySize + block.next.size;
- if (block.next.next !is null)
- {
- block.next.next.prev = block;
- }
- block.next = block.next.next;
- }
- if (block.prev !is null && block.prev.free)
+ block.size = block.size + blockEntrySize + block.next.size;
+ if (block.next.next !is null)
{
- block.size = blockEntrySize + block.size;
- if (block.next !is null)
- {
- block.next.prev = block.prev;
- }
- block.prev.next = block.next;
+ block.next.next.prev = block;
}
- else
+ block.next = block.next.next;
+ }
+ if (block.prev !is null && block.prev.free)
+ {
+ block.prev.size = block.prev.size + blockEntrySize + block.size;
+ if (block.next !is null)
{
- block.free = true;
+ block.next.prev = block.prev;
}
- atomicOp!"-="(block.region.blocks, 1);
- return true;
+ block.prev.next = block.next;
}
+ else
+ {
+ block.free = true;
+ }
+ block.region.blocks = block.region.blocks - 1;
+ return true;
}
///
@@ -217,7 +218,7 @@ final class MmapPool : Allocator
*
* Returns: Whether the reallocation was successful.
*/
- bool reallocate(ref void[] p, size_t size) shared nothrow @nogc
+ bool reallocate(ref void[] p, in size_t size) shared nothrow @nogc
{
void[] reallocP;