From 7b1b3279afe25b4e65ee9ebbafc5e9e38a3b888b Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Wed, 9 Aug 2006 09:24:39 +0000 Subject: [PATCH] make exit() overridable, for use in DLLs See #753 --- includes/RtsAPI.h | 2 ++ rts/RtsStartup.c | 4 ++++ rts/Storage.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/includes/RtsAPI.h b/includes/RtsAPI.h index a3a41f0..7d28328 100644 --- a/includes/RtsAPI.h +++ b/includes/RtsAPI.h @@ -43,6 +43,8 @@ extern void shutdownHaskellAndExit ( int exitCode ); extern void getProgArgv ( int *argc, char **argv[] ); extern void setProgArgv ( int argc, char *argv[] ); +/* exit() override */ +extern void (*exitFn)(int); /* ---------------------------------------------------------------------------- Locking. diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index 33c742b..3fef259 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -459,6 +459,8 @@ shutdownHaskellAndExit(int n) static int exit_started=rtsFalse; #endif +void (*exitFn)(int) = 0; + void stg_exit(int n) { @@ -471,5 +473,7 @@ stg_exit(int n) IF_PAR_DEBUG(verbose, debugBelch("==-- stg_exit %d on [%x]...", n, mytid)); shutdownParallelSystem(n); #endif + if (exitFn) + (*exitFn)(n); exit(n); } diff --git a/rts/Storage.c b/rts/Storage.c index d3b0597..3594f71 100644 --- a/rts/Storage.c +++ b/rts/Storage.c @@ -127,7 +127,7 @@ initStorage( void ) RtsFlags.GcFlags.minAllocAreaSize > RtsFlags.GcFlags.maxHeapSize) { errorBelch("maximum heap size (-M) is smaller than minimum alloc area size (-A)"); - exit(1); + RtsFlags.GcFlags.minAllocAreaSize = RtsFlags.GcFlags.maxHeapSize; } initBlockAllocator(); -- 1.7.10.4