Merge pull request #12463 from Dentomologist/netkdrequestdevice_fix_crashes

NetKDRequestDevice: Fix sporadic crashes during emulation shutdown
This commit is contained in:
Admiral H. Curtiss 2023-12-27 21:47:18 +01:00 committed by GitHub
commit e212d1c395
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 14 deletions

View File

@ -577,8 +577,11 @@ void EmulationKernel::AddStaticDevices()
}
if (HasFeature(features, Feature::KD))
{
AddDevice(std::make_unique<NetKDRequestDevice>(*this, "/dev/net/kd/request"));
AddDevice(std::make_unique<NetKDTimeDevice>(*this, "/dev/net/kd/time"));
constexpr auto time_device_name = "/dev/net/kd/time";
AddDevice(std::make_unique<NetKDTimeDevice>(*this, time_device_name));
const auto time_device =
std::static_pointer_cast<NetKDTimeDevice>(GetDeviceByName(time_device_name));
AddDevice(std::make_unique<NetKDRequestDevice>(*this, "/dev/net/kd/request", time_device));
}
if (HasFeature(features, Feature::NCD))
{

View File

@ -153,9 +153,10 @@ s32 NWC24MakeUserID(u64* nwc24_id, u32 hollywood_id, u16 id_ctr, HardwareModel h
}
} // Anonymous namespace
NetKDRequestDevice::NetKDRequestDevice(EmulationKernel& ios, const std::string& device_name)
NetKDRequestDevice::NetKDRequestDevice(EmulationKernel& ios, const std::string& device_name,
const std::shared_ptr<NetKDTimeDevice>& time_device)
: EmulationDevice(ios, device_name), m_config{ios.GetFS()}, m_dl_list{ios.GetFS()},
m_send_list{ios.GetFS()}, m_friend_list{ios.GetFS()}
m_send_list{ios.GetFS()}, m_friend_list{ios.GetFS()}, m_time_device{time_device}
{
// Enable all NWC24 permissions
m_scheduler_buffer[1] = Common::swap32(-1);
@ -190,6 +191,8 @@ NetKDRequestDevice::~NetKDRequestDevice()
}
m_scheduler_timer_thread.join();
m_scheduler_work_queue.Shutdown();
m_work_queue.Shutdown();
}
void NetKDRequestDevice::Update()
@ -441,9 +444,7 @@ NWC24::ErrorCode NetKDRequestDevice::DetermineDownloadTask(u16* entry_index,
// As the scheduler does not tell us which entry to download, we must determine that.
// A correct entry is one that hasn't been downloaded the longest compared to other entries.
// We first need current UTC.
const auto time_device =
std::static_pointer_cast<NetKDTimeDevice>(GetIOS()->GetDeviceByName("/dev/net/kd/time"));
const u64 current_utc = time_device->GetAdjustedUTC();
const u64 current_utc = m_time_device->GetAdjustedUTC();
u64 lowest_timestamp = std::numeric_limits<u64>::max();
for (u16 i = 0; i < static_cast<u16>(NWC24::NWC24Dl::MAX_ENTRIES); i++)
@ -493,9 +494,7 @@ NWC24::ErrorCode NetKDRequestDevice::DetermineSubtask(u16 entry_index,
if (m_dl_list.IsSubtaskDownloadDisabled(entry_index))
return NWC24::WC24_ERR_DISABLED;
const auto time_device =
std::static_pointer_cast<NetKDTimeDevice>(GetIOS()->GetDeviceByName("/dev/net/kd/time"));
const u64 current_utc = time_device->GetAdjustedUTC();
const u64 current_utc = m_time_device->GetAdjustedUTC();
for (u8 i = 0; i < 32; i++)
{
if (!m_dl_list.IsValidSubtask(entry_index, i))
@ -645,9 +644,7 @@ NWC24::ErrorCode NetKDRequestDevice::KDDownload(const u16 entry_index,
{
bool success = false;
Common::ScopeGuard state_guard([&] {
const auto time_device =
std::static_pointer_cast<NetKDTimeDevice>(GetIOS()->GetDeviceByName("/dev/net/kd/time"));
const u64 current_utc = time_device->GetAdjustedUTC();
const u64 current_utc = m_time_device->GetAdjustedUTC();
if (success)
{
// Set the next download time to the dl_margin

View File

@ -4,6 +4,7 @@
#pragma once
#include <array>
#include <memory>
#include <queue>
#include <string>
@ -17,6 +18,7 @@
#include "Core/IOS/Network/KD/Mail/WC24Send.h"
#include "Core/IOS/Network/KD/NWC24Config.h"
#include "Core/IOS/Network/KD/NWC24DL.h"
#include "Core/IOS/Network/KD/NetKDTime.h"
namespace IOS::HLE
{
@ -26,7 +28,8 @@ namespace IOS::HLE
class NetKDRequestDevice : public EmulationDevice
{
public:
NetKDRequestDevice(EmulationKernel& ios, const std::string& device_name);
NetKDRequestDevice(EmulationKernel& ios, const std::string& device_name,
const std::shared_ptr<NetKDTimeDevice>& time_device);
IPCReply HandleNWC24DownloadNowEx(const IOCtlRequest& request);
NWC24::ErrorCode KDDownload(const u16 entry_index, const std::optional<u8> subtask_id);
IPCReply HandleNWC24CheckMailNow(const IOCtlRequest& request);
@ -114,6 +117,7 @@ private:
std::queue<AsyncReply> m_async_replies;
u32 m_error_count = 0;
std::array<u32, 256> m_scheduler_buffer{};
std::shared_ptr<NetKDTimeDevice> m_time_device;
// TODO: Maybe move away from Common::HttpRequest?
Common::HttpRequest m_http{std::chrono::minutes{1}};
u32 m_download_span = 2;