mirror of
https://github.com/Samsung/escargot.git
synced 2026-06-22 10:01:50 +00:00
When thread exit, we should unmap mapped memory which is mapped from bdwgc
Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
parent
20c7641b16
commit
7bd328b5df
2 changed files with 50 additions and 2 deletions
|
|
@ -93,6 +93,50 @@ MAY_THREAD_LOCAL Value* ThreadLocal::g_tcoBuffer;
|
|||
#endif
|
||||
MAY_THREAD_LOCAL void* ThreadLocal::g_customData;
|
||||
|
||||
#if defined(ENABLE_THREADING)
|
||||
class GlobalDeleteChecker {
|
||||
public:
|
||||
GlobalDeleteChecker();
|
||||
~GlobalDeleteChecker();
|
||||
// FIXME: using std::vector on { darwin, android } cause error
|
||||
size_t m_mappedMemoriesAllocatedSize = 8;
|
||||
size_t m_mappedMemoriesSize = 0;
|
||||
std::pair<void*, size_t>* m_mappedMemories;
|
||||
};
|
||||
|
||||
thread_local std::unique_ptr<GlobalDeleteChecker> g_globalDeleteChecker;
|
||||
|
||||
GlobalDeleteChecker::GlobalDeleteChecker()
|
||||
{
|
||||
m_mappedMemories = reinterpret_cast<std::pair<void*, size_t>*>(malloc(sizeof(std::pair<void*, size_t>) * m_mappedMemoriesAllocatedSize));
|
||||
GC_set_os_get_mem_proc([](void* ptr, size_t length) {
|
||||
if (g_globalDeleteChecker->m_mappedMemoriesSize == g_globalDeleteChecker->m_mappedMemoriesAllocatedSize) {
|
||||
std::pair<void*, size_t>* newBuf = reinterpret_cast<std::pair<void*, size_t>*>(
|
||||
malloc(sizeof(std::pair<void*, size_t>) * g_globalDeleteChecker->m_mappedMemoriesSize * 2));
|
||||
memcpy(newBuf, g_globalDeleteChecker->m_mappedMemories, sizeof(std::pair<void*, size_t>) * g_globalDeleteChecker->m_mappedMemoriesSize);
|
||||
g_globalDeleteChecker->m_mappedMemoriesAllocatedSize *= 2;
|
||||
free(g_globalDeleteChecker->m_mappedMemories);
|
||||
g_globalDeleteChecker->m_mappedMemories = newBuf;
|
||||
}
|
||||
g_globalDeleteChecker->m_mappedMemories[g_globalDeleteChecker->m_mappedMemoriesSize++] = std::make_pair(ptr, length);
|
||||
});
|
||||
}
|
||||
|
||||
GlobalDeleteChecker::~GlobalDeleteChecker()
|
||||
{
|
||||
for (size_t i = 0; i < m_mappedMemoriesSize; i++) {
|
||||
auto e = m_mappedMemories[i];
|
||||
#if defined(OS_WINDOWS)
|
||||
VirtualFree(e.first, 0, MEM_RELEASE);
|
||||
#else
|
||||
munmap(e.first, e.second);
|
||||
#endif
|
||||
}
|
||||
|
||||
free(m_mappedMemories);
|
||||
}
|
||||
#endif
|
||||
|
||||
GCEventListenerSet::EventListenerVector* GCEventListenerSet::ensureMarkStartListeners()
|
||||
{
|
||||
if (!m_markStartListeners) {
|
||||
|
|
@ -205,7 +249,11 @@ void ThreadLocal::initialize()
|
|||
{
|
||||
// initialize should be invoked only once in each thread
|
||||
ESCARGOT_RELEASE_ASSERT(!inited);
|
||||
|
||||
#if defined(ENABLE_THREADING)
|
||||
if (!g_globalDeleteChecker) {
|
||||
g_globalDeleteChecker = std::unique_ptr<GlobalDeleteChecker>(new GlobalDeleteChecker());
|
||||
}
|
||||
#endif
|
||||
// Heap is initialized for each thread
|
||||
Heap::initialize();
|
||||
|
||||
|
|
|
|||
2
third_party/GCutil
vendored
2
third_party/GCutil
vendored
|
|
@ -1 +1 @@
|
|||
Subproject commit 4565459f8d45409c7a21f39890c3e5f0b2e5525c
|
||||
Subproject commit 2ea9202ed7e14e5ebf02ea962cefd155e216af86
|
||||
Loading…
Add table
Add a link
Reference in a new issue