mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 14:49:42 -06:00
Merge pull request #12463 from Dentomologist/netkdrequestdevice_fix_crashes
NetKDRequestDevice: Fix sporadic crashes during emulation shutdown
This commit is contained in:
@ -577,8 +577,11 @@ void EmulationKernel::AddStaticDevices()
|
|||||||
}
|
}
|
||||||
if (HasFeature(features, Feature::KD))
|
if (HasFeature(features, Feature::KD))
|
||||||
{
|
{
|
||||||
AddDevice(std::make_unique<NetKDRequestDevice>(*this, "/dev/net/kd/request"));
|
constexpr auto time_device_name = "/dev/net/kd/time";
|
||||||
AddDevice(std::make_unique<NetKDTimeDevice>(*this, "/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))
|
if (HasFeature(features, Feature::NCD))
|
||||||
{
|
{
|
||||||
|
@ -153,9 +153,10 @@ s32 NWC24MakeUserID(u64* nwc24_id, u32 hollywood_id, u16 id_ctr, HardwareModel h
|
|||||||
}
|
}
|
||||||
} // Anonymous namespace
|
} // 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()},
|
: 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
|
// Enable all NWC24 permissions
|
||||||
m_scheduler_buffer[1] = Common::swap32(-1);
|
m_scheduler_buffer[1] = Common::swap32(-1);
|
||||||
@ -190,6 +191,8 @@ NetKDRequestDevice::~NetKDRequestDevice()
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_scheduler_timer_thread.join();
|
m_scheduler_timer_thread.join();
|
||||||
|
m_scheduler_work_queue.Shutdown();
|
||||||
|
m_work_queue.Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetKDRequestDevice::Update()
|
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.
|
// 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.
|
// A correct entry is one that hasn't been downloaded the longest compared to other entries.
|
||||||
// We first need current UTC.
|
// We first need current UTC.
|
||||||
const auto time_device =
|
const u64 current_utc = m_time_device->GetAdjustedUTC();
|
||||||
std::static_pointer_cast<NetKDTimeDevice>(GetIOS()->GetDeviceByName("/dev/net/kd/time"));
|
|
||||||
const u64 current_utc = time_device->GetAdjustedUTC();
|
|
||||||
u64 lowest_timestamp = std::numeric_limits<u64>::max();
|
u64 lowest_timestamp = std::numeric_limits<u64>::max();
|
||||||
|
|
||||||
for (u16 i = 0; i < static_cast<u16>(NWC24::NWC24Dl::MAX_ENTRIES); i++)
|
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))
|
if (m_dl_list.IsSubtaskDownloadDisabled(entry_index))
|
||||||
return NWC24::WC24_ERR_DISABLED;
|
return NWC24::WC24_ERR_DISABLED;
|
||||||
|
|
||||||
const auto time_device =
|
const u64 current_utc = m_time_device->GetAdjustedUTC();
|
||||||
std::static_pointer_cast<NetKDTimeDevice>(GetIOS()->GetDeviceByName("/dev/net/kd/time"));
|
|
||||||
const u64 current_utc = time_device->GetAdjustedUTC();
|
|
||||||
for (u8 i = 0; i < 32; i++)
|
for (u8 i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
if (!m_dl_list.IsValidSubtask(entry_index, i))
|
if (!m_dl_list.IsValidSubtask(entry_index, i))
|
||||||
@ -645,9 +644,7 @@ NWC24::ErrorCode NetKDRequestDevice::KDDownload(const u16 entry_index,
|
|||||||
{
|
{
|
||||||
bool success = false;
|
bool success = false;
|
||||||
Common::ScopeGuard state_guard([&] {
|
Common::ScopeGuard state_guard([&] {
|
||||||
const auto time_device =
|
const u64 current_utc = m_time_device->GetAdjustedUTC();
|
||||||
std::static_pointer_cast<NetKDTimeDevice>(GetIOS()->GetDeviceByName("/dev/net/kd/time"));
|
|
||||||
const u64 current_utc = time_device->GetAdjustedUTC();
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
// Set the next download time to the dl_margin
|
// Set the next download time to the dl_margin
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <memory>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@ -17,6 +18,7 @@
|
|||||||
#include "Core/IOS/Network/KD/Mail/WC24Send.h"
|
#include "Core/IOS/Network/KD/Mail/WC24Send.h"
|
||||||
#include "Core/IOS/Network/KD/NWC24Config.h"
|
#include "Core/IOS/Network/KD/NWC24Config.h"
|
||||||
#include "Core/IOS/Network/KD/NWC24DL.h"
|
#include "Core/IOS/Network/KD/NWC24DL.h"
|
||||||
|
#include "Core/IOS/Network/KD/NetKDTime.h"
|
||||||
|
|
||||||
namespace IOS::HLE
|
namespace IOS::HLE
|
||||||
{
|
{
|
||||||
@ -26,7 +28,8 @@ namespace IOS::HLE
|
|||||||
class NetKDRequestDevice : public EmulationDevice
|
class NetKDRequestDevice : public EmulationDevice
|
||||||
{
|
{
|
||||||
public:
|
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);
|
IPCReply HandleNWC24DownloadNowEx(const IOCtlRequest& request);
|
||||||
NWC24::ErrorCode KDDownload(const u16 entry_index, const std::optional<u8> subtask_id);
|
NWC24::ErrorCode KDDownload(const u16 entry_index, const std::optional<u8> subtask_id);
|
||||||
IPCReply HandleNWC24CheckMailNow(const IOCtlRequest& request);
|
IPCReply HandleNWC24CheckMailNow(const IOCtlRequest& request);
|
||||||
@ -114,6 +117,7 @@ private:
|
|||||||
std::queue<AsyncReply> m_async_replies;
|
std::queue<AsyncReply> m_async_replies;
|
||||||
u32 m_error_count = 0;
|
u32 m_error_count = 0;
|
||||||
std::array<u32, 256> m_scheduler_buffer{};
|
std::array<u32, 256> m_scheduler_buffer{};
|
||||||
|
std::shared_ptr<NetKDTimeDevice> m_time_device;
|
||||||
// TODO: Maybe move away from Common::HttpRequest?
|
// TODO: Maybe move away from Common::HttpRequest?
|
||||||
Common::HttpRequest m_http{std::chrono::minutes{1}};
|
Common::HttpRequest m_http{std::chrono::minutes{1}};
|
||||||
u32 m_download_span = 2;
|
u32 m_download_span = 2;
|
||||||
|
Reference in New Issue
Block a user