Merge branch 'master' into fix_fw_dialog

This commit is contained in:
Antonino Di Guardo 2025-01-04 13:57:53 +01:00 committed by GitHub
commit dca404bfca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 40 additions and 27 deletions

View file

@ -71,7 +71,7 @@ CellError lv2_cond::on_id_create()
std::function<void(void*)> lv2_cond::load(utils::serial& ar) std::function<void(void*)> lv2_cond::load(utils::serial& ar)
{ {
return load_func(make_shared<lv2_cond>(ar)); return load_func(make_shared<lv2_cond>(stx::exact_t<utils::serial&>(ar)));
} }
void lv2_cond::save(utils::serial& ar) void lv2_cond::save(utils::serial& ar)

View file

@ -37,8 +37,8 @@ lv2_event_queue::lv2_event_queue(utils::serial& ar) noexcept
std::function<void(void*)> lv2_event_queue::load(utils::serial& ar) std::function<void(void*)> lv2_event_queue::load(utils::serial& ar)
{ {
auto queue = make_shared<lv2_event_queue>(ar); auto queue = make_shared<lv2_event_queue>(stx::exact_t<utils::serial&>(ar));
return [ptr = lv2_obj::load(queue->key, queue)](void* storage) { *static_cast<shared_ptr<lv2_obj>*>(storage) = ptr; }; return [ptr = lv2_obj::load(queue->key, queue)](void* storage) { *static_cast<atomic_ptr<lv2_obj>*>(storage) = ptr; };
} }
void lv2_event_queue::save(utils::serial& ar) void lv2_event_queue::save(utils::serial& ar)

View file

@ -24,7 +24,7 @@ lv2_event_flag::lv2_event_flag(utils::serial& ar)
std::function<void(void*)> lv2_event_flag::load(utils::serial& ar) std::function<void(void*)> lv2_event_flag::load(utils::serial& ar)
{ {
return load_func(make_shared<lv2_event_flag>(ar)); return load_func(make_shared<lv2_event_flag>(stx::exact_t<utils::serial&>(ar)));
} }
void lv2_event_flag::save(utils::serial& ar) void lv2_event_flag::save(utils::serial& ar)

View file

@ -33,7 +33,7 @@ std::function<void(void*)> lv2_memory_container::load(utils::serial& ar)
// Use idm::last_id() only for the instances at IDM // Use idm::last_id() only for the instances at IDM
return [ptr = make_shared<lv2_memory_container>(stx::exact_t<utils::serial&>(ar), true)](void* storage) return [ptr = make_shared<lv2_memory_container>(stx::exact_t<utils::serial&>(ar), true)](void* storage)
{ {
*static_cast<shared_ptr<lv2_memory_container>*>(storage) = ptr; *static_cast<atomic_ptr<lv2_memory_container>*>(storage) = ptr;
}; };
} }

View file

@ -84,7 +84,7 @@ CellError lv2_memory::on_id_create()
std::function<void(void*)> lv2_memory::load(utils::serial& ar) std::function<void(void*)> lv2_memory::load(utils::serial& ar)
{ {
auto mem = make_shared<lv2_memory>(ar); auto mem = make_shared<lv2_memory>(stx::exact_t<utils::serial&>(ar));
mem->exists++; // Disable on_id_create() mem->exists++; // Disable on_id_create()
auto func = load_func(mem, +mem->pshared); auto func = load_func(mem, +mem->pshared);
mem->exists--; mem->exists--;

View file

@ -27,7 +27,7 @@ lv2_mutex::lv2_mutex(utils::serial& ar)
std::function<void(void*)> lv2_mutex::load(utils::serial& ar) std::function<void(void*)> lv2_mutex::load(utils::serial& ar)
{ {
return load_func(make_shared<lv2_mutex>(ar)); return load_func(make_shared<lv2_mutex>(stx::exact_t<utils::serial&>(ar)));
} }
void lv2_mutex::save(utils::serial& ar) void lv2_mutex::save(utils::serial& ar)

View file

@ -293,7 +293,7 @@ std::function<void(void*)> lv2_socket::load(utils::serial& ar)
sock_lv2->bind(sock_lv2->last_bound_addr); sock_lv2->bind(sock_lv2->last_bound_addr);
} }
return [ptr = sock_lv2](void* storage) { *static_cast<shared_ptr<lv2_socket>*>(storage) = ptr; };; return [ptr = sock_lv2](void* storage) { *static_cast<atomic_ptr<lv2_socket>*>(storage) = ptr; };;
} }
void lv2_socket::save(utils::serial& ar, bool save_only_this_class) void lv2_socket::save(utils::serial& ar, bool save_only_this_class)

View file

@ -112,7 +112,7 @@ std::function<void(void*)> lv2_overlay::load(utils::serial& ar)
return [ovlm](void* storage) return [ovlm](void* storage)
{ {
*static_cast<shared_ptr<lv2_obj>*>(storage) = ovlm; *static_cast<atomic_ptr<lv2_obj>*>(storage) = ovlm;
}; };
} }

View file

@ -372,7 +372,7 @@ std::function<void(void*)> lv2_prx::load(utils::serial& ar)
return [prx](void* storage) return [prx](void* storage)
{ {
*static_cast<shared_ptr<lv2_obj>*>(storage) = prx; *static_cast<atomic_ptr<lv2_obj>*>(storage) = prx;
}; };
} }

View file

