strat: no longer materially constrained by sm session limit

This commit is contained in:
Michael Scire
2021-04-13 23:58:10 -07:00
parent 997e4dd665
commit 2e1a93f1d1
37 changed files with 215 additions and 333 deletions

View File

@@ -18,47 +18,52 @@
namespace ams::sm {
namespace {
constinit int g_ref_count = 0;
constinit os::SdkMutex g_mutex;
}
/* Initialization. */
Result Initialize() {
std::scoped_lock lk(g_mutex);
if (g_ref_count > 0) {
++g_ref_count;
} else {
R_TRY(::smInitialize());
g_ref_count = 1;
}
return ResultSuccess();
}
Result Finalize() {
/* NOTE: Nintendo does nothing here. */
return ResultSuccess();
}
/* Ordinary SM API. */
Result GetService(Service *out, ServiceName name) {
return impl::DoWithUserSession([&]() {
return smGetServiceWrapper(out, impl::ConvertName(name));
});
return smGetServiceWrapper(out, impl::ConvertName(name));
}
Result RegisterService(Handle *out, ServiceName name, size_t max_sessions, bool is_light) {
return impl::DoWithUserSession([&]() {
return smRegisterService(out, impl::ConvertName(name), is_light, static_cast<int>(max_sessions));
});
return smRegisterService(out, impl::ConvertName(name), is_light, static_cast<int>(max_sessions));
}
Result UnregisterService(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smUnregisterService(impl::ConvertName(name));
});
return smUnregisterService(impl::ConvertName(name));
}
/* Atmosphere extensions. */
Result HasService(bool *out, ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereHasService(out, impl::ConvertName(name));
});
return smAtmosphereHasService(out, impl::ConvertName(name));
}
Result WaitService(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereWaitService(impl::ConvertName(name));
});
}
namespace impl {
void DoWithSessionImpl(void (*Invoker)(void *), void *Function) {
impl::DoWithUserSession([&]() {
Invoker(Function);
return ResultSuccess();
});
}
return smAtmosphereWaitService(impl::ConvertName(name));
}
}

View File

@@ -26,21 +26,15 @@ namespace ams::sm::mitm {
}
Result UninstallMitm(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereMitmUninstall(impl::ConvertName(name));
});
return smAtmosphereMitmUninstall(impl::ConvertName(name));
}
Result DeclareFutureMitm(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereMitmDeclareFuture(impl::ConvertName(name));
});
return smAtmosphereMitmDeclareFuture(impl::ConvertName(name));
}
Result ClearFutureMitm(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereMitmClearFuture(impl::ConvertName(name));
});
return smAtmosphereMitmClearFuture(impl::ConvertName(name));
}
Result AcknowledgeSession(Service *out_service, MitmProcessInfo *out_info, ServiceName name) {
@@ -50,15 +44,11 @@ namespace ams::sm::mitm {
}
Result HasMitm(bool *out, ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereHasMitm(out, impl::ConvertName(name));
});
return smAtmosphereHasMitm(out, impl::ConvertName(name));
}
Result WaitMitm(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereWaitMitm(impl::ConvertName(name));
});
return smAtmosphereWaitMitm(impl::ConvertName(name));
}
}

View File

@@ -21,17 +21,12 @@ namespace ams::sm::impl {
namespace {
/* Globals. */
os::Mutex g_user_session_mutex(true);
os::Mutex g_mitm_ack_session_mutex(true);
os::Mutex g_per_thread_session_mutex(true);
constinit os::Mutex g_mitm_ack_session_mutex(true);
constinit os::Mutex g_per_thread_session_mutex(true);
}
/* Utilities. */
os::Mutex &GetUserSessionMutex() {
return g_user_session_mutex;
}
os::Mutex &GetMitmAcknowledgementSessionMutex() {
return g_mitm_ack_session_mutex;
}

View File

@@ -21,24 +21,9 @@
namespace ams::sm::impl {
/* Utilities. */
os::Mutex &GetUserSessionMutex();
os::Mutex &GetMitmAcknowledgementSessionMutex();
os::Mutex &GetPerThreadSessionMutex();
template<typename F>
Result DoWithUserSession(F f) {
std::scoped_lock lk(GetUserSessionMutex());
{
R_ABORT_UNLESS(smInitialize());
ON_SCOPE_EXIT {
R_ABORT_UNLESS(smDetachClient());
smExit();
};
return f();
}
}
template<typename F>
Result DoWithMitmAcknowledgementSession(F f) {
std::scoped_lock lk(GetMitmAcknowledgementSessionMutex());