summaryrefslogtreecommitdiff
path: root/rts/RtsMain.c
diff options
context:
space:
mode:
authorBen Gamari <bgamari.foss@gmail.com>2017-09-26 14:34:58 -0400
committerBen Gamari <ben@smart-cactus.org>2017-09-26 15:39:18 -0400
commit1825cbdbdf08ed4bd6fd6794852596078953298a (patch)
tree5c76215fe2cfc87729b8c5f03fb8f5cd5277a9c2 /rts/RtsMain.c
parent7fb89e81aa26d546c468a780b57cbdd5ab189ec2 (diff)
downloadhaskell-1825cbdbdf08ed4bd6fd6794852596078953298a.tar.gz
Switch VEH to VCH and allow disabling of SEH completely.
Exception handling on Windows is unfortunately a bit complicated. But essentially the VEH Handlers we currently have are running too early. This was a problem as it ran so early it also swallowed C++ exceptions and other software exceptions which the system could have very well recovered from. So instead we use a sequence of chains to for the exception handlers to run as late as possible. You really can't get any later than this. Please read the comment in the patch for more details. I'm also providing a switch to allow people to turn off the exception handling entirely. In case it does present a problem with their code. Test Plan: ./validate Reviewers: austin, hvr, bgamari, erikd, simonmar Reviewed By: bgamari Subscribers: rwbarton, thomie GHC Trac Issues: #13911, #12110 Differential Revision: https://phabricator.haskell.org/D3911
Diffstat (limited to 'rts/RtsMain.c')
-rw-r--r--rts/RtsMain.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/rts/RtsMain.c b/rts/RtsMain.c
index 57c38742b6..21b8577cca 100644
--- a/rts/RtsMain.c
+++ b/rts/RtsMain.c
@@ -24,28 +24,26 @@
// Hack: we assume that we're building a batch-mode system unless
// INTERPRETER is set
-
+
#if !defined(INTERPRETER) /* Hack */
// The rts entry point from a compiled program using a Haskell main
// function. This gets called from a tiny main function generated by
// GHC and linked into each compiled Haskell program that uses a
// Haskell main function.
-//
+//
// We expect the caller to pass ZCMain_main_closure for
// main_closure. The reason we cannot refer to this symbol directly
// is because we're inside the rts and we do not know for sure that
// we'll be using a Haskell main function.
-//
+//
// NOTE: This function is marked as _noreturn_ in Main.h
int hs_main ( int argc, char *argv[], // program args
StgClosure *main_closure, // closure for Main.main
RtsConfig rts_config) // RTS configuration
-
-{
- BEGIN_WINDOWS_VEH_HANDLER
+{
int exit_status;
SchedulerStatus status;
@@ -56,15 +54,14 @@ int hs_main ( int argc, char *argv[], // program args
}
#endif
-
-
-
hs_init_ghc(&argc, &argv, rts_config);
+ BEGIN_WINDOWS_VEH_HANDLER
+
// kick off the computation by creating the main thread with a pointer
// to mainIO_closure representing the computation of the overall program;
// then enter the scheduler with this thread and off we go;
- //
+ //
// in a parallel setup, where we have many instances of this code
// running on different PEs, we should do this only for the main PE
// (IAmMainThread is set in startupHaskell)
@@ -100,6 +97,6 @@ int hs_main ( int argc, char *argv[], // program args
END_WINDOWS_VEH_HANDLER
shutdownHaskellAndExit(exit_status, 0 /* !fastExit */);
- // No code beyond this point. Dead code elimination will remove it
+ // No code beyond this point. Dead code elimination will remove it
}
# endif /* BATCH_MODE */