mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-19 17:02:14 +00:00
Release the dynamic heap a little more eagerly
This commit is contained in:
parent
6eec927ad8
commit
3124a77165
1 changed files with 26 additions and 5 deletions
|
@ -45,11 +45,12 @@ namespace ams::mitm::fs {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Fancy Dynamic allocation globals. */
|
/* Dynamic allocation globals. */
|
||||||
constinit os::SdkMutex g_romfs_build_lock;
|
constinit os::SdkMutex g_romfs_build_lock;
|
||||||
constinit ncm::ProgramId g_dynamic_heap_program_id{};
|
constinit ncm::ProgramId g_dynamic_heap_program_id{};
|
||||||
constinit size_t g_dynamic_heap_size = 0;
|
constinit size_t g_dynamic_heap_size = 0;
|
||||||
|
|
||||||
|
constinit os::SdkMutex g_release_dynamic_heap_lock;
|
||||||
constinit bool g_building_from_dynamic_heap = false;
|
constinit bool g_building_from_dynamic_heap = false;
|
||||||
constinit uintptr_t g_dynamic_heap_address = 0;
|
constinit uintptr_t g_dynamic_heap_address = 0;
|
||||||
constinit size_t g_dynamic_heap_outstanding_allocations = 0;
|
constinit size_t g_dynamic_heap_outstanding_allocations = 0;
|
||||||
|
@ -68,6 +69,8 @@ namespace ams::mitm::fs {
|
||||||
g_building_from_dynamic_heap = true;
|
g_building_from_dynamic_heap = true;
|
||||||
|
|
||||||
if (g_dynamic_heap_address == 0) {
|
if (g_dynamic_heap_address == 0) {
|
||||||
|
/* NOTE: Lock not necessary, because this is the only location which do 0 -> non-zero. */
|
||||||
|
|
||||||
/* Map application memory as heap. */
|
/* Map application memory as heap. */
|
||||||
R_ABORT_UNLESS(os::AllocateUnsafeMemory(std::addressof(g_dynamic_heap_address), g_dynamic_heap_size));
|
R_ABORT_UNLESS(os::AllocateUnsafeMemory(std::addressof(g_dynamic_heap_address), g_dynamic_heap_size));
|
||||||
AMS_ABORT_UNLESS(g_dynamic_heap_address != 0);
|
AMS_ABORT_UNLESS(g_dynamic_heap_address != 0);
|
||||||
|
@ -78,9 +81,26 @@ namespace ams::mitm::fs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ReleaseDynamicHeap() {
|
||||||
|
std::scoped_lock lk(g_release_dynamic_heap_lock);
|
||||||
|
|
||||||
|
if (g_dynamic_heap_address != 0) {
|
||||||
|
util::DestroyAt(g_dynamic_heap);
|
||||||
|
g_dynamic_heap = {};
|
||||||
|
|
||||||
|
R_ABORT_UNLESS(os::FreeUnsafeMemory(g_dynamic_heap_address, g_dynamic_heap_size));
|
||||||
|
|
||||||
|
g_dynamic_heap_address = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void FinalizeDynamicHeapForBuildRomfs() {
|
void FinalizeDynamicHeapForBuildRomfs() {
|
||||||
/* We are definitely no longer building out of dynamic heap. */
|
/* We are definitely no longer building out of dynamic heap. */
|
||||||
g_building_from_dynamic_heap = false;
|
g_building_from_dynamic_heap = false;
|
||||||
|
|
||||||
|
if (g_dynamic_heap_outstanding_allocations == 0) {
|
||||||
|
ReleaseDynamicHeap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -107,6 +127,10 @@ namespace ams::mitm::fs {
|
||||||
if (IsAllocatedFromDynamicHeap(p)) {
|
if (IsAllocatedFromDynamicHeap(p)) {
|
||||||
--g_dynamic_heap_outstanding_allocations;
|
--g_dynamic_heap_outstanding_allocations;
|
||||||
util::GetReference(g_dynamic_heap).Free(p);
|
util::GetReference(g_dynamic_heap).Free(p);
|
||||||
|
|
||||||
|
if (!g_building_from_dynamic_heap && g_dynamic_heap_outstanding_allocations == 0) {
|
||||||
|
ReleaseDynamicHeap();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
std::free(p);
|
std::free(p);
|
||||||
}
|
}
|
||||||
|
@ -873,10 +897,7 @@ namespace ams::mitm::fs {
|
||||||
|
|
||||||
/* Free the heap. */
|
/* Free the heap. */
|
||||||
if (g_dynamic_heap_address != 0) {
|
if (g_dynamic_heap_address != 0) {
|
||||||
util::DestroyAt(g_dynamic_heap);
|
ReleaseDynamicHeap();
|
||||||
g_dynamic_heap = {};
|
|
||||||
|
|
||||||
R_ABORT_UNLESS(os::FreeUnsafeMemory(g_dynamic_heap_address, g_dynamic_heap_size));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the heap globals. */
|
/* Clear the heap globals. */
|
||||||
|
|
Loading…
Reference in a new issue