summaryrefslogtreecommitdiffstats
path: root/src/v4/qv4mm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/v4/qv4mm.cpp')
-rw-r--r--src/v4/qv4mm.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/v4/qv4mm.cpp b/src/v4/qv4mm.cpp
index 26c26c04..0281aeca 100644
--- a/src/v4/qv4mm.cpp
+++ b/src/v4/qv4mm.cpp
@@ -128,7 +128,8 @@ bool operator<(const MemoryManager::Data::Chunk &a, const MemoryManager::Data::C
} } // namespace QQmlJS::VM
MemoryManager::MemoryManager()
- : m_d(new Data(true))
+ : m_d(new Data(true))\
+ , m_contextList(0)
{
setEnableGC(true);
#ifdef V4_USE_VALGRIND
@@ -280,6 +281,20 @@ std::size_t MemoryManager::sweep()
for (QVector<Data::Chunk>::iterator i = m_d->heapChunks.begin(), ei = m_d->heapChunks.end(); i != ei; ++i)
freedCount += sweep(reinterpret_cast<char*>(i->memory.base()), i->memory.size(), i->chunkSize);
+ ExecutionContext *ctx = m_contextList;
+ ExecutionContext **n = &m_contextList;
+ while (ctx) {
+ ExecutionContext *next = ctx->next;
+ if (!ctx->marked) {
+ free(ctx);
+ *n = next;
+ } else {
+ ctx->marked = false;
+ n = &ctx->next;
+ }
+ ctx = next;
+ }
+
return freedCount;
}