// relaunch.cpp - Implementació del reinici en calent #include "core/system/relaunch.hpp" #include #include #include #include #ifdef _WIN32 #include // _execv #else #include // execv #endif namespace { // Estat global (process-scope). Aquesta TU és l'única que gestiona el // reinici, així que els statics 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; } void execIfRequested() { 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 aquí, execv ha fallat. Tots els subsistemes ja estan // destruïts; sortim amb error i el shell rebrà el codi. std::cerr << "[Relaunch] Ha fallat: " << std::strerror(errno) << '\n'; std::exit(EXIT_FAILURE); } } // namespace System::Relaunch