summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-12-01 12:28:01 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-12-01 12:28:01 +0000
commit063b822bb68f84dd9729327bb1765637c25aceb4 (patch)
tree3f8fb5fab976de2f4e6527091ec68554e080e531
parentcf036e5bd578769729fbbcbf67cb2277da9ba0bc (diff)
downloadhaskell-063b822bb68f84dd9729327bb1765637c25aceb4.tar.gz
Free full_prog_argv at exit, closing a memory leak
-rw-r--r--includes/RtsAPI.h1
-rw-r--r--rts/RtsFlags.c15
-rw-r--r--rts/RtsStartup.c3
3 files changed, 19 insertions, 0 deletions
diff --git a/includes/RtsAPI.h b/includes/RtsAPI.h
index a4d210aab8..98bf7305fd 100644
--- a/includes/RtsAPI.h
+++ b/includes/RtsAPI.h
@@ -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);
diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c
index a646e57396..19954f80e9 100644
--- a/rts/RtsFlags.c
+++ b/rts/RtsFlags.c
@@ -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;
+}
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index edb8088b0a..afa38aaf2c 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -338,6 +338,9 @@ hs_exit_(rtsBool wait_foreign)
OnExitHook();
+ // Free the full argv storage
+ freeFullProgArgv();
+
#if defined(THREADED_RTS)
ioManagerDie();
#endif