aboutsummaryrefslogtreecommitdiff
path: root/src/common/fiber.cpp
diff options
context:
space:
mode:
authorPastaLaPate <pastalapate@proton.me>2026-11-02 20:34:15 +0100
committerGitHub <noreply@github.com>2026-11-02 20:34:15 +0100
commit6f002badce45fa2fdb414043544c829e834a7e27 (patch)
tree51c21a851fbc8218ebe7febb69fb710a891cc4fc /src/common/fiber.cpp
parent396f011ea875dfe4fdb1b0f489651ab74a505b74 (diff)
parent046646e3514ca4950622d75609e68498f889989e (diff)
Merge branch 'nx2' into ci/qt-6.12.0
Diffstat (limited to 'src/common/fiber.cpp')
-rw-r--r--src/common/fiber.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/common/fiber.cpp b/src/common/fiber.cpp
index 08558a0026..613ac97e22 100644
--- a/src/common/fiber.cpp
+++ b/src/common/fiber.cpp
@@ -25,8 +25,10 @@ struct Fiber::FiberImpl {
FiberImpl() {}
u32 canary_1 = CANARY_VALUE;
- std::array<u8, DEFAULT_STACK_SIZE> stack;
- std::array<u8, DEFAULT_STACK_SIZE> rewind_stack;
+ // Left uninitialized: the host gives a stack's pages memory only as they are used. Zero-filled
+ // std::arrays (and a second stack nothing switched to) made every fiber, one per guest thread,
+ // hold 4 MiB: ~750 MiB for title 1's ~190 threads.
+ std::unique_ptr<u8[]> stack;
u32 canary_2 = CANARY_VALUE;
boost::context::detail::fcontext_t context{};
@@ -38,7 +40,6 @@ struct Fiber::FiberImpl {
std::shared_ptr<Fiber> previous_fiber;
u8* stack_limit = nullptr;
- u8* rewind_stack_limit = nullptr;
bool is_thread_fiber = false;
bool released = false;
};
@@ -49,10 +50,10 @@ void Fiber::SetRewindPoint(std::function<void()>&& rewind_func) {
Fiber::Fiber(std::function<void()>&& entry_point_func) : impl{std::make_unique<FiberImpl>()} {
impl->entry_point = std::move(entry_point_func);
- impl->stack_limit = impl->stack.data();
- impl->rewind_stack_limit = impl->rewind_stack.data();
+ impl->stack.reset(new u8[DEFAULT_STACK_SIZE]);
+ impl->stack_limit = impl->stack.get();
u8* stack_base = impl->stack_limit + DEFAULT_STACK_SIZE;
- impl->context = boost::context::detail::make_fcontext(stack_base, impl->stack.size(), [](boost::context::detail::transfer_t transfer) -> void {
+ impl->context = boost::context::detail::make_fcontext(stack_base, DEFAULT_STACK_SIZE, [](boost::context::detail::transfer_t transfer) -> void {
auto* fiber = static_cast<Fiber*>(transfer.data);
ASSERT(fiber && fiber->impl && fiber->impl->previous_fiber && fiber->impl->previous_fiber->impl);
ASSERT(fiber->impl->canary_1 == CANARY_VALUE);