@ -449,7 +449,7 @@ public:
static std::function<void(void*)> load_func(shared_ptr<T> make, u64 pshared = umax) static std::function<void(void*)> load_func(shared_ptr<T> make, u64 pshared = umax)
{ {
const u64 key = make->key; const u64 key = make->key;
return [ptr = load<T>(key, make, pshared)](void* storage) { *static_cast<shared_ptr<Storage>*>(storage) = ptr; }; return [ptr = load<T>(key, make, pshared)](void* storage) { *static_cast<atomic_ptr<Storage>*>(storage) = ptr; };
} }
static bool wait_timeout(u64 usec, ppu_thread* cpu = {}, bool scale = true, bool is_usleep = false); static bool wait_timeout(u64 usec, ppu_thread* cpu = {}, bool scale = true, bool is_usleep = false);

View file

@ -123,7 +123,7 @@ namespace id_manager
ptr = stx::make_shared<T>(stx::exact_t<utils::serial&>(ar)); ptr = stx::make_shared<T>(stx::exact_t<utils::serial&>(ar));
} }
return [ptr](void* storage) { *static_cast<stx::shared_ptr<T>*>(storage) = ptr; }; return [ptr](void* storage) { *static_cast<stx::atomic_ptr<T>*>(storage) = ptr; };
}; };
}; };

View file

@ -41,6 +41,7 @@ void progress_dialog_server::operator()()
{ {
std::shared_ptr<rsx::overlays::progress_dialog> native_dlg; std::shared_ptr<rsx::overlays::progress_dialog> native_dlg;
g_system_progress_stopping = false; g_system_progress_stopping = false;
g_system_progress_canceled = false;
const auto get_state = []() const auto get_state = []()
{ {

View file

@ -2277,11 +2277,13 @@ void game_list_frame::RemoveHDD1Cache(const std::string& base_dir, const std::st
game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, title_id); game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, title_id);
} }
void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set<std::string>& serials, QString progressLabel, std::function<bool(const std::string&)> action, std::function<void(u32, u32)> cancel_log, bool refresh_on_finish, bool can_be_concurrent, std::function<bool()> should_wait_cb) void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set<std::string>& serials, QString progressLabel, std::function<bool(const std::string&)> action, std::function<void(u32, u32)> cancel_log, bool refresh_on_finish, bool can_be_concurrent, std::function<bool()> should_wait_cb)
{ {
// Concurrent tasks should not wait (at least not in current implementation) // Concurrent tasks should not wait (at least not in current implementation)
ensure(!should_wait_cb || !can_be_concurrent); ensure(!should_wait_cb || !can_be_concurrent);
g_system_progress_canceled = false;
const std::shared_ptr<std::function<bool(int)>> iterate_over_serial = std::make_shared<std::function<bool(int)>>(); const std::shared_ptr<std::function<bool(int)>> iterate_over_serial = std::make_shared<std::function<bool(int)>>();
const std::shared_ptr<atomic_t<int>> index = std::make_shared<atomic_t<int>>(0); const std::shared_ptr<atomic_t<int>> index = std::make_shared<atomic_t<int>>(0);
@ -2297,12 +2299,16 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set
const std::string& serial = *std::next(serials.begin(), index); const std::string& serial = *std::next(serials.begin(), index);
if (pdlg->wasCanceled() || g_system_progress_canceled) if (pdlg->wasCanceled() || g_system_progress_canceled.exchange(false))
{ {
cancel_log(index, serials_size); if (cancel_log)
{
cancel_log(index, serials_size);
}
return false; return false;
} }
else if (action(serial))
if (action(serial))
{ {
const int done = index_ptr->load(); const int done = index_ptr->load();
pdlg->setLabelText(progressLabel.arg(done + 1).arg(serials_size)); pdlg->setLabelText(progressLabel.arg(done + 1).arg(serials_size));
@ -2360,19 +2366,17 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set
if ((*iterate_over_serial)(*index)) if ((*iterate_over_serial)(*index))
{ {
QTimer::singleShot(1, this, *periodic_func); QTimer::singleShot(1, this, *periodic_func);
return;
} }
else
pdlg->setLabelText(progressLabel.arg(*index).arg(serials_size));
pdlg->setCancelButtonText(tr("OK"));
connect(pdlg, &progress_dialog::canceled, this, [pdlg](){ pdlg->deleteLater(); });
QApplication::beep();
if (refresh_on_finish && index)
{ {
pdlg->setLabelText(progressLabel.arg(*index).arg(serials_size)); Refresh(true);
pdlg->setCancelButtonText(tr("OK"));
QApplication::beep();
if (refresh_on_finish && index)
{
Refresh(true);
}
pdlg->deleteLater();
} }
}; };
@ -2414,6 +2418,14 @@ void game_list_frame::BatchCreateCPUCaches(const std::vector<game_info>& game_da
pdlg->setAutoReset(false); pdlg->setAutoReset(false);
pdlg->open(); pdlg->open();
connect(pdlg, &progress_dialog::canceled, this, []()
{
if (!Emu.IsStopped())
{
Emu.GracefulShutdown(false, true);
}
});
BatchActionBySerials(pdlg, serials, tr("%0\nProgress: %1/%2 caches compiled").arg(main_label), BatchActionBySerials(pdlg, serials, tr("%0\nProgress: %1/%2 caches compiled").arg(main_label),
[&, game_data](const std::string& serial) [&, game_data](const std::string& serial)
{ {