Commit b0fa94d52a26cde776e566bb04c809b3b9f18de4

Con Kolivas 2013-05-30T12:00:17

Perform execv in a forked child process, waiting on the original to exit to allow resources to be released.

diff --git a/cgminer.c b/cgminer.c
index 768dd8e..8451f69 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");
 }