From b0fa94d52a26cde776e566bb04c809b3b9f18de4 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Thu, 30 May 2013 12:00:17 +1000 Subject: [PATCH] Perform execv in a forked child process, waiting on the original to exit to allow resources to be released. --- cgminer.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cgminer.c b/cgminer.c index 768dd8ef..8451f692 100644 --- a/cgminer.c +++ b/cgminer.c @@ -2889,6 +2889,9 @@ static void clean_up(void); void app_restart(void) { + pid_t parent, child; + int status; + applog(LOG_WARNING, "Attempting to restart %s", packagename); __kill_work(); @@ -2901,7 +2904,15 @@ void app_restart(void) } #endif + parent = getpid(); + child = fork(); + if (child) { + applog(LOG_WARNING, "Shutting down original process"); + exit(0); + } + waitpid(parent, &status, 0); execv(initial_args[0], (EXECV_2ND_ARG_TYPE)initial_args); + /* We shouldn't get here */ applog(LOG_WARNING, "Failed to restart application"); }