// relaunch.cpp - Implementacio del reinici en calent // © 2026 JailDesigner #include "core/system/relaunch.hpp" #include #include #include #include #ifdef _WIN32 #include // _execv #else #include // execv #endif namespace { // Estat global (process-scope). Aquesta TU es la unica que gestiona el // reinici, aixi que els static interns no s'escapen. char** g_argv = nullptr; bool g_requested = false; } // namespace namespace System::Relaunch { void setArgv(int /*argc*/, char** argv) { g_argv = argv; } void request() { g_requested = true; } auto isRequested() -> bool { return g_requested; } void execIfRequested() { #ifdef __EMSCRIPTEN__ // Al navegador el reinici real seria location.reload(); aqui no fem res. return; #else if (!g_requested || g_argv == nullptr || g_argv[0] == nullptr) { return; } std::cout << "[Relaunch] Reiniciant " << g_argv[0] << "...\n"; #ifdef _WIN32 _execv(g_argv[0], g_argv); #else execv(g_argv[0], g_argv); #endif // Si arribem aqui, execv ha fallat. Tots els subsistemes ja estan // destruits; sortim amb error i el shell rebra el codi. std::cerr << "[Relaunch] Ha fallat: " << std::strerror(errno) << '\n'; std::exit(EXIT_FAILURE); #endif } } // namespace System::Relaunch