mirror of
https://github.com/drakmor/ShadowMountPlus.git
synced 2026-10-21 22:22:28 -05:00
Fast shutdown
This commit is contained in:
1 parent
a23822a26f
commit
4e9afa7885
6 files changed
+64
-2
No files matched your search
+10
-1
@@ -375,10 +375,19 @@ int main(void) {
|
||||
goto shutdown;
|
||||
}
|
||||
|
||||
log_debug("[STARTUP] post-LVD cleanup begin");
|
||||
log_debug("[STARTUP] cleanup_staged_mount_links begin");
|
||||
cleanup_staged_mount_links();
|
||||
log_debug("[STARTUP] cleanup_staged_mount_links done");
|
||||
log_debug("[STARTUP] cleanup_duplicate_title_mounts begin");
|
||||
cleanup_duplicate_title_mounts();
|
||||
if (!sm_scanner_run_startup_sync())
|
||||
log_debug("[STARTUP] cleanup_duplicate_title_mounts done");
|
||||
log_debug("[STARTUP] scanner startup sync begin");
|
||||
if (!sm_scanner_run_startup_sync()) {
|
||||
log_debug("[STARTUP] scanner startup sync aborted");
|
||||
goto shutdown;
|
||||
}
|
||||
log_debug("[STARTUP] scanner startup sync done");
|
||||
sm_scanner_run_loop();
|
||||
|
||||
shutdown:
|
||||
|
||||
@@ -646,6 +646,8 @@ static int copy_param_json_rewrite(const char *src, const char *dst) {
|
||||
|
||||
if (ret == 0 && hit)
|
||||
log_debug(" [COPY] param.json patched: %s", dst);
|
||||
if (ret != 0)
|
||||
(void)unlink(dst);
|
||||
|
||||
free(buf);
|
||||
return ret;
|
||||
@@ -684,6 +686,8 @@ int copy_file(const char *src, const char *dst) {
|
||||
ret = -1;
|
||||
if (fclose(fs) != 0)
|
||||
ret = -1;
|
||||
if (ret != 0)
|
||||
(void)unlink(dst);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -889,6 +889,7 @@ void cleanup_stale_image_mounts(void) {
|
||||
if (should_stop_requested())
|
||||
return;
|
||||
|
||||
log_debug(" [IMG] stale image cleanup begin");
|
||||
for (int k = 0; k < MAX_IMAGE_MOUNTS; k++) {
|
||||
image_cache_entry_t cached_entry;
|
||||
if (should_stop_requested())
|
||||
@@ -896,6 +897,10 @@ void cleanup_stale_image_mounts(void) {
|
||||
if (!get_image_cache_entry(k, &cached_entry))
|
||||
continue;
|
||||
|
||||
log_debug(" [IMG][%s] stale cleanup check: slot=%d source=%s mount=%s",
|
||||
attach_backend_name(cached_entry.backend), k, cached_entry.path,
|
||||
cached_entry.mount_point);
|
||||
|
||||
if (!path_exists(cached_entry.path)) {
|
||||
log_debug(" [IMG][%s] Source removed, unmounting: %s",
|
||||
attach_backend_name(cached_entry.backend), cached_entry.path);
|
||||
@@ -922,6 +927,7 @@ void cleanup_stale_image_mounts(void) {
|
||||
notify_image_mount_failed(source_path, mount_err);
|
||||
}
|
||||
}
|
||||
log_debug(" [IMG] stale image cleanup done");
|
||||
}
|
||||
|
||||
void cleanup_stale_image_mounts_for_root(const char *root) {
|
||||
|
||||
@@ -120,6 +120,9 @@ static bool mount_and_install(const char *src_path, const char *title_id,
|
||||
restage_staging = (!is_remount || should_register);
|
||||
restage_appmeta = (!is_remount || appmeta_missing);
|
||||
|
||||
if (should_stop_requested())
|
||||
return false;
|
||||
|
||||
// COPY FILES
|
||||
if (restage_staging || restage_appmeta) {
|
||||
snprintf(src_sce_sys, sizeof(src_sce_sys), "%s/sce_sys", src_path);
|
||||
@@ -162,6 +165,9 @@ static bool mount_and_install(const char *src_path, const char *title_id,
|
||||
metadata_restaged = true;
|
||||
}
|
||||
|
||||
if (should_stop_requested())
|
||||
return false;
|
||||
|
||||
if (!mount_title_nullfs(title_id, src_path)) {
|
||||
log_debug(" [LINK] nullfs mount failed: title=%s src=%s", title_id,
|
||||
src_path);
|
||||
@@ -265,6 +271,9 @@ void process_scan_candidates(const scan_candidate_t *candidates,
|
||||
clear_failed_mount_attempts(c->title_id);
|
||||
cache_game_entry(c->path, c->title_id, c->title_name);
|
||||
} else {
|
||||
if (should_stop_requested())
|
||||
return;
|
||||
|
||||
uint8_t failed_attempts = bump_failed_mount_attempts(c->title_id);
|
||||
if (failed_attempts == MAX_FAILED_MOUNT_ATTEMPTS) {
|
||||
log_debug(" [RETRY] limit reached (%u/%u): %s (%s)",
|
||||
|
||||
@@ -434,14 +434,20 @@ void mount_backport_overlays_for_scan_root(const char *scan_root,
|
||||
|
||||
// --- Unified Scan Pass (images + game candidates) ---
|
||||
void cleanup_lost_sources_before_scan(void) {
|
||||
log_debug(" [SCAN] pre-scan cleanup begin");
|
||||
// 1) Drop stale game cache entries for deleted sources.
|
||||
log_debug(" [SCAN] pre-scan cleanup: prune_game_cache");
|
||||
prune_game_cache();
|
||||
// 2) Drop stale/broken mount links and unmount stale /system_ex stacks.
|
||||
log_debug(" [SCAN] pre-scan cleanup: cleanup_mount_links");
|
||||
cleanup_mount_links(NULL, true);
|
||||
// 3) Unmount stale image mounts for deleted image files.
|
||||
log_debug(" [SCAN] pre-scan cleanup: cleanup_stale_image_mounts");
|
||||
cleanup_stale_image_mounts();
|
||||
// 4) Drop stale path-state entries.
|
||||
log_debug(" [SCAN] pre-scan cleanup: prune_path_state");
|
||||
prune_path_state();
|
||||
log_debug(" [SCAN] pre-scan cleanup done");
|
||||
}
|
||||
|
||||
void cleanup_lost_sources_for_scan_root(const char *scan_root) {
|
||||
|
||||
+29
-1
@@ -781,20 +781,32 @@ static void apply_runtime_config_reload_effects(const runtime_config_t *old_cfg,
|
||||
}
|
||||
}
|
||||
|
||||
static bool should_abort_scan_cycle(void) {
|
||||
return should_stop_requested();
|
||||
}
|
||||
|
||||
static bool run_full_scan_cycle(bool startup_sync, const char *reason,
|
||||
bool *unstable_found_out) {
|
||||
scan_candidate_t *candidates = g_scanner_scan_candidates;
|
||||
|
||||
log_immediate_scan_reason(reason);
|
||||
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
bool unstable_found = false;
|
||||
cleanup_lost_sources_before_scan();
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
int total_found_games = 0;
|
||||
int *total_found_ptr = startup_sync ? &total_found_games : NULL;
|
||||
int candidate_count = collect_scan_candidates(candidates, MAX_PENDING,
|
||||
total_found_ptr,
|
||||
&unstable_found);
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
if (candidate_count > 0) {
|
||||
if (startup_sync) {
|
||||
int new_games = 0;
|
||||
@@ -807,14 +819,18 @@ static bool run_full_scan_cycle(bool startup_sync, const char *reason,
|
||||
}
|
||||
|
||||
process_scan_candidates(candidates, candidate_count);
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
}
|
||||
|
||||
mount_backport_overlays(&unstable_found);
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
if (unstable_found_out)
|
||||
*unstable_found_out = unstable_found;
|
||||
|
||||
if (startup_sync) {
|
||||
if (startup_sync && !should_abort_scan_cycle()) {
|
||||
notify_system_rich(true, "Library Synchronized.\nFound %d games.",
|
||||
total_found_games);
|
||||
}
|
||||
@@ -829,15 +845,27 @@ static bool run_targeted_scan_cycle(int scan_root_index,
|
||||
|
||||
log_debug("[SCAN] running targeted scan for %s", scan_root);
|
||||
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
bool unstable_found = false;
|
||||
cleanup_lost_sources_for_scan_root(scan_root);
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
int candidate_count = collect_scan_candidates_for_scan_root(
|
||||
scan_root, candidates, MAX_PENDING, NULL, &unstable_found);
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
if (candidate_count > 0)
|
||||
process_scan_candidates(candidates, candidate_count);
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
mount_backport_overlays_for_scan_root(scan_root, &unstable_found);
|
||||
if (should_abort_scan_cycle())
|
||||
return false;
|
||||
|
||||
if (unstable_found_out)
|
||||
*unstable_found_out = unstable_found;
|
||||
|
||||
Reference in new issue
Block a user