Free full_prog_argv at exit, closing a memory leak
authorSimon Marlow <marlowsd@gmail.com>
Tue, 1 Dec 2009 12:28:01 +0000 (12:28 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 1 Dec 2009 12:28:01 +0000 (12:28 +0000)
includes/RtsAPI.h
rts/RtsFlags.c
rts/RtsStartup.c

index a4d210a..98bf730 100644 (file)
@@ -48,6 +48,7 @@ extern void getProgArgv            ( int *argc, char **argv[] );
 extern void setProgArgv            ( int argc, char *argv[] );
 extern void getFullProgArgv        ( int *argc, char **argv[] );
 extern void setFullProgArgv        ( int argc, char *argv[] );
+extern void freeFullProgArgv       ( void ) ;
 
 #ifndef mingw32_HOST_OS
 extern void shutdownHaskellAndSignal (int sig);
index a646e57..19954f8 100644 (file)
@@ -1389,3 +1389,18 @@ setFullProgArgv(int argc, char *argv[])
     full_prog_argv[argc] = NULL;
 }
 
+void
+freeFullProgArgv (void)
+{
+    int i;
+
+    if (full_prog_argv != NULL) {
+        for (i = 0; i < full_prog_argc; i++) {
+            stgFree(full_prog_argv[i]);
+        }
+        stgFree(full_prog_argv);
+    }
+
+    full_prog_argc = 0;
+    full_prog_argv = NULL;
+}
index edb8088..afa38aa 100644 (file)
@@ -338,6 +338,9 @@ hs_exit_(rtsBool wait_foreign)
     
     OnExitHook();
 
+    // Free the full argv storage
+    freeFullProgArgv();
+
 #if defined(THREADED_RTS)
     ioManagerDie();
 #endif