mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-03 14:48:46 +00:00
Save backup: fix to avoid filling the queue
Also limiting 1 backup / 10sec
This commit is contained in:
parent
e7ed128d30
commit
05bfadc9eb
1 changed files with 26 additions and 4 deletions
|
@ -80,18 +80,33 @@ static void backup(const std::filesystem::path& dir_name) {
|
||||||
|
|
||||||
static void BackupThreadBody() {
|
static void BackupThreadBody() {
|
||||||
Common::SetCurrentThreadName("SaveData_BackupThread");
|
Common::SetCurrentThreadName("SaveData_BackupThread");
|
||||||
while (true) {
|
while (g_backup_status != WorkerStatus::Stopping) {
|
||||||
g_backup_status = WorkerStatus::Waiting;
|
g_backup_status = WorkerStatus::Waiting;
|
||||||
g_backup_thread_semaphore.acquire();
|
|
||||||
|
bool wait;
|
||||||
BackupRequest req;
|
BackupRequest req;
|
||||||
{
|
{
|
||||||
std::scoped_lock lk{g_backup_queue_mutex};
|
std::scoped_lock lk{g_backup_queue_mutex};
|
||||||
req = g_backup_queue.front();
|
wait = g_backup_queue.empty();
|
||||||
|
if (!wait) {
|
||||||
|
req = g_backup_queue.front();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wait) {
|
||||||
|
g_backup_thread_semaphore.acquire();
|
||||||
|
{
|
||||||
|
std::scoped_lock lk{g_backup_queue_mutex};
|
||||||
|
if (g_backup_queue.empty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
req = g_backup_queue.front();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (req.save_path.empty()) {
|
if (req.save_path.empty()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
g_backup_status = WorkerStatus::Running;
|
g_backup_status = WorkerStatus::Running;
|
||||||
|
|
||||||
LOG_INFO(Lib_SaveData, "Backing up the following directory: {}", req.save_path.string());
|
LOG_INFO(Lib_SaveData, "Backing up the following directory: {}", req.save_path.string());
|
||||||
try {
|
try {
|
||||||
backup(req.save_path);
|
backup(req.save_path);
|
||||||
|
@ -100,6 +115,7 @@ static void BackupThreadBody() {
|
||||||
}
|
}
|
||||||
LOG_DEBUG(Lib_SaveData, "Backing up the following directory: {} finished",
|
LOG_DEBUG(Lib_SaveData, "Backing up the following directory: {} finished",
|
||||||
req.save_path.string());
|
req.save_path.string());
|
||||||
|
std::this_thread::sleep_for(std::chrono::seconds(10)); // Don't backup too often
|
||||||
{
|
{
|
||||||
std::scoped_lock lk{g_backup_queue_mutex};
|
std::scoped_lock lk{g_backup_queue_mutex};
|
||||||
g_backup_queue.pop_front();
|
g_backup_queue.pop_front();
|
||||||
|
@ -117,8 +133,8 @@ void StartThread() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LOG_DEBUG(Lib_SaveData, "Starting backup thread");
|
LOG_DEBUG(Lib_SaveData, "Starting backup thread");
|
||||||
g_backup_thread = std::jthread{BackupThreadBody};
|
|
||||||
g_backup_status = WorkerStatus::Waiting;
|
g_backup_status = WorkerStatus::Waiting;
|
||||||
|
g_backup_thread = std::jthread{BackupThreadBody};
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopThread() {
|
void StopThread() {
|
||||||
|
@ -145,6 +161,12 @@ bool NewRequest(OrbisUserServiceUserId user_id, std::string_view title_id,
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::scoped_lock lk{g_backup_queue_mutex};
|
std::scoped_lock lk{g_backup_queue_mutex};
|
||||||
|
for (const auto& it : g_backup_queue) {
|
||||||
|
if (it.dir_name == dir_name) {
|
||||||
|
LOG_TRACE(Lib_SaveData, "Backup request to {} ignored. Already queued", dir_name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
g_backup_queue.push_back(BackupRequest{
|
g_backup_queue.push_back(BackupRequest{
|
||||||
.user_id = user_id,
|
.user_id = user_id,
|
||||||
.title_id = std::string{title_id},
|
.title_id = std::string{title_id},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue