mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-13 07:49:19 +01:00
Merge pull request #12463 from Dentomologist/netkdrequestdevice_fix_crashes
NetKDRequestDevice: Fix sporadic crashes during emulation shutdown
This commit is contained in:
commit
e212d1c395
@ -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))
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user