[project @ 1999-07-02 09:31:54 by simonmar]
[ghc-hetmet.git] / ghc / rts / RtsStartup.c
index fc31f16..aa84c0b 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsStartup.c,v 1.8 1999/03/03 19:10:37 sof Exp $
+ * $Id: RtsStartup.c,v 1.15 1999/07/02 09:31:54 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
 #include "LLC.h"
 #endif
 
-#ifndef aix_TARGET_OS /* AIX gives link errors with this as a const (RO assembler section) */
-const 
-#endif 
-  StgClosure *PrelBase_Bool_closure_tbl[] = {
-#ifndef HAVE_WIN32_DLL_SUPPORT
-    &False_closure,
-    &True_closure
-#else
-    &dummy_ret_closure,
-    &dummy_ret_closure
-#endif
-};
-
 /*
  * Flag Structure
  */
 struct RTS_FLAGS RtsFlags;
 
-extern void startupHaskell(int argc, char *argv[])
+static int rts_has_started_up = 0;
+
+void
+startupHaskell(int argc, char *argv[])
 {
-    static int rts_has_started_up = 0;
+#ifdef ENABLE_WIN32_DLL_SUPPORT
     int i;
+#endif
 
     /* To avoid repeated initialisations of the RTS */
    if (rts_has_started_up)
@@ -100,7 +91,7 @@ extern void startupHaskell(int argc, char *argv[])
     prog_argc = argc;
     prog_argv = argv;
 
-#if defined(PAR)
+#ifdef PAR
    /* Initialise the parallel system -- before initHeap! */
     initParallelSystem();
    /* And start GranSim profiling if required: omitted for now
@@ -135,18 +126,14 @@ extern void startupHaskell(int argc, char *argv[])
        filling in the tables with references to where the
        static info tables have been loaded inside the running
        process.
-       
-       Ditto for Bool closure tbl.
     */
-#ifdef HAVE_WIN32_DLL_SUPPORT
+#ifdef ENABLE_WIN32_DLL_SUPPORT
     for(i=0;i<=255;i++)
        (CHARLIKE_closure[i]).header.info = (const StgInfoTable*)&Czh_static_info;
 
     for(i=0;i<=32;i++)
        (INTLIKE_closure[i]).header.info = (const StgInfoTable*)&Izh_static_info;
        
-    PrelBase_Bool_closure_tbl[0] = (const StgClosure*)&False_closure;
-    PrelBase_Bool_closure_tbl[1] = (const StgClosure*)&True_closure;
 #endif
     /* Record initialization times */
     end_init();
@@ -155,6 +142,9 @@ extern void startupHaskell(int argc, char *argv[])
 void
 shutdownHaskell(void)
 {
+  if (!rts_has_started_up)
+     return;
+
   /* Finalize any remaining weak pointers */
   finalizeWeakPointersNow();
 
@@ -179,20 +169,7 @@ shutdownHaskell(void)
   if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo();
 #endif
 
-  /*
-    This fflush is important, because: if "main" just returns,
-    then we will end up in pre-supplied exit code that will close
-    streams and flush buffers.  In particular we have seen: it
-    will close fd 0 (stdin), then flush fd 1 (stdout), then <who
-    cares>...
-    
-    But if you're playing with sockets, that "close fd 0" might
-    suggest to the daemon that all is over, only to be presented
-    with more stuff on "fd 1" at the flush.
-    
-    The fflush avoids this sad possibility.
-   */
-  fflush(stdout);
+  rts_has_started_up=0;
 }