packages feed

infinity-0.3: Main.hs

-- This is the actual startup code, however, 
-- each thread is spawned off in it's own
-- thread which is started in the dynamically
-- loaded IMain.dynmain
module Main where
import Control.Concurrent
import System.Plugins
import System.Exit
import GHC.Exts

ghcargs = []

main = do
  putStrLn "infinity starting..."
  m     <- makeAll "IMain.hs" ghcargs
  (mod,imain) <- case m of
                   MakeSuccess _ obj -> do
                          ldstat <- load_ obj ["."] "main" -- pull main first off
                          case ldstat of
                            LoadSuccess v m -> return (v,m)
                            LoadFailure e -> do
                                          putStrLn "Couldn't load IMain.dynmain:"
                                          mapM_ putStrLn e
                                          exitWith $ ExitFailure 127
                   MakeFailure e -> do
                          putStrLn "FATAL: Couldn't compile IMain.hs:"
                          mapM_ putStrLn e
                          exitWith $ ExitFailure 127
  putStrLn "Compiled & Loaded IMain.main..."
  imain mod reboot

reboot :: Module -> a -> IO ()
reboot mod st = do
  mkstat <- makeAll "IMain.hs" ghcargs
  case mkstat of
    MakeSuccess _ o -> do
        unloadAll mod
        ldstat <- load_ "IMain.o" ["."] "main'"
        case ldstat of
          LoadSuccess v main' -> do
                      putStrLn "REBOOT: Successful recompilation & reloading, rebooting..."
                      main' st v
          LoadFailure e -> fatality e
    MakeFailure e -> fatality e
                    
 where
  fatality errs = do
              putStrLn $ "REBOOT: FATAL: Couldn't reboot thread, err:"
              mapM_ putStrLn errs