From: Simon Marlow Date: Wed, 9 Aug 2006 09:24:39 +0000 (+0000) Subject: make exit() overridable, for use in DLLs X-Git-Tag: Before_FC_branch_merge~256 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=7b1b3279afe25b4e65ee9ebbafc5e9e38a3b888b make exit() overridable, for use in DLLs See #753 --- 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();