diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2013-09-18 21:13:03 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-20 14:27:24 +0200 |
commit | c392069685c9b6c6dec11cc8f1179a2c4e15be13 (patch) | |
tree | b1b232649bcc566d80cef86577d892edf09ff5f7 /src/qml/jsruntime/qv4executableallocator.cpp | |
parent | 8c3f133bc34e2c72d4decc0c9af59965d964bbed (diff) |
Allow delayed deallocation in the executable memory allocator
Allow for allocations to outlive the allocator itself. When the allocator dies,
it invalidates any remaining non-free allocations, making them safe to delete
later.
Change-Id: I6c71cddbbd5dcaff1ad50f3991a3c710d4f96737
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4executableallocator.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4executableallocator.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4executableallocator.cpp b/src/qml/jsruntime/qv4executableallocator.cpp index 2e80f3a611..e539d62d54 100644 --- a/src/qml/jsruntime/qv4executableallocator.cpp +++ b/src/qml/jsruntime/qv4executableallocator.cpp @@ -52,6 +52,14 @@ void *ExecutableAllocator::Allocation::start() const return reinterpret_cast<void*>(addr); } +void ExecutableAllocator::Allocation::deallocate(ExecutableAllocator *allocator) +{ + if (isValid()) + allocator->free(this); + else + delete this; +} + ExecutableAllocator::Allocation *ExecutableAllocator::Allocation::split(size_t dividingSize) { Allocation *remainder = new Allocation; @@ -117,7 +125,8 @@ ExecutableAllocator::ChunkOfPages::~ChunkOfPages() Allocation *alloc = firstAllocation; while (alloc) { Allocation *next = alloc->next; - delete alloc; + if (alloc->isValid()) + delete alloc; alloc = next; } pages->deallocate(); @@ -142,6 +151,12 @@ ExecutableAllocator::ExecutableAllocator() ExecutableAllocator::~ExecutableAllocator() { + foreach (ChunkOfPages *chunk, chunks) { + for (Allocation *allocation = chunk->firstAllocation; allocation; allocation = allocation->next) + if (!allocation->free) + allocation->invalidate(); + } + qDeleteAll(chunks); } |