X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FMain.c;h=41f9d99160214339343326f96d92d55b56d411db;hb=ebd10acfeffb7fccfafbb4220831e2de7806efbd;hp=e5e00c761a13cb0a47913965a077f3dee7a98d4f;hpb=3ddfe34ba0b8b1c0721841c73d0c671e43a600ac;p=ghc-hetmet.git diff --git a/ghc/rts/Main.c b/ghc/rts/Main.c index e5e00c7..41f9d99 100644 --- a/ghc/rts/Main.c +++ b/ghc/rts/Main.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Main.c,v 1.18 2000/03/14 09:55:05 simonmar Exp $ + * $Id: Main.c,v 1.29 2001/08/07 20:10:30 ken Exp $ * * (c) The GHC Team 1998-2000 * @@ -25,8 +25,8 @@ #endif #ifdef PAR -# include "ParInit.h" # include "Parallel.h" +# include "ParallelRts.h" # include "LLC.h" #endif @@ -38,18 +38,19 @@ # include #endif +extern void __init_PrelMain(void); /* Hack: we assume that we're building a batch-mode system unless * INTERPRETER is set */ -# ifndef INTERPRETER /* Hack */ +#ifndef INTERPRETER /* Hack */ int main(int argc, char *argv[]) { int exit_status; SchedulerStatus status; /* all GranSim/GUM init is done in startupHaskell; sets IAmMainThread! */ - startupHaskell(argc,argv); + startupHaskell(argc,argv,__init_PrelMain); /* kick off the computation by creating the main thread with a pointer to mainIO_closure representing the computation of the overall program; @@ -64,7 +65,7 @@ int main(int argc, char *argv[]) # if defined(PAR) -# if DEBUG +# if defined(DEBUG) { /* a wait loop to allow attachment of gdb to UNIX threads */ nat i, j, s; @@ -77,18 +78,20 @@ int main(int argc, char *argv[]) # endif if (IAmMainThread == rtsTrue) { - fprintf(stderr, "Main Thread Started ...\n"); + IF_PAR_DEBUG(verbose, + fprintf(stderr, "==== [%x] Main Thread Started ...\n", mytid)); /* ToDo: Dump event for the main thread */ - status = rts_evalIO(mainIO_closure, NULL); + status = rts_evalIO((HaskellObj)mainIO_closure, NULL); } else { /* Just to show we're alive */ IF_PAR_DEBUG(verbose, - fprintf(stderr, "== [%x] Non-Main PE enters scheduler without work ...\n", + fprintf(stderr, "== [%x] Non-Main PE enters scheduler via taskStart() without work ...\n", mytid)); /* all non-main threads enter the scheduler without work */ - status = schedule( /* nothing */ ); + taskStart(); + status = Success; // declare victory (see shutdownParallelSystem) } # elif defined(GRAN) @@ -99,11 +102,10 @@ int main(int argc, char *argv[]) # else /* !PAR && !GRAN */ /* ToDo: want to start with a larger stack size */ - status = rts_evalIO((StgClosure *)mainIO_closure, NULL); + status = rts_evalIO((HaskellObj)mainIO_closure, NULL); # endif /* !PAR && !GRAN */ - // ToDo: update for parallel execution /* check the status of the entire Haskell computation */ switch (status) { case Deadlock: @@ -111,7 +113,7 @@ int main(int argc, char *argv[]) exit_status = EXIT_DEADLOCK; break; case Killed: - prog_belch("main thread killed"); + prog_belch("main thread exited (uncaught exception)"); exit_status = EXIT_KILLED; break; case Interrupted: @@ -121,9 +123,16 @@ int main(int argc, char *argv[]) case Success: exit_status = EXIT_SUCCESS; break; +#if defined(PAR) + case NoStatus: + prog_belch("main thread PE killed; probably due to failure of another PE; check /tmp/pvml..."); + exit_status = EXIT_KILLED; + break; +#endif default: barf("main thread completed with invalid status"); } shutdownHaskellAndExit(exit_status); + return 0; /* never reached, keep gcc -Wall happy */ } # endif /* BATCH_MODE */