mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
pgl: implement bool tracking commands
This commit is contained in:
parent
e53a592f72
commit
e4653eeaef
8 changed files with 84 additions and 11 deletions
|
@ -34,7 +34,7 @@ namespace ams::pgl {
|
||||||
Result EnableApplicationCrashReport(bool enabled);
|
Result EnableApplicationCrashReport(bool enabled);
|
||||||
Result IsApplicationCrashReportEnabled(bool *out);
|
Result IsApplicationCrashReportEnabled(bool *out);
|
||||||
Result EnableApplicationAllThreadDumpOnCrash(bool enabled);
|
Result EnableApplicationAllThreadDumpOnCrash(bool enabled);
|
||||||
Result TriggerSnapShotDumper(const char *arg, SnapShotDumpType dump_type);
|
Result TriggerApplicationSnapShotDumper(const char *arg, SnapShotDumpType dump_type);
|
||||||
|
|
||||||
Result GetEventObserver(pgl::EventObserver *out);
|
Result GetEventObserver(pgl::EventObserver *out);
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace ams::pgl::sf {
|
||||||
virtual Result EnableApplicationCrashReport(bool enabled) = 0;
|
virtual Result EnableApplicationCrashReport(bool enabled) = 0;
|
||||||
virtual Result IsApplicationCrashReportEnabled(ams::sf::Out<bool> out) = 0;
|
virtual Result IsApplicationCrashReportEnabled(ams::sf::Out<bool> out) = 0;
|
||||||
virtual Result EnableApplicationAllThreadDumpOnCrash(bool enabled) = 0;
|
virtual Result EnableApplicationAllThreadDumpOnCrash(bool enabled) = 0;
|
||||||
virtual Result TriggerSnapShotDumper(const ams::sf::InBuffer &arg, SnapShotDumpType dump_type) = 0;
|
virtual Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg) = 0;
|
||||||
|
|
||||||
virtual Result GetShellEventObserver(ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out) = 0;
|
virtual Result GetShellEventObserver(ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out) = 0;
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -71,8 +71,8 @@ namespace ams::pgl {
|
||||||
return ::pglEnableApplicationAllThreadDumpOnCrash(enabled);
|
return ::pglEnableApplicationAllThreadDumpOnCrash(enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result TriggerSnapShotDumper(const char *arg, SnapShotDumpType dump_type) {
|
Result TriggerApplicationSnapShotDumper(const char *arg, SnapShotDumpType dump_type) {
|
||||||
return ::pglTriggerSnapShotDumper(arg, static_cast<::PglSnapShotDumpType>(dump_type));
|
return ::pglTriggerApplicationSnapShotDumper(static_cast<::PglSnapShotDumpType>(dump_type), arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result GetEventObserver(pgl::EventObserver *out) {
|
Result GetEventObserver(pgl::EventObserver *out) {
|
||||||
|
|
|
@ -142,4 +142,70 @@ namespace ams::pgl::srv {
|
||||||
return FindProcessData(process_id) != nullptr;
|
return FindProcessData(process_id) != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EnableApplicationCrashReport(bool enabled) {
|
||||||
|
/* Get the application process id. */
|
||||||
|
auto application_process_id = GetRunningApplicationProcessId();
|
||||||
|
if (application_process_id) {
|
||||||
|
/* Find the data for the application process. */
|
||||||
|
std::scoped_lock lk(g_process_data_mutex);
|
||||||
|
ProcessData *data = FindProcessData(*application_process_id);
|
||||||
|
|
||||||
|
/* It's okay if we aren't tracking the process. */
|
||||||
|
if (data != nullptr) {
|
||||||
|
/* Set or clear the flag. */
|
||||||
|
if (enabled) {
|
||||||
|
data->flags |= ProcessDataFlag_DetailedCrashReportEnabled;
|
||||||
|
} else {
|
||||||
|
data->flags &= ~ProcessDataFlag_DetailedCrashReportEnabled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsApplicationCrashReportEnabled() {
|
||||||
|
/* Get the application process id. */
|
||||||
|
auto application_process_id = GetRunningApplicationProcessId();
|
||||||
|
if (!application_process_id) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find the data for the process. */
|
||||||
|
std::scoped_lock lk(g_process_data_mutex);
|
||||||
|
if (ProcessData *data = FindProcessData(*application_process_id); data != nullptr) {
|
||||||
|
return (data->flags & ProcessDataFlag_DetailedCrashReportEnabled) != 0;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnableApplicationAllThreadDumpOnCrash(bool enabled) {
|
||||||
|
/* Get the application process id. */
|
||||||
|
auto application_process_id = GetRunningApplicationProcessId();
|
||||||
|
if (application_process_id) {
|
||||||
|
/* Find the data for the application process. */
|
||||||
|
std::scoped_lock lk(g_process_data_mutex);
|
||||||
|
ProcessData *data = FindProcessData(*application_process_id);
|
||||||
|
|
||||||
|
/* It's okay if we aren't tracking the process. */
|
||||||
|
if (data != nullptr) {
|
||||||
|
/* Set or clear the flag. */
|
||||||
|
if (enabled) {
|
||||||
|
data->flags |= ProcessDataFlag_OutputAllLog;
|
||||||
|
} else {
|
||||||
|
data->flags &= ~ProcessDataFlag_OutputAllLog;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NOTE: Here Nintendo releases the lock, re-takes the lock, and re-finds the process data. */
|
||||||
|
/* This is unnecessary and less efficient, so we will not bother. */
|
||||||
|
|
||||||
|
/* Note that the flag bit has a meaningful value. */
|
||||||
|
data->flags |= ProcessDataFlag_HasLogOption;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const char *arg) {
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,5 +25,9 @@ namespace ams::pgl::srv {
|
||||||
Result GetApplicationProcessId(os::ProcessId *out);
|
Result GetApplicationProcessId(os::ProcessId *out);
|
||||||
Result BoostSystemMemoryResourceLimit(u64 size);
|
Result BoostSystemMemoryResourceLimit(u64 size);
|
||||||
bool IsProcessTracked(os::ProcessId process_id);
|
bool IsProcessTracked(os::ProcessId process_id);
|
||||||
|
void EnableApplicationCrashReport(bool enabled);
|
||||||
|
bool IsApplicationCrashReportEnabled();
|
||||||
|
void EnableApplicationAllThreadDumpOnCrash(bool enabled);
|
||||||
|
Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const char *arg);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,19 +49,22 @@ namespace ams::pgl::srv {
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ShellInterface::EnableApplicationCrashReport(bool enabled) {
|
Result ShellInterface::EnableApplicationCrashReport(bool enabled) {
|
||||||
/* TODO */
|
pgl::srv::EnableApplicationCrashReport(enabled);
|
||||||
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ShellInterface::IsApplicationCrashReportEnabled(ams::sf::Out<bool> out) {
|
Result ShellInterface::IsApplicationCrashReportEnabled(ams::sf::Out<bool> out) {
|
||||||
/* TODO */
|
out.SetValue(pgl::srv::IsApplicationCrashReportEnabled());
|
||||||
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ShellInterface::EnableApplicationAllThreadDumpOnCrash(bool enabled) {
|
Result ShellInterface::EnableApplicationAllThreadDumpOnCrash(bool enabled) {
|
||||||
/* TODO */
|
pgl::srv::EnableApplicationAllThreadDumpOnCrash(enabled);
|
||||||
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ShellInterface::TriggerSnapShotDumper(const ams::sf::InBuffer &arg, SnapShotDumpType dump_type) {
|
Result ShellInterface::TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg) {
|
||||||
/* TODO */
|
return pgl::srv::TriggerApplicationSnapShotDumper(dump_type, reinterpret_cast<const char *>(arg.GetPointer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Result ShellInterface::GetShellEventObserver(ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out) {
|
Result ShellInterface::GetShellEventObserver(ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out) {
|
||||||
|
|
|
@ -42,7 +42,7 @@ namespace ams::pgl::srv {
|
||||||
virtual Result EnableApplicationCrashReport(bool enabled) override final;
|
virtual Result EnableApplicationCrashReport(bool enabled) override final;
|
||||||
virtual Result IsApplicationCrashReportEnabled(ams::sf::Out<bool> out) override final;
|
virtual Result IsApplicationCrashReportEnabled(ams::sf::Out<bool> out) override final;
|
||||||
virtual Result EnableApplicationAllThreadDumpOnCrash(bool enabled) override final;
|
virtual Result EnableApplicationAllThreadDumpOnCrash(bool enabled) override final;
|
||||||
virtual Result TriggerSnapShotDumper(const ams::sf::InBuffer &arg, SnapShotDumpType dump_type) override final;
|
virtual Result TriggerApplicationSnapShotDumper(SnapShotDumpType dump_type, const ams::sf::InBuffer &arg) override final;
|
||||||
|
|
||||||
virtual Result GetShellEventObserver(ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out) override final;
|
virtual Result GetShellEventObserver(ams::sf::Out<std::shared_ptr<pgl::sf::IEventObserver>> out) override final;
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,6 +24,6 @@ namespace ams::pgl {
|
||||||
R_DEFINE_ERROR_RESULT(ApplicationNotRunning, 3);
|
R_DEFINE_ERROR_RESULT(ApplicationNotRunning, 3);
|
||||||
R_DEFINE_ERROR_RESULT(BufferNotEnough, 4);
|
R_DEFINE_ERROR_RESULT(BufferNotEnough, 4);
|
||||||
R_DEFINE_ERROR_RESULT(ApplicationContentNotFound, 5);
|
R_DEFINE_ERROR_RESULT(ApplicationContentNotFound, 5);
|
||||||
R_DEFINE_ERROR_RESULT(ContentMetaNotFound, 4);
|
R_DEFINE_ERROR_RESULT(ContentMetaNotFound, 6);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue