From 13c825a8bb1e07db255c4d5bb8ab49eda2fef322 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Mon, 22 Apr 2019 13:17:57 -0700 Subject: [PATCH] ro: only hold sm session open when needed --- stratosphere/ro/source/ro_main.cpp | 56 ++++++++++------------ stratosphere/ro/source/ro_registration.cpp | 8 ++-- 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/stratosphere/ro/source/ro_main.cpp b/stratosphere/ro/source/ro_main.cpp index cd5f9e807..0f260ef73 100644 --- a/stratosphere/ro/source/ro_main.cpp +++ b/stratosphere/ro/source/ro_main.cpp @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - + #include #include #include @@ -35,7 +35,7 @@ extern "C" { #define INNER_HEAP_SIZE 0x30000 size_t nx_inner_heap_size = INNER_HEAP_SIZE; char nx_inner_heap[INNER_HEAP_SIZE]; - + void __libnx_initheap(void); void __appInit(void); void __appExit(void); @@ -66,36 +66,33 @@ void __libnx_initheap(void) { void __appInit(void) { Result rc; - + SetFirmwareVersionForLibnx(); - - rc = smInitialize(); - if (R_FAILED(rc)) { - std::abort(); - } - - rc = setsysInitialize(); - if (R_FAILED(rc)) { - std::abort(); - } - - rc = fsInitialize(); - if (R_FAILED(rc)) { - std::abort(); - } - - if (GetRuntimeFirmwareVersion() < FirmwareVersion_300) { - rc = pminfoInitialize(); + + DoWithSmSession([&]() { + rc = setsysInitialize(); if (R_FAILED(rc)) { std::abort(); } - } - - rc = fsdevMountSdmc(); - if (R_FAILED(rc)) { - std::abort(); - } - + + rc = fsInitialize(); + if (R_FAILED(rc)) { + std::abort(); + } + + if (GetRuntimeFirmwareVersion() < FirmwareVersion_300) { + rc = pminfoInitialize(); + if (R_FAILED(rc)) { + std::abort(); + } + } + + rc = fsdevMountSdmc(); + if (R_FAILED(rc)) { + std::abort(); + } + }); + CheckAtmosphereVersion(CURRENT_ATMOSPHERE_VERSION); } @@ -106,7 +103,6 @@ void __appExit(void) { pminfoExit(); } setsysExit(); - smExit(); } /* Helpers to create RO objects. */ @@ -120,7 +116,7 @@ int main(int argc, char **argv) /* Static server manager. */ static auto s_server_manager = WaitableManager(1); - + /* Create services. */ s_server_manager.AddWaitable(new ServiceServer("ro:dmnt", 2)); /* NOTE: Official code passes 32 for ldr:ro max sessions. We will pass 2, because that's the actual limit. */ diff --git a/stratosphere/ro/source/ro_registration.cpp b/stratosphere/ro/source/ro_registration.cpp index 49c090030..74291375b 100644 --- a/stratosphere/ro/source/ro_registration.cpp +++ b/stratosphere/ro/source/ro_registration.cpp @@ -30,9 +30,11 @@ static Registration::RoProcessContext g_process_contexts[Registration::MaxSessio static bool g_is_development_hardware, g_is_development_function_enabled; void Registration::Initialize() { - if (R_FAILED(splInitialize())) { - std::abort(); - } + DoWithSmSession([&]() { + if (R_FAILED(splInitialize())) { + std::abort(); + } + }); ON_SCOPE_EXIT { splExit(); }; if (R_FAILED(splIsDevelopment(&g_is_development_hardware))) {