summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/cmm/CmmInfo.hs2
-rw-r--r--compiler/cmm/PprCmm.hs2
-rw-r--r--compiler/codeGen/CgCallConv.hs2
-rw-r--r--compiler/codeGen/CgProf.hs4
-rw-r--r--compiler/codeGen/CgUtils.hs2
-rw-r--r--compiler/codeGen/SMRep.lhs4
-rw-r--r--compiler/codeGen/StgCmmLayout.hs2
-rw-r--r--compiler/codeGen/StgCmmProf.hs4
-rw-r--r--compiler/codeGen/StgCmmUtils.hs2
-rw-r--r--compiler/ghci/ByteCodeAsm.lhs2
-rw-r--r--compiler/ghci/ByteCodeItbls.lhs4
-rw-r--r--compiler/ghci/RtClosureInspect.hs2
-rw-r--r--compiler/iface/BinIface.hs2
-rw-r--r--compiler/main/Constants.lhs4
-rw-r--r--compiler/main/StaticFlags.hs2
-rw-r--r--compiler/nativeGen/Alpha/Regs.hs2
-rw-r--r--compiler/nativeGen/PPC/CodeGen.hs2
-rw-r--r--compiler/nativeGen/PPC/Regs.hs2
-rw-r--r--compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs2
-rw-r--r--compiler/nativeGen/RegAlloc/Linear/Main.hs2
-rw-r--r--compiler/nativeGen/SPARC/CodeGen.hs2
-rw-r--r--compiler/nativeGen/SPARC/RegPlate.hs2
-rw-r--r--compiler/nativeGen/SPARC/Regs.hs10
-rw-r--r--compiler/nativeGen/X86/CodeGen.hs2
-rw-r--r--compiler/nativeGen/X86/Ppr.hs2
-rw-r--r--compiler/nativeGen/X86/Regs.hs2
-rw-r--r--compiler/parser/cutils.c8
-rw-r--r--compiler/utils/Binary.hs2
-rw-r--r--compiler/utils/FastMutInt.lhs2
-rw-r--r--includes/ClosureMacros.h185
-rw-r--r--includes/Cmm.h31
-rw-r--r--includes/GranSim.h331
-rw-r--r--includes/HsFFI.h6
-rw-r--r--includes/MachDeps.h3
-rw-r--r--includes/Parallel.h360
-rw-r--r--includes/README9
-rw-r--r--includes/Rts.h130
-rw-r--r--includes/RtsAPI.h2
-rw-r--r--includes/RtsConfig.h64
-rw-r--r--includes/RtsExternal.h129
-rw-r--r--includes/RtsFlags.h241
-rw-r--r--includes/Stable.h63
-rw-r--r--includes/Stg.h57
-rw-r--r--includes/Storage.h583
-rw-r--r--includes/config.h7
-rw-r--r--includes/ghc.mk6
-rw-r--r--includes/ieee-flpt.h35
-rw-r--r--includes/mkDerivedConstants.c4
-rw-r--r--includes/rts/Adjustor.h20
-rw-r--r--includes/rts/Bytecodes.h (renamed from includes/Bytecodes.h)0
-rw-r--r--includes/rts/Config.h36
-rw-r--r--includes/rts/Constants.h (renamed from includes/Constants.h)6
-rw-r--r--includes/rts/EventLogFormat.h (renamed from includes/EventLogFormat.h)6
-rw-r--r--includes/rts/FileLock.h (renamed from includes/FileLock.h)7
-rw-r--r--includes/rts/Flags.h239
-rw-r--r--includes/rts/Globals.h (renamed from includes/RtsGlobals.h)9
-rw-r--r--includes/rts/Hooks.h (renamed from includes/Hooks.h)5
-rw-r--r--includes/rts/Hpc.h32
-rw-r--r--includes/rts/IOManager.h39
-rw-r--r--includes/rts/Linker.h (renamed from includes/Linker.h)8
-rw-r--r--includes/rts/Messages.h (renamed from includes/RtsMessages.h)27
-rw-r--r--includes/rts/OSThreads.h (renamed from includes/OSThreads.h)16
-rw-r--r--includes/rts/Parallel.h14
-rw-r--r--includes/rts/Signals.h (renamed from includes/Signals.h)11
-rw-r--r--includes/rts/SpinLock.h (renamed from includes/SpinLock.h)6
-rw-r--r--includes/rts/Stable.h35
-rw-r--r--includes/rts/Threads.h (renamed from includes/SchedAPI.h)32
-rw-r--r--includes/rts/Timer.h15
-rw-r--r--includes/rts/Types.h (renamed from includes/RtsTypes.h)8
-rw-r--r--includes/rts/prof/CCS.h (renamed from includes/StgProf.h)6
-rw-r--r--includes/rts/prof/LDV.h (renamed from includes/StgLdvProf.h)5
-rw-r--r--includes/rts/storage/Block.h (renamed from includes/Block.h)6
-rw-r--r--includes/rts/storage/ClosureMacros.h395
-rw-r--r--includes/rts/storage/ClosureTypes.h (renamed from includes/ClosureTypes.h)6
-rw-r--r--includes/rts/storage/Closures.h (renamed from includes/Closures.h)20
-rw-r--r--includes/rts/storage/FunTypes.h (renamed from includes/StgFun.h)8
-rw-r--r--includes/rts/storage/GC.h204
-rw-r--r--includes/rts/storage/InfoTables.h (renamed from includes/InfoTables.h)23
-rw-r--r--includes/rts/storage/Liveness.h (renamed from includes/Liveness.h)6
-rw-r--r--includes/rts/storage/MBlock.h (renamed from rts/sm/MBlock.h)10
-rw-r--r--includes/rts/storage/SMPClosureOps.h (renamed from includes/SMPClosureOps.h)6
-rw-r--r--includes/rts/storage/TSO.h (renamed from includes/TSO.h)39
-rw-r--r--includes/stg/DLL.h (renamed from includes/StgDLL.h)0
-rw-r--r--includes/stg/MachRegs.h (renamed from includes/MachRegs.h)0
-rw-r--r--includes/stg/MiscClosures.h (renamed from includes/StgMiscClosures.h)4
-rw-r--r--includes/stg/Regs.h (renamed from includes/Regs.h)5
-rw-r--r--includes/stg/SMP.h (renamed from includes/SMP.h)29
-rw-r--r--includes/stg/TailCalls.h (renamed from includes/TailCalls.h)0
-rw-r--r--includes/stg/Ticky.h (renamed from includes/TickyCounters.h)4
-rw-r--r--includes/stg/Types.h (renamed from includes/StgTypes.h)48
-rw-r--r--rts/Adjustor.c4
-rw-r--r--rts/Arena.c4
-rw-r--r--rts/AwaitEvent.h2
-rw-r--r--rts/Capability.c17
-rw-r--r--rts/Capability.h31
-rw-r--r--rts/Disassembler.c6
-rw-r--r--rts/FrontPanel.c3
-rw-r--r--rts/Globals.c5
-rw-r--r--rts/Globals.h19
-rw-r--r--rts/Hash.c2
-rw-r--r--rts/Hpc.c13
-rw-r--r--rts/Hpc.h10
-rw-r--r--rts/HsFFI.c3
-rw-r--r--rts/Inlines.c1
-rw-r--r--rts/Interpreter.c13
-rw-r--r--rts/LdvProfile.c4
-rw-r--r--rts/Linker.c29
-rw-r--r--rts/Main.c1
-rw-r--r--rts/Papi.c6
-rw-r--r--rts/Papi.h5
-rw-r--r--rts/PosixSource.h5
-rw-r--r--rts/Printer.c29
-rw-r--r--rts/Printer.h4
-rw-r--r--rts/ProfHeap.c14
-rw-r--r--rts/ProfHeap.h1
-rw-r--r--rts/Profiling.c4
-rw-r--r--rts/Proftimer.c11
-rw-r--r--rts/Proftimer.h3
-rw-r--r--rts/RaiseAsync.c6
-rw-r--r--rts/RetainerProfile.c3
-rw-r--r--rts/RetainerProfile.h2
-rw-r--r--rts/RetainerSet.c4
-rw-r--r--rts/RtsAPI.c7
-rw-r--r--rts/RtsFlags.c5
-rw-r--r--rts/RtsMain.c4
-rw-r--r--rts/RtsMessages.c2
-rw-r--r--rts/RtsSignals.h11
-rw-r--r--rts/RtsStartup.c92
-rw-r--r--rts/RtsUtils.c57
-rw-r--r--rts/RtsUtils.h38
-rw-r--r--rts/STM.c17
-rw-r--r--rts/STM.h (renamed from includes/STM.h)0
-rw-r--r--rts/Sanity.c7
-rw-r--r--rts/Sanity.h2
-rw-r--r--rts/Schedule.c35
-rw-r--r--rts/Schedule.h50
-rw-r--r--rts/Sparks.c15
-rw-r--r--rts/Stable.c11
-rw-r--r--rts/Stable.h34
-rw-r--r--rts/Stats.c19
-rw-r--r--rts/Stats.h1
-rw-r--r--rts/StgCRun.c4
-rw-r--r--rts/StgPrimFloat.c254
-rw-r--r--rts/StgPrimFloat.h21
-rw-r--r--rts/Task.c16
-rw-r--r--rts/Task.h35
-rw-r--r--rts/ThrIOManager.h15
-rw-r--r--rts/ThreadLabels.c1
-rw-r--r--rts/ThreadLabels.h6
-rw-r--r--rts/ThreadPaused.c19
-rw-r--r--rts/ThreadPaused.h14
-rw-r--r--rts/Threads.c4
-rw-r--r--rts/Threads.h7
-rw-r--r--rts/Ticky.c2
-rw-r--r--rts/Ticky.h7
-rw-r--r--rts/Timer.c7
-rw-r--r--rts/Timer.h6
-rw-r--r--rts/Trace.c6
-rw-r--r--rts/Updates.cmm3
-rw-r--r--rts/WSDeque.c (renamed from rts/parallel/WSDeque.c)3
-rw-r--r--rts/WSDeque.h (renamed from rts/parallel/WSDeque.h)0
-rw-r--r--rts/Weak.c19
-rw-r--r--rts/Weak.h6
-rw-r--r--rts/eventlog/EventLog.c3
-rw-r--r--rts/eventlog/EventLog.h2
-rw-r--r--rts/ghc.mk41
-rw-r--r--rts/hooks/FlagDefaults.c1
-rw-r--r--rts/hooks/MallocFail.c1
-rw-r--r--rts/hooks/OnExit.c1
-rw-r--r--rts/hooks/OutOfHeap.c1
-rw-r--r--rts/hooks/RtsOpts.c1
-rw-r--r--rts/hooks/StackOverflow.c1
-rw-r--r--rts/parallel/GranSim.c6
-rw-r--r--rts/posix/FileLock.c5
-rw-r--r--rts/posix/FileLock.h15
-rw-r--r--rts/posix/Itimer.c35
-rw-r--r--rts/posix/Itimer.h5
-rw-r--r--rts/posix/OSMem.c10
-rw-r--r--rts/posix/OSThreads.c3
-rw-r--r--rts/posix/Select.c13
-rw-r--r--rts/posix/Select.h17
-rw-r--r--rts/posix/Signals.c11
-rw-r--r--rts/posix/TTY.c65
-rw-r--r--rts/posix/TTY.h15
-rw-r--r--rts/sm/BlockAlloc.c44
-rw-r--r--rts/sm/Compact.c12
-rw-r--r--rts/sm/Compact.h6
-rw-r--r--rts/sm/Evac.c6
-rw-r--r--rts/sm/Evac.h6
-rw-r--r--rts/sm/GC.c24
-rw-r--r--rts/sm/GC.h16
-rw-r--r--rts/sm/GCAux.c5
-rw-r--r--rts/sm/GCThread.h7
-rw-r--r--rts/sm/GCUtils.c5
-rw-r--r--rts/sm/GCUtils.h7
-rw-r--r--rts/sm/MBlock.c5
-rw-r--r--rts/sm/MarkWeak.c4
-rw-r--r--rts/sm/MarkWeak.h5
-rw-r--r--rts/sm/OSMem.h5
-rw-r--r--rts/sm/README11
-rw-r--r--rts/sm/Scav.c5
-rw-r--r--rts/sm/Scav.h6
-rw-r--r--rts/sm/Storage.c11
-rw-r--r--rts/sm/Storage.h169
-rw-r--r--rts/sm/Sweep.c4
-rw-r--r--rts/sm/Sweep.h7
-rw-r--r--rts/win32/AsyncIO.h8
-rw-r--r--rts/win32/ConsoleHandler.h14
-rw-r--r--rts/win32/IOManager.h7
-rw-r--r--rts/win32/ThrIOManager.c2
-rw-r--r--rts/win32/WorkQueue.h7
-rw-r--r--rts/win32/seh_excn.h7
-rw-r--r--utils/genapply/GenApply.hs4
213 files changed, 2182 insertions, 3338 deletions
diff --git a/compiler/cmm/CmmInfo.hs b/compiler/cmm/CmmInfo.hs
index 734896adc8..c608372c64 100644
--- a/compiler/cmm/CmmInfo.hs
+++ b/compiler/cmm/CmmInfo.hs
@@ -58,7 +58,7 @@ cmmToRawCmm cmm = do
-- <normal forward rest of StgInfoTable>
-- <forward variable part>
--
--- See includes/InfoTables.h
+-- See includes/rts/storage/InfoTables.h
--
-- For return-points these are as follows
--
diff --git a/compiler/cmm/PprCmm.hs b/compiler/cmm/PprCmm.hs
index 504098891a..9f622c0a64 100644
--- a/compiler/cmm/PprCmm.hs
+++ b/compiler/cmm/PprCmm.hs
@@ -56,7 +56,7 @@ import Data.Maybe
-- Temp Jan08
import SMRep
import ClosureInfo
-#include "../includes/StgFun.h"
+#include "../includes/rts/storage/FunTypes.h"
pprCmms :: (Outputable info, Outputable g) => [GenCmm CmmStatic info g] -> SDoc
diff --git a/compiler/codeGen/CgCallConv.hs b/compiler/codeGen/CgCallConv.hs
index 5fa0a85dcf..351375d1e4 100644
--- a/compiler/codeGen/CgCallConv.hs
+++ b/compiler/codeGen/CgCallConv.hs
@@ -64,7 +64,7 @@ import Data.Bits
-------------------------------------------------------------------------
-- bring in ARG_P, ARG_N, etc.
-#include "../includes/StgFun.h"
+#include "../includes/rts/storage/FunTypes.h"
-------------------------
argDescrType :: ArgDescr -> StgHalfWord
diff --git a/compiler/codeGen/CgProf.hs b/compiler/codeGen/CgProf.hs
index 7750c0f08e..a3aa59b572 100644
--- a/compiler/codeGen/CgProf.hs
+++ b/compiler/codeGen/CgProf.hs
@@ -24,9 +24,9 @@ module CgProf (
) where
#include "HsVersions.h"
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
-- For WORD_SIZE_IN_BITS only.
-#include "../includes/Constants.h"
+#include "../includes/rts/Constants.h"
-- For LDV_CREATE_MASK, LDV_STATE_USE
-- which are StgWords
#include "../includes/DerivedConstants.h"
diff --git a/compiler/codeGen/CgUtils.hs b/compiler/codeGen/CgUtils.hs
index fad85f7e16..d1d81e5de4 100644
--- a/compiler/codeGen/CgUtils.hs
+++ b/compiler/codeGen/CgUtils.hs
@@ -50,7 +50,7 @@ module CgUtils (
) where
#include "HsVersions.h"
-#include "../includes/MachRegs.h"
+#include "../includes/stg/MachRegs.h"
import BlockId
import CgMonad
diff --git a/compiler/codeGen/SMRep.lhs b/compiler/codeGen/SMRep.lhs
index 32d9583800..1667af8637 100644
--- a/compiler/codeGen/SMRep.lhs
+++ b/compiler/codeGen/SMRep.lhs
@@ -246,7 +246,7 @@ data SMRep
| BlackHoleRep
data ClosureType -- Corresponds 1-1 with the varieties of closures
- -- implemented by the RTS. Compare with ghc/includes/ClosureTypes.h
+ -- implemented by the RTS. Compare with includes/rts/storage/ClosureTypes.h
= Constr
| ConstrNoCaf
| Fun
@@ -284,7 +284,7 @@ isStaticRep BlackHoleRep = False
\end{code}
\begin{code}
-#include "../includes/ClosureTypes.h"
+#include "../includes/rts/storage/ClosureTypes.h"
-- Defines CONSTR, CONSTR_1_0 etc
-- krc: only called by tickyDynAlloc in CgTicky; return
diff --git a/compiler/codeGen/StgCmmLayout.hs b/compiler/codeGen/StgCmmLayout.hs
index 84d4ef0362..11a3257732 100644
--- a/compiler/codeGen/StgCmmLayout.hs
+++ b/compiler/codeGen/StgCmmLayout.hs
@@ -313,7 +313,7 @@ mkVirtHeapOffsets is_thunk things
-------------------------------------------------------------------------
-- bring in ARG_P, ARG_N, etc.
-#include "../includes/StgFun.h"
+#include "../includes/rts/storage/FunTypes.h"
-------------------------
-- argDescrType :: ArgDescr -> StgHalfWord
diff --git a/compiler/codeGen/StgCmmProf.hs b/compiler/codeGen/StgCmmProf.hs
index 6fb20f8f46..850356149c 100644
--- a/compiler/codeGen/StgCmmProf.hs
+++ b/compiler/codeGen/StgCmmProf.hs
@@ -25,9 +25,9 @@ module StgCmmProf (
) where
#include "HsVersions.h"
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
-- For WORD_SIZE_IN_BITS only.
-#include "../includes/Constants.h"
+#include "../includes/rts/Constants.h"
-- For LDV_CREATE_MASK, LDV_STATE_USE
-- which are StgWords
#include "../includes/DerivedConstants.h"
diff --git a/compiler/codeGen/StgCmmUtils.hs b/compiler/codeGen/StgCmmUtils.hs
index 357ca2c5b6..d2d7bb1e41 100644
--- a/compiler/codeGen/StgCmmUtils.hs
+++ b/compiler/codeGen/StgCmmUtils.hs
@@ -44,7 +44,7 @@ module StgCmmUtils (
) where
#include "HsVersions.h"
-#include "MachRegs.h"
+#include "../includes/stg/MachRegs.h"
import StgCmmMonad
import StgCmmClosure
diff --git a/compiler/ghci/ByteCodeAsm.lhs b/compiler/ghci/ByteCodeAsm.lhs
index e842bf75cf..030ef896e6 100644
--- a/compiler/ghci/ByteCodeAsm.lhs
+++ b/compiler/ghci/ByteCodeAsm.lhs
@@ -208,7 +208,7 @@ sizeSS16 :: SizedSeq a -> Word16
sizeSS16 (SizedSeq n _) = fromIntegral n
-- Bring in all the bci_ bytecode constants.
-#include "Bytecodes.h"
+#include "rts/Bytecodes.h"
largeArgInstr :: Word16 -> Word16
largeArgInstr bci = bci_FLAG_LARGE_ARGS .|. bci
diff --git a/compiler/ghci/ByteCodeItbls.lhs b/compiler/ghci/ByteCodeItbls.lhs
index 61644b2a81..696ed0f564 100644
--- a/compiler/ghci/ByteCodeItbls.lhs
+++ b/compiler/ghci/ByteCodeItbls.lhs
@@ -84,7 +84,7 @@ mkITbl tc
dcs = tyConDataCons tc
n = tyConFamilySize tc
-#include "../includes/ClosureTypes.h"
+#include "../includes/rts/storage/ClosureTypes.h"
cONSTR :: Int -- Defined in ClosureTypes.h
cONSTR = CONSTR
@@ -151,7 +151,7 @@ ptrToInt (Ptr a#) = I# (addr2Int# a#)
#if sparc_TARGET_ARCH
-- After some consideration, we'll try this, where
-- 0x55555555 stands in for the address to jump to.
--- According to ghc/includes/MachRegs.h, %g3 is very
+-- According to includes/rts/MachRegs.h, %g3 is very
-- likely indeed to be baggable.
--
-- 0000 07155555 sethi %hi(0x55555555), %g3
diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs
index cc16047616..c0b9140525 100644
--- a/compiler/ghci/RtClosureInspect.hs
+++ b/compiler/ghci/RtClosureInspect.hs
@@ -165,7 +165,7 @@ data Closure = Closure { tipe :: ClosureType
instance Outputable ClosureType where
ppr = text . show
-#include "../includes/ClosureTypes.h"
+#include "../includes/rts/storage/ClosureTypes.h"
aP_CODE, pAP_CODE :: Int
aP_CODE = AP
diff --git a/compiler/iface/BinIface.hs b/compiler/iface/BinIface.hs
index 679494b0a5..15cefe8cdf 100644
--- a/compiler/iface/BinIface.hs
+++ b/compiler/iface/BinIface.hs
@@ -206,7 +206,7 @@ initBinMemSize :: Int
initBinMemSize = 1024 * 1024
-- The *host* architecture version:
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
binaryInterfaceMagic :: Word32
#if WORD_SIZE_IN_BITS == 32
diff --git a/compiler/main/Constants.lhs b/compiler/main/Constants.lhs
index b809f5280b..106c9a78ca 100644
--- a/compiler/main/Constants.lhs
+++ b/compiler/main/Constants.lhs
@@ -14,8 +14,8 @@ import Data.Bits (shiftL)
-- be in trouble.
#include "HsVersions.h"
-#include "../includes/MachRegs.h"
-#include "../includes/Constants.h"
+#include "../includes/stg/MachRegs.h"
+#include "../includes/rts/Constants.h"
#include "../includes/MachDeps.h"
#include "../includes/DerivedConstants.h"
diff --git a/compiler/main/StaticFlags.hs b/compiler/main/StaticFlags.hs
index 126b3a064a..b13661ed99 100644
--- a/compiler/main/StaticFlags.hs
+++ b/compiler/main/StaticFlags.hs
@@ -275,7 +275,7 @@ opt_Unregisterised = lookUp (fsLit "-funregisterised")
-- Derived, not a real option. Determines whether we will be compiling
-- info tables that reside just before the entry code, or with an
-- indirection to the entry code. See TABLES_NEXT_TO_CODE in
--- includes/InfoTables.h.
+-- includes/rts/storage/InfoTables.h.
tablesNextToCode :: Bool
tablesNextToCode = not opt_Unregisterised
&& cGhcEnableTablesNextToCode == "YES"
diff --git a/compiler/nativeGen/Alpha/Regs.hs b/compiler/nativeGen/Alpha/Regs.hs
index 0a5c24e65a..2d85c5f141 100644
--- a/compiler/nativeGen/Alpha/Regs.hs
+++ b/compiler/nativeGen/Alpha/Regs.hs
@@ -21,7 +21,7 @@ where
{-
#include "nativeGen/NCG.h"
#include "HsVersions.h"
-#include "../includes/MachRegs.h"
+#include "../includes/stg/MachRegs.h"
import RegsBase
diff --git a/compiler/nativeGen/PPC/CodeGen.hs b/compiler/nativeGen/PPC/CodeGen.hs
index 8eb515e6bf..495296a6ec 100644
--- a/compiler/nativeGen/PPC/CodeGen.hs
+++ b/compiler/nativeGen/PPC/CodeGen.hs
@@ -22,7 +22,7 @@ where
#include "HsVersions.h"
#include "nativeGen/NCG.h"
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
-- NCG stuff:
import PPC.Instr
diff --git a/compiler/nativeGen/PPC/Regs.hs b/compiler/nativeGen/PPC/Regs.hs
index 467ea49786..18f06ed6ef 100644
--- a/compiler/nativeGen/PPC/Regs.hs
+++ b/compiler/nativeGen/PPC/Regs.hs
@@ -49,7 +49,7 @@ where
#include "nativeGen/NCG.h"
#include "HsVersions.h"
-#include "../includes/MachRegs.h"
+#include "../includes/stg/MachRegs.h"
import Reg
import RegClass
diff --git a/compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs b/compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs
index 5f3f0ac495..fd0faaee90 100644
--- a/compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs
+++ b/compiler/nativeGen/RegAlloc/Graph/TrivColorable.hs
@@ -43,7 +43,7 @@ import FastTypes
-- There is an allocatableRegsInClass :: RegClass -> Int, but doing the unboxing
-- is too slow for us here.
--
--- Look at includes/MachRegs.h to get these numbers.
+-- Look at includes/stg/MachRegs.h to get these numbers.
--
#if i386_TARGET_ARCH
diff --git a/compiler/nativeGen/RegAlloc/Linear/Main.hs b/compiler/nativeGen/RegAlloc/Linear/Main.hs
index 00e01d7ebc..7201207c79 100644
--- a/compiler/nativeGen/RegAlloc/Linear/Main.hs
+++ b/compiler/nativeGen/RegAlloc/Linear/Main.hs
@@ -115,7 +115,7 @@ import Data.Maybe
import Data.List
import Control.Monad
-#include "../includes/MachRegs.h"
+#include "../includes/stg/MachRegs.h"
-- -----------------------------------------------------------------------------
diff --git a/compiler/nativeGen/SPARC/CodeGen.hs b/compiler/nativeGen/SPARC/CodeGen.hs
index 39ab5ebdef..c430e18579 100644
--- a/compiler/nativeGen/SPARC/CodeGen.hs
+++ b/compiler/nativeGen/SPARC/CodeGen.hs
@@ -15,7 +15,7 @@ where
#include "HsVersions.h"
#include "nativeGen/NCG.h"
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
-- NCG stuff:
import SPARC.CodeGen.Sanity
diff --git a/compiler/nativeGen/SPARC/RegPlate.hs b/compiler/nativeGen/SPARC/RegPlate.hs
index 0301ab75c0..a0d0e4c88d 100644
--- a/compiler/nativeGen/SPARC/RegPlate.hs
+++ b/compiler/nativeGen/SPARC/RegPlate.hs
@@ -93,7 +93,7 @@ import FastBool
#define f31 63
-#include "../includes/MachRegs.h"
+#include "../includes/stg/MachRegs.h"
-- | Check whether a machine register is free for allocation.
freeReg :: RegNo -> FastBool
diff --git a/compiler/nativeGen/SPARC/Regs.hs b/compiler/nativeGen/SPARC/Regs.hs
index 1c41e888ae..8ad400f813 100644
--- a/compiler/nativeGen/SPARC/Regs.hs
+++ b/compiler/nativeGen/SPARC/Regs.hs
@@ -54,7 +54,7 @@ import FastBool
prepared for any eventuality.
The whole fp-register pairing thing on sparcs is a huge nuisance. See
- fptools/ghc/includes/MachRegs.h for a description of what's going on
+ includes/stg/MachRegs.h for a description of what's going on
here.
-}
@@ -290,11 +290,13 @@ regDotColor reg
-- Hard coded freeReg / globalRegMaybe -----------------------------------------
-- This isn't being used at the moment because we're generating
--- these functions from the information in includes/MachRegs.hs via RegPlate.hs
+-- these functions from the information in
+-- includes/stg/MachRegs.hs via RegPlate.hs
-- | Check whether a machine register is free for allocation.
--- This needs to match the info in includes/MachRegs.h otherwise modules
--- compiled with the NCG won't be compatible with via-C ones.
+-- This needs to match the info in includes/stg/MachRegs.h
+-- otherwise modules compiled with the NCG won't be compatible
+-- with via-C ones.
--
{-
freeReg :: RegNo -> FastBool
diff --git a/compiler/nativeGen/X86/CodeGen.hs b/compiler/nativeGen/X86/CodeGen.hs
index 8a1c77e1df..2e72d16854 100644
--- a/compiler/nativeGen/X86/CodeGen.hs
+++ b/compiler/nativeGen/X86/CodeGen.hs
@@ -27,7 +27,7 @@ where
#include "HsVersions.h"
#include "nativeGen/NCG.h"
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
-- NCG stuff:
import X86.Instr
diff --git a/compiler/nativeGen/X86/Ppr.hs b/compiler/nativeGen/X86/Ppr.hs
index 398c480aaf..c0f465791c 100644
--- a/compiler/nativeGen/X86/Ppr.hs
+++ b/compiler/nativeGen/X86/Ppr.hs
@@ -466,7 +466,7 @@ pprDataItem lit
-- all such offsets will fit into 32 bits, so we have to stick
-- to 32-bit offset fields and modify the RTS appropriately
--
- -- See Note [x86-64-relative] in includes/InfoTables.h
+ -- See Note [x86-64-relative] in includes/rts/storage/InfoTables.h
--
ppr_item II64 x
| isRelativeReloc x =
diff --git a/compiler/nativeGen/X86/Regs.hs b/compiler/nativeGen/X86/Regs.hs
index 3a1d93883d..64d835b2eb 100644
--- a/compiler/nativeGen/X86/Regs.hs
+++ b/compiler/nativeGen/X86/Regs.hs
@@ -54,7 +54,7 @@ where
-- HACK: go for the max
#endif
-#include "../includes/MachRegs.h"
+#include "../includes/stg/MachRegs.h"
import Reg
import RegClass
diff --git a/compiler/parser/cutils.c b/compiler/parser/cutils.c
index 4a7b7b3c68..157c90290d 100644
--- a/compiler/parser/cutils.c
+++ b/compiler/parser/cutils.c
@@ -4,7 +4,9 @@ places in the GHC library.
*/
#include "Rts.h"
+#if __GLASGOW_HASKELL__ <= 610
#include "RtsFlags.h"
+#endif
#include "HsFFI.h"
@@ -20,19 +22,19 @@ and causes gcc to require too many registers on x84
*/
HsInt
-ghc_strlen( HsAddr a )
+ghc_strlen( HsPtr a )
{
return (strlen((char *)a));
}
HsInt
-ghc_memcmp( HsAddr a1, HsAddr a2, HsInt len )
+ghc_memcmp( HsPtr a1, HsPtr a2, HsInt len )
{
return (memcmp((char *)a1, a2, len));
}
HsInt
-ghc_memcmp_off( HsAddr a1, HsInt i, HsAddr a2, HsInt len )
+ghc_memcmp_off( HsPtr a1, HsInt i, HsPtr a2, HsInt len )
{
return (memcmp((char *)a1 + i, a2, len));
}
diff --git a/compiler/utils/Binary.hs b/compiler/utils/Binary.hs
index 6cd045a98b..e633f35b3a 100644
--- a/compiler/utils/Binary.hs
+++ b/compiler/utils/Binary.hs
@@ -59,7 +59,7 @@ module Binary
#include "HsVersions.h"
-- The *host* architecture version:
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
import {-# SOURCE #-} Name (Name)
import FastString
diff --git a/compiler/utils/FastMutInt.lhs b/compiler/utils/FastMutInt.lhs
index 1b2b05eb9f..6aa1c798cf 100644
--- a/compiler/utils/FastMutInt.lhs
+++ b/compiler/utils/FastMutInt.lhs
@@ -19,7 +19,7 @@ module FastMutInt(
#ifdef __GLASGOW_HASKELL__
-#include "MachDeps.h"
+#include "../includes/MachDeps.h"
#ifndef SIZEOF_HSINT
#define SIZEOF_HSINT INT_SIZE_IN_BYTES
#endif
diff --git a/includes/ClosureMacros.h b/includes/ClosureMacros.h
deleted file mode 100644
index 1c371b25e8..0000000000
--- a/includes/ClosureMacros.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/* ----------------------------------------------------------------------------
- *
- * (c) The GHC Team, 1998-2004
- *
- * Macros for building and manipulating closures
- *
- * -------------------------------------------------------------------------- */
-
-#ifndef CLOSUREMACROS_H
-#define CLOSUREMACROS_H
-
-/* Say whether the code comes before the heap; on mingwin this may not be the
- case, not because of another random MS pathology, but because the static
- program may reside in a DLL
-*/
-
-/* -----------------------------------------------------------------------------
- Info tables are slammed up against the entry code, and the label
- for the info table is at the *end* of the table itself. This
- inline function adjusts an info pointer to point to the beginning
- of the table, so we can use standard C structure indexing on it.
-
- Note: this works for SRT info tables as long as you don't want to
- access the SRT, since they are laid out the same with the SRT
- pointer as the first word in the table.
-
- NOTES ABOUT MANGLED C VS. MINI-INTERPRETER:
-
- A couple of definitions:
-
- "info pointer" The first word of the closure. Might point
- to either the end or the beginning of the
- info table, depending on whether we're using
- the mini interpretter or not. GET_INFO(c)
- retrieves the info pointer of a closure.
-
- "info table" The info table structure associated with a
- closure. This is always a pointer to the
- beginning of the structure, so we can
- use standard C structure indexing to pull out
- the fields. get_itbl(c) returns a pointer to
- the info table for closure c.
-
- An address of the form xxxx_info points to the end of the info
- table or the beginning of the info table depending on whether we're
- mangling or not respectively. So,
-
- c->header.info = xxx_info
-
- makes absolute sense, whether mangling or not.
-
- -------------------------------------------------------------------------- */
-
-#define SET_INFO(c,i) ((c)->header.info = (i))
-#define GET_INFO(c) ((c)->header.info)
-#define GET_ENTRY(c) (ENTRY_CODE(GET_INFO(c)))
-
-#define get_itbl(c) (INFO_PTR_TO_STRUCT((c)->header.info))
-#define get_ret_itbl(c) (RET_INFO_PTR_TO_STRUCT((c)->header.info))
-#define get_fun_itbl(c) (FUN_INFO_PTR_TO_STRUCT((c)->header.info))
-#define get_thunk_itbl(c) (THUNK_INFO_PTR_TO_STRUCT((c)->header.info))
-#define get_con_itbl(c) (CON_INFO_PTR_TO_STRUCT((c)->header.info))
-
-#define GET_TAG(con) (get_itbl(con)->srt_bitmap)
-
-#ifdef TABLES_NEXT_TO_CODE
-#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)(info) - 1)
-#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)(info) - 1)
-#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)(info) - 1)
-#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)(info) - 1)
-#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)(info) - 1)
-#define itbl_to_fun_itbl(i) ((StgFunInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
-#define itbl_to_ret_itbl(i) ((StgRetInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
-#define itbl_to_thunk_itbl(i) ((StgThunkInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
-#define itbl_to_con_itbl(i) ((StgConInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
-#else
-#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)info)
-#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)info)
-#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)info)
-#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)info)
-#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)info)
-#define itbl_to_fun_itbl(i) ((StgFunInfoTable *)(i))
-#define itbl_to_ret_itbl(i) ((StgRetInfoTable *)(i))
-#define itbl_to_thunk_itbl(i) ((StgThunkInfoTable *)(i))
-#define itbl_to_con_itbl(i) ((StgConInfoTable *)(i))
-#endif
-
-/* -----------------------------------------------------------------------------
- Macros for building closures
- -------------------------------------------------------------------------- */
-
-#ifdef PROFILING
-#ifdef DEBUG_RETAINER
-/*
- For the sake of debugging, we take the safest way for the moment. Actually, this
- is useful to check the sanity of heap before beginning retainer profiling.
- flip is defined in RetainerProfile.c, and declared as extern in RetainerProfile.h.
- Note: change those functions building Haskell objects from C datatypes, i.e.,
- all rts_mk???() functions in RtsAPI.c, as well.
- */
-#define SET_PROF_HDR(c,ccs_) \
- ((c)->header.prof.ccs = ccs_, (c)->header.prof.hp.rs = (retainerSet *)((StgWord)NULL | flip))
-#else
-/*
- For retainer profiling only: we do not have to set (c)->header.prof.hp.rs to
- NULL | flip (flip is defined in RetainerProfile.c) because even when flip
- is 1, rs is invalid and will be initialized to NULL | flip later when
- the closure *c is visited.
- */
-/*
-#define SET_PROF_HDR(c,ccs_) \
- ((c)->header.prof.ccs = ccs_, (c)->header.prof.hp.rs = NULL)
- */
-/*
- The following macro works for both retainer profiling and LDV profiling:
- for retainer profiling, ldvTime remains 0, so rs fields are initialized to 0.
- See the invariants on ldvTime.
- */
-#define SET_PROF_HDR(c,ccs_) \
- ((c)->header.prof.ccs = ccs_, \
- LDV_RECORD_CREATE((c)))
-#endif /* DEBUG_RETAINER */
-#define SET_STATIC_PROF_HDR(ccs_) \
- prof : { ccs : (CostCentreStack *)ccs_, hp : { rs : NULL } },
-#else
-#define SET_PROF_HDR(c,ccs)
-#define SET_STATIC_PROF_HDR(ccs)
-#endif
-
-#ifdef TICKY_TICKY
-#define SET_TICKY_HDR(c,stuff) /* old: (c)->header.ticky.updated = stuff */
-#define SET_STATIC_TICKY_HDR(stuff) /* old: ticky : { updated : stuff } */
-#else
-#define SET_TICKY_HDR(c,stuff)
-#define SET_STATIC_TICKY_HDR(stuff)
-#endif
-
-#define SET_HDR(c,_info,ccs) \
- { \
- (c)->header.info = _info; \
- SET_PROF_HDR((StgClosure *)(c),ccs); \
- SET_TICKY_HDR((StgClosure *)(c),0); \
- }
-
-#define SET_ARR_HDR(c,info,costCentreStack,n_words) \
- SET_HDR(c,info,costCentreStack); \
- (c)->words = n_words;
-
-/* -----------------------------------------------------------------------------
- How to get hold of the static link field for a static closure.
- -------------------------------------------------------------------------- */
-
-/* These are hard-coded. */
-#define FUN_STATIC_LINK(p) (&(p)->payload[0])
-#define THUNK_STATIC_LINK(p) (&(p)->payload[1])
-#define IND_STATIC_LINK(p) (&(p)->payload[1])
-
-INLINE_HEADER StgClosure **
-STATIC_LINK(const StgInfoTable *info, StgClosure *p)
-{
- switch (info->type) {
- case THUNK_STATIC:
- return THUNK_STATIC_LINK(p);
- case FUN_STATIC:
- return FUN_STATIC_LINK(p);
- case IND_STATIC:
- return IND_STATIC_LINK(p);
- default:
- return &(p)->payload[info->layout.payload.ptrs +
- info->layout.payload.nptrs];
- }
-}
-
-#define STATIC_LINK2(info,p) \
- (*(StgClosure**)(&((p)->payload[info->layout.payload.ptrs + \
- info->layout.payload.nptrs + 1])))
-
-/* -----------------------------------------------------------------------------
- INTLIKE and CHARLIKE closures.
- -------------------------------------------------------------------------- */
-
-#define CHARLIKE_CLOSURE(n) ((P_)&stg_CHARLIKE_closure[(n)-MIN_CHARLIKE])
-#define INTLIKE_CLOSURE(n) ((P_)&stg_INTLIKE_closure[(n)-MIN_INTLIKE])
-
-#endif /* CLOSUREMACROS_H */
diff --git a/includes/Cmm.h b/includes/Cmm.h
index 4577672f44..aba5c2e36b 100644
--- a/includes/Cmm.h
+++ b/includes/Cmm.h
@@ -66,7 +66,6 @@
#define CMINUSMINUS 1
#include "ghcconfig.h"
-#include "RtsConfig.h"
/* -----------------------------------------------------------------------------
Types
@@ -144,6 +143,18 @@
name : bits8[] str; \
} \
+#ifdef TABLES_NEXT_TO_CODE
+#define RET_LBL(f) f##_info
+#else
+#define RET_LBL(f) f##_ret
+#endif
+
+#ifdef TABLES_NEXT_TO_CODE
+#define ENTRY_LBL(f) f##_info
+#else
+#define ENTRY_LBL(f) f##_entry
+#endif
+
/* -----------------------------------------------------------------------------
Byte/word macros
@@ -320,26 +331,26 @@
Constants.
-------------------------------------------------------------------------- */
-#include "Constants.h"
+#include "rts/Constants.h"
#include "DerivedConstants.h"
-#include "ClosureTypes.h"
-#include "StgFun.h"
-#include "OSThreads.h"
-#include "SMPClosureOps.h"
+#include "rts/storage/ClosureTypes.h"
+#include "rts/storage/FunTypes.h"
+#include "rts/storage/SMPClosureOps.h"
+#include "rts/OSThreads.h"
/*
* Need MachRegs, because some of the RTS code is conditionally
* compiled based on REG_R1, REG_R2, etc.
*/
#define STOLEN_X86_REGS 4
-#include "MachRegs.h"
+#include "stg/MachRegs.h"
-#include "Liveness.h"
-#include "StgLdvProf.h"
+#include "rts/storage/Liveness.h"
+#include "rts/prof/LDV.h"
#undef BLOCK_SIZE
#undef MBLOCK_SIZE
-#include "Block.h" /* For Bdescr() */
+#include "rts/storage/Block.h" /* For Bdescr() */
#define MyCapability() (BaseReg - OFFSET_Capability_r)
diff --git a/includes/GranSim.h b/includes/GranSim.h
deleted file mode 100644
index be5aa83a52..0000000000
--- a/includes/GranSim.h
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- Headers for GranSim specific objects.
-
- Note that in GranSim we have one run-queue and blocking-queue for each
- processor. Therefore, this header file redefines variables like
- run_queue_hd to be relative to CurrentProc. The main arrays of runnable
- and blocking queues are defined in Schedule.c. The important STG-called
- GranSim macros (e.g. for fetching nodes) are at the end of this
- file. Usually they are just wrappers to proper C functions in GranSim.c.
-*/
-
-#ifndef GRANSIM_H
-#define GRANSIM_H
-
-#if !defined(GRAN)
-
-/* Dummy definitions for basic GranSim macros called from STG land */
-#define DO_GRAN_ALLOCATE(n) /* nothing */
-#define DO_GRAN_UNALLOCATE(n) /* nothing */
-#define DO_GRAN_FETCH(node) /* nothing */
-#define DO_GRAN_EXEC(arith,branch,load,store,floats) /* nothing */
-#define GRAN_FETCH_AND_RESCHEDULE(liveness_mask,reenter) /* nothing */
-#define GRAN_RESCHEDULE(liveness_mask,reenter) /* nothing */
-
-#endif
-
-#if defined(GRAN) /* whole file */
-
-extern StgTSO *CurrentTSO;
-
-/*
- * @node Headers for GranSim specific objects, , ,
- * @section Headers for GranSim specific objects
- *
- * @menu
- * * Externs and prototypes::
- * * Run and blocking queues::
- * * Spark queues::
- * * Processor related stuff::
- * * GranSim costs::
- * * STG called GranSim functions::
- * * STG-called routines::
- * @end menu
- *
- * @node Externs and prototypes, Run and blocking queues, Includes, Headers for GranSim specific objects
- * @subsection Externs and prototypes
- */
-
-/* Global constants */
-extern char *gran_event_names[];
-extern char *proc_status_names[];
-extern char *event_names[];
-
-/* Vars checked from within STG land */
-extern rtsBool NeedToReSchedule, IgnoreEvents, IgnoreYields;
-;
-extern rtsTime TimeOfNextEvent, TimeOfLastEvent, EndOfTimeSlice;
-
-/* costs for basic operations (copied from RTS flags) */
-extern nat gran_arith_cost, gran_branch_cost, gran_load_cost, gran_store_cost, gran_float_cost;
-
-extern nat SparksAvail; /* How many sparks are available */
-extern nat SurplusThreads; /* How many excess threads are there */
-extern nat sparksIgnored, sparksCreated;
-
-/*
- * @node Run and blocking queues, Spark queues, Externs and prototypes, Headers for GranSim specific objects
- * @subsection Run and blocking queues
- */
-
-/* declared in Schedule.c */
-extern StgTSO *run_queue_hds[], *run_queue_tls[];
-extern StgTSO *blocked_queue_hds[], *blocked_queue_tls[];
-extern StgTSO *ccalling_threadss[];
-
-#define run_queue_hd run_queue_hds[CurrentProc]
-#define run_queue_tl run_queue_tls[CurrentProc]
-#define blocked_queue_hd blocked_queue_hds[CurrentProc]
-#define blocked_queue_tl blocked_queue_tls[CurrentProc]
-#define pending_sparks_hd pending_sparks_hds[CurrentProc]
-#define pending_sparks_tl pending_sparks_tls[CurrentProc]
-#define ccalling_threads ccalling_threadss[CurrentProc]
-
-/*
- * @node Spark queues, Processor related stuff, Run and blocking queues, Headers for GranSim specific objects
- * @subsection Spark queues
- */
-
-/*
- In GranSim we use a double linked list to represent spark queues.
-
- This is more flexible, but slower, than the array of pointers
- representation used in GUM. We use the flexibility to define new fields in
- the rtsSpark structure, representing e.g. granularity info (see HWL's PhD
- thesis), or info about the parent of a spark.
-*/
-
-/* Sparks and spark queues */
-typedef struct rtsSpark_
-{
- StgClosure *node;
- nat name, global;
- nat gran_info; /* for granularity improvement mechanisms */
- PEs creator; /* PE that created this spark (unused) */
- struct rtsSpark_ *prev, *next;
-} rtsSpark;
-typedef rtsSpark *rtsSparkQ;
-
-/* The spark queues, proper */
-/* In GranSim this is a globally visible array of spark queues */
-extern rtsSparkQ pending_sparks_hds[];
-extern rtsSparkQ pending_sparks_tls[];
-
-/* Prototypes of those spark routines visible to compiler generated .hc */
-/* Routines only used inside the RTS are defined in rts/parallel GranSimRts.h */
-rtsSpark *newSpark(StgClosure *node,
- nat name, nat gran_info, nat size_info,
- nat par_info, nat local);
-/* void add_to_spark_queue(rtsSpark *spark); */
-
-/*
- * @node Processor related stuff, GranSim costs, Spark queues, Headers for GranSim specific objects
- * @subsection Processor related stuff
- */
-
-extern PEs CurrentProc;
-extern rtsTime CurrentTime[];
-
-/* Maximum number of PEs that can be simulated */
-#define MAX_PROC 32 /* (BITS_IN(StgWord)) */ /* ToDo: fix this!! */
-/*
-#if MAX_PROC==16
-#else
-#error MAX_PROC should be 32 on this architecture
-#endif
-*/
-
-/* #define CurrentTSO CurrentTSOs[CurrentProc] */
-
-/* Processor numbers to bitmasks and vice-versa */
-#define MainProc 0 /* Id of main processor */
-#define NO_PRI 0 /* dummy priority */
-#define MAX_PRI 10000 /* max possible priority */
-#define MAIN_PRI MAX_PRI /* priority of main thread */
-
-/* GrAnSim uses IdleProcs as bitmask to indicate which procs are idle */
-#define PE_NUMBER(n) (1l << (long)n)
-#define ThisPE PE_NUMBER(CurrentProc)
-#define MainPE PE_NUMBER(MainProc)
-#define Everywhere (~0l)
-#define Nowhere (0l)
-#define Now CurrentTime[CurrentProc]
-
-#define IS_LOCAL_TO(ga,proc) ((1l << (PEs) proc) & ga)
-
-#define GRAN_TIME_SLICE 1000 /* max time between 2 ReSchedules */
-
-/*
- * @node GranSim costs, STG called GranSim functions, Processor related stuff, Headers for GranSim specific objects
- * @subsection GranSim costs
- */
-
-/* Default constants for communication (see RtsFlags on how to change them) */
-
-#define LATENCY 1000 /* Latency for single packet */
-#define ADDITIONAL_LATENCY 100 /* Latency for additional packets */
-#define BASICBLOCKTIME 10
-#define FETCHTIME (LATENCY*2+MSGUNPACKTIME)
-#define LOCALUNBLOCKTIME 10
-#define GLOBALUNBLOCKTIME (LATENCY+MSGUNPACKTIME)
-
-#define MSGPACKTIME 0 /* Cost of creating a packet */
-#define MSGUNPACKTIME 0 /* Cost of receiving a packet */
-#define MSGTIDYTIME 0 /* Cost of cleaning up after send */
-
-/* How much to increase GrAnSims internal packet size if an overflow
- occurs.
- NB: This is a GrAnSim internal variable and is independent of the
- simulated packet buffer size.
-*/
-
-#define GRANSIM_DEFAULT_PACK_BUFFER_SIZE 400
-#define REALLOC_SZ 200
-
-/* extern W_ gran_mpacktime, gran_mtidytime, gran_munpacktime; */
-
-/* Thread cost model */
-#define THREADCREATETIME (25+THREADSCHEDULETIME)
-#define THREADQUEUETIME 12 /* Cost of adding a thread to the running/runnable queue */
-#define THREADDESCHEDULETIME 75 /* Cost of descheduling a thread */
-#define THREADSCHEDULETIME 75 /* Cost of scheduling a thread */
-#define THREADCONTEXTSWITCHTIME (THREADDESCHEDULETIME+THREADSCHEDULETIME)
-
-/* Instruction Cost model (SPARC, including cache misses) */
-#define ARITH_COST 1
-#define BRANCH_COST 2
-#define LOAD_COST 4
-#define STORE_COST 4
-#define FLOAT_COST 1 /* ? */
-
-#define HEAPALLOC_COST 11
-
-#define PRI_SPARK_OVERHEAD 5
-#define PRI_SCHED_OVERHEAD 5
-
-/*
- * @node STG called GranSim functions, STG-called routines, GranSim costs, Headers for GranSim specific objects
- * @subsection STG called GranSim functions
- */
-
-/* STG called GranSim functions */
-void GranSimAllocate(StgInt n);
-void GranSimUnallocate(StgInt n);
-void GranSimExec(StgWord ariths, StgWord branches, StgWord loads, StgWord stores, StgWord floats);
-StgInt GranSimFetch(StgClosure *node);
-void GranSimSpark(StgInt local, StgClosure *node);
-void GranSimSparkAt(rtsSpark *spark, StgClosure *where,StgInt identifier);
-void GranSimSparkAtAbs(rtsSpark *spark, PEs proc, StgInt identifier);
-void GranSimBlock(StgTSO *tso, PEs proc, StgClosure *node);
-
-
-/*
- * @node STG-called routines, , STG called GranSim functions, Headers for GranSim specific objects
- * @subsection STG-called routines
- */
-
-/* Wrapped version of calls to GranSim-specific STG routines */
-
-/*
-#define DO_PERFORM_RESCHEDULE(liveness, always_reenter_node) PerformReschedule_wrapper(liveness, always_reenter_node)
-*/
-#define DO_GRAN_ALLOCATE(n) STGCALL1(GranSimAllocate, n)
-#define DO_GRAN_UNALLOCATE(n) STGCALL1(GranSimUnallocate, n)
-#define DO_GRAN_FETCH(node) STGCALL1(GranSimFetch, node)
-#define DO_GRAN_EXEC(arith,branch,load,store,floats) GranSimExec(arith,branch,load,store,floats)
-
-/*
- ToDo: Clean up this mess of GRAN macros!!! -- HWL
-*/
-/* DO_GRAN_FETCH((StgClosure*)R1.p); */
-#define GRAN_FETCH() /* nothing */
-
-#define GRAN_FETCH_AND_RESCHEDULE(liveness,reenter) \
- DO_GRAN_FETCH((StgClosure*)R1.p); \
- DO_GRAN_YIELD(liveness,ENTRY_CODE((D_)(*R1.p)));
-/* RESTORE_EVERYTHING is done implicitly before entering threaded world again */
-
-/*
- This is the only macro currently enabled;
- It should check whether it is time for the current thread to yield
- (e.g. if there is a more recent event in the queue) and it should check
- whether node is local, via a call to GranSimFetch.
- ToDo: split this in 2 routines:
- - GRAN_YIELD (as it is below)
- - GRAN_FETCH (the rest of this macro)
- emit only these 2 macros based on node's liveness
- node alive: emit both macros
- node not alive: do only a GRAN_YIELD
-
- replace gran_yield_? with gran_block_? (they really block the current
- thread)
-*/
-#define GRAN_RESCHEDULE(liveness,ptrs) \
- if (RET_STGCALL1(StgInt, GranSimFetch, (StgClosure*)R1.p)) {\
- EXTFUN_RTS(gran_block_##ptrs); \
- JMP_(gran_block_##ptrs); \
- } else { \
- if (TimeOfLastEvent < CurrentTime[CurrentProc] && \
- HEAP_ALLOCED((StgClosure *)R1.p) && \
- LOOKS_LIKE_GHC_INFO(get_itbl((StgClosure *)R1.p))) { \
- EXTFUN_RTS(gran_yield_##ptrs); \
- JMP_(gran_yield_##ptrs); \
- } \
- /* GRAN_YIELD(ptrs) */ \
- }
-
-
-/* YIELD(liveness,reenter) */
-
-/* GRAN_YIELD(liveness_mask); */
-
-/* GRAN_FETCH_AND_RESCHEDULE(liveness_mask,reenter) */
-
-#define THREAD_CONTEXT_SWITCH(liveness_mask,reenter) \
- do { \
- if (context_switch /* OR_INTERVAL_EXPIRED */) { \
- GRAN_RESCHEDULE(liveness_mask,reenter); \
- } }while(0)
-
-#define GRAN_EXEC(arith,branch,load,store,floats) \
- { \
- W_ cost = gran_arith_cost*arith + \
- gran_branch_cost*branch + \
- gran_load_cost*load + \
- gran_store_cost*store + \
- gran_float_cost*floats; \
- CurrentTSO->gran.exectime += cost; \
- CurrentTime[CurrentProc] += cost; \
- }
-
-/* In GranSim we first check whether there is an event to handle; only if
- this is the case (or the time slice is over in case of fair scheduling)
- we do a yield, which is very similar to that in the concurrent world
- ToDo: check whether gran_yield_? can be merged with other yielding codes
-*/
-
-#define DO_GRAN_YIELD(ptrs) if (!IgnoreYields && \
- TimeOfLastEvent < CurrentTime[CurrentProc] && \
- HEAP_ALLOCED((StgClosure *)R1.p) && \
- LOOKS_LIKE_GHC_INFO(get_itbl((StgClosure *)R1.p))) { \
- EXTFUN_RTS(gran_yield_##ptrs); \
- JMP_(gran_yield_##ptrs); \
- }
-
-#define GRAN_YIELD(ptrs) \
- { \
- extern int context_switch; \
- if ( (CurrentTime[CurrentProc]>=EndOfTimeSlice) || \
- ((CurrentTime[CurrentProc]>=TimeOfNextEvent) && \
- (TimeOfNextEvent!=0) && !IgnoreEvents )) { \
- /* context_switch = 1; */ \
- DO_GRAN_YIELD(ptrs); \
- } \
- }
-
-#define ADD_TO_SPARK_QUEUE(spark) \
- STGCALL1(add_to_spark_queue,spark) \
-
-#endif /* GRAN */
-
-#endif /* GRANSIM_H */
diff --git a/includes/HsFFI.h b/includes/HsFFI.h
index cd9f7ede80..f489be5623 100644
--- a/includes/HsFFI.h
+++ b/includes/HsFFI.h
@@ -18,8 +18,7 @@ extern "C" {
/* get types from GHC's runtime system */
#include "ghcconfig.h"
-#include "RtsConfig.h"
-#include "StgTypes.h"
+#include "stg/Types.h"
/* get limits for integral types */
#ifdef HAVE_STDINT_H
@@ -84,10 +83,7 @@ typedef StgDouble HsDouble;
typedef StgInt HsBool;
typedef void* HsPtr; /* this should better match StgAddr */
typedef void (*HsFunPtr)(void); /* this should better match StgAddr */
-typedef void* HsForeignPtr; /* ... and this StgForeignPtr */
typedef void* HsStablePtr;
-typedef void* HsAddr; /* DEPRECATED */
-typedef void* HsForeignObj; /* DEPRECATED */
/* this should correspond to the type of StgChar in StgTypes.h */
#define HS_CHAR_MIN 0
diff --git a/includes/MachDeps.h b/includes/MachDeps.h
index 7b71f7c378..8e6db3ec0e 100644
--- a/includes/MachDeps.h
+++ b/includes/MachDeps.h
@@ -58,9 +58,6 @@
#define SIZEOF_HSFUNPTR SIZEOF_VOID_P
#define ALIGNMENT_HSFUNPTR ALIGNMENT_VOID_P
-#define SIZEOF_HSFOREIGNPTR SIZEOF_VOID_P
-#define ALIGNMENT_HSFOREIGNPTR ALIGNMENT_VOID_P
-
#define SIZEOF_HSSTABLEPTR SIZEOF_VOID_P
#define ALIGNMENT_HSSTABLEPTR ALIGNMENT_VOID_P
diff --git a/includes/Parallel.h b/includes/Parallel.h
deleted file mode 100644
index e18fbe9b2c..0000000000
--- a/includes/Parallel.h
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- Definitions for GUM i.e. running on a parallel machine.
-
- This section contains definitions applicable only to programs compiled
- to run on a parallel machine, i.e. on GUM. Some of these definitions
- are also used when simulating parallel execution, i.e. on GranSim.
-*/
-
-#ifndef PARALLEL_H
-#define PARALLEL_H
-
-#if defined(PAR) || defined(GRAN) /* whole file */
-
-/*
- * @node Parallel definitions, End of File
- * @section Parallel definitions
- *
- * @menu
- * * Basic definitions::
- * * GUM::
- * * GranSim::
- * @end menu
- *
- * @node Basic definitions, GUM, Parallel definitions, Parallel definitions
- * @subsection Basic definitions
- */
-
-/* This clashes with TICKY, but currently TICKY and PAR hate each other anyway */
-#define _HS sizeofW(StgHeader)
-
-/* SET_PAR_HDR and SET_STATIC_PAR_HDR now live in ClosureMacros.h */
-
-/* Needed for dumping routines */
-#if defined(PAR)
-# define NODE_STR_LEN 20
-# define TIME_STR_LEN 120
-# define TIME rtsTime
-# define CURRENT_TIME (msTime() - startTime)
-# define TIME_ON_PROC(p) (msTime() - startTime)
-# define CURRENT_PROC thisPE
-# define BINARY_STATS RtsFlags.ParFlags.ParStats.Binary
-#elif defined(GRAN)
-# define NODE_STR_LEN 20
-# define TIME_STR_LEN 120
-# define TIME rtsTime
-# define CURRENT_TIME CurrentTime[CurrentProc]
-# define TIME_ON_PROC(p) CurrentTime[p]
-# define CURRENT_PROC CurrentProc
-# define BINARY_STATS RtsFlags.GranFlags.GranSimStats.Binary
-#endif
-
-#if defined(PAR)
-# define MAX_PES 256 /* Maximum number of processors */
- /* MAX_PES is enforced by SysMan, which does not
- allow more than this many "processors".
- This is important because PackGA [GlobAddr.lc]
- **assumes** that a PE# can fit in 8+ bits.
- */
-
-# define SPARK_POOLS 2 /* no. of spark pools */
-# define REQUIRED_POOL 0 /* idx of pool of mandatory sparks (concurrency) */
-# define ADVISORY_POOL 1 /* idx of pool of advisory sparks (parallelism) */
-#endif
-
-/*
- * @menu
- * * GUM::
- * * GranSim::
- * @end menu
- *
- * @node GUM, GranSim, Basic definitions, Parallel definitions
- * @subsection GUM
- */
-
-#if defined(PAR)
-/*
- Symbolic constants for the packing code.
-
- This constant defines how many words of data we can pack into a single
- packet in the parallel (GUM) system.
-*/
-
-/*
- * @menu
- * * Types::
- * * Externs::
- * * Prototypes::
- * * Macros::
- * @end menu
- *
- * @node Types, Externs, GUM, GUM
- * @subsubsection Types
- */
-
-/* Sparks and spark queues */
-typedef StgClosure *rtsSpark;
-typedef rtsSpark *rtsSparkQ;
-
-typedef struct rtsPackBuffer_ {
- StgInt /* nat */ id;
- StgInt /* nat */ size;
- StgInt /* nat */ unpacked_size;
- StgTSO *tso;
- StgWord *buffer[0];
-} rtsPackBuffer;
-
-#define PACK_BUFFER_HDR_SIZE 4
-
-/*
- * @node Externs, Prototypes, Types, GUM
- * @subsubsection Externs
- */
-
-/* extern rtsBool do_sp_profile; */
-
-extern globalAddr theGlobalFromGA, theGlobalToGA;
-extern StgBlockedFetch *PendingFetches;
-extern GlobalTaskId *allPEs;
-
-extern rtsBool IAmMainThread, GlobalStopPending;
-/*extern rtsBool fishing; */
-extern rtsTime last_fish_arrived_at;
-extern nat outstandingFishes;
-extern GlobalTaskId SysManTask;
-extern int seed; /* pseudo-random-number generator seed: */
- /* Initialised in ParInit */
-extern StgInt threadId; /* Number of Threads that have existed on a PE */
-extern GlobalTaskId mytid;
-
-extern GlobalTaskId *allPEs;
-extern nat nPEs;
-extern nat sparksIgnored, sparksCreated, threadsIgnored, threadsCreated;
-extern nat advisory_thread_count;
-
-extern rtsBool InGlobalGC; /* Are we in the midst of performing global GC */
-
-extern ullong startTime; /* start of comp; in RtsStartup.c */
-
-/* the spark pools proper */
-extern rtsSpark *pending_sparks_hd[]; /* ptr to start of a spark pool */
-extern rtsSpark *pending_sparks_tl[]; /* ptr to end of a spark pool */
-extern rtsSpark *pending_sparks_lim[];
-extern rtsSpark *pending_sparks_base[];
-extern nat spark_limit[];
-
-extern rtsPackBuffer *PackBuffer; /* size: can be set via option */
-extern rtsPackBuffer *buffer;
-extern rtsPackBuffer *freeBuffer;
-extern rtsPackBuffer *packBuffer;
-extern rtsPackBuffer *gumPackBuffer;
-
-extern nat thisPE;
-
-/* From Global.c
-extern GALA *freeGALAList;
-extern GALA *freeIndirections;
-extern GALA *liveIndirections;
-extern GALA *liveRemoteGAs;
-*/
-
-/*
- * @node Prototypes, Macros, Externs, GUM
- * @subsubsection Prototypes
- */
-
-/* From ParInit.c */
-void initParallelSystem(void);
-void SynchroniseSystem(void);
-void par_exit(StgInt n);
-
-PEs taskIDtoPE (GlobalTaskId gtid);
-void registerTask (GlobalTaskId gtid);
-globalAddr *LAGAlookup (StgClosure *addr);
-StgClosure *GALAlookup (globalAddr *ga);
-/*static GALA *allocIndirection (StgPtr addr); */
-globalAddr *makeGlobal (StgClosure *addr, rtsBool preferred);
-globalAddr *setRemoteGA (StgClosure *addr, globalAddr *ga, rtsBool preferred);
-void splitWeight (globalAddr *to, globalAddr *from);
-globalAddr *addWeight (globalAddr *ga);
-void initGAtables (void);
-void RebuildLAGAtable (void);
-StgWord PackGA (StgWord pe, int slot);
-
-# if defined(DEBUG)
-/* from Global.c */
-/* highest_slot breaks the abstraction of the slot counter for GAs; it is
- only used for sanity checking and should used nowhere else */
-StgInt highest_slot (void);
-# endif
-
-/*
- * @node Macros, , Prototypes, GUM
- * @subsubsection Macros
- */
-
-/* delay (in us) between dying fish returning and sending out a new fish */
-#define FISH_DELAY 1000
-/* max no. of outstanding spark steals */
-#define MAX_FISHES 1
-
-/* ToDo: check which of these is actually needed! */
-
-# define PACK_HEAP_REQUIRED ((RtsFlags.ParFlags.packBufferSize - PACK_HDR_SIZE) / (PACK_GA_SIZE + _HS) * (MIN_UPD_SIZE + 2))
-
-# define MAX_GAS (RtsFlags.ParFlags.packBufferSize / PACK_GA_SIZE)
-
-
-# define PACK_GA_SIZE 3 /* Size of a packed GA in words */
- /* Size of a packed fetch-me in words */
-# define PACK_FETCHME_SIZE (PACK_GA_SIZE + _HS)
-
-# define PACK_HDR_SIZE 1 /* Words of header in a packet */
-
-# define PACK_PLC_SIZE 2 /* Size of a packed PLC in words */
-
-/*
- Definitions relating to the entire parallel-only fixed-header field.
-
- On GUM, the global addresses for each local closure are stored in a
- separate hash table, rather then with the closure in the heap. We call
- @getGA@ to look up the global address associated with a local closure (0
- is returned for local closures that have no global address), and @setGA@
- to store a new global address for a local closure which did not
- previously have one. */
-
-# define GA_HDR_SIZE 0
-
-# define GA(closure) getGA(closure)
-
-# define SET_GA(closure, ga) setGA(closure,ga)
-# define SET_STATIC_GA(closure)
-# define SET_GRAN_HDR(closure,pe)
-# define SET_STATIC_PROCS(closure)
-
-# define MAX_GA_WEIGHT 0 /* Treat as 2^n */
-
-/* At the moment, there is no activity profiling for GUM. This may change. */
-# define SET_TASK_ACTIVITY(act) /* nothing */
-
-/*
- The following macros are only needed for sanity checking (see Sanity.c).
-*/
-
-/* NB: this is PVM specific and should be updated for MPI etc
- in PVM a task id (tid) is split into 2 parts: the id for the
- physical processor it is running on and an index of tasks running
- on a processor; PVM_PE_MASK indicates which part of a tid holds the
- id of the physical processor (the other part of the word holds the
- index on that processor)
- MAX_PVM_PES and MAX_PVM_TIDS are maximal values for these 2 components
- in GUM we have an upper bound for the total number of PVM PEs allowed:
- it's MAX_PE defined in Parallel.h
- to check the slot field of a GA we call a fct highest_slot which just
- returns the internal counter
-*/
-#define PVM_PE_MASK 0xfffc0000
-#define MAX_PVM_PES MAX_PES
-#define MAX_PVM_TIDS MAX_PES
-
-#if 0
-#define LOOKS_LIKE_TID(tid) (((tid & PVM_PE_MASK) != 0) && \
- (((tid & PVM_PE_MASK) + (tid & ~PVM_PE_MASK)) < MAX_PVM_TIDS))
-#define LOOKS_LIKE_SLOT(slot) (slot<=highest_slot())
-
-#define LOOKS_LIKE_GA(ga) (LOOKS_LIKE_TID((ga)->payload.gc.gtid) && \
- LOOKS_LIKE_SLOT((ga)->payload.gc.slot))
-#else
-rtsBool looks_like_tid(StgInt tid);
-rtsBool looks_like_slot(StgInt slot);
-rtsBool looks_like_ga(globalAddr *ga);
-#define LOOKS_LIKE_TID(tid) looks_like_tid(tid)
-#define LOOKS_LIKE_GA(ga) looks_like_ga(ga)
-#endif /* 0 */
-
-#endif /* PAR */
-
-/*
- * @node GranSim, , GUM, Parallel definitions
- * @subsection GranSim
- */
-
-#if defined(GRAN)
-/* ToDo: Check which of the PAR routines are needed in GranSim -- HWL */
-
-/*
- * @menu
- * * Types::
- * * Prototypes::
- * * Macros::
- * @end menu
- *
- * @node Types, Prototypes, GranSim, GranSim
- * @subsubsection Types
- */
-
-typedef StgWord *StgBuffer;
-typedef struct rtsPackBuffer_ {
- StgInt /* nat */ id;
- StgInt /* nat */ size;
- StgInt /* nat */ unpacked_size;
- StgTSO *tso;
- StgWord *buffer;
-} rtsPackBuffer;
-
-/*
- * @node Macros, , Prototypes, GranSim
- * @subsubsection Macros
- */
-
-/* max no. of outstanding spark steals */
-#define MAX_FISHES 1
-
-/* These are needed in the packing code to get the size of the packet
- right. The closures itself are never built in GrAnSim. */
-# define FETCHME_VHS IND_VHS
-# define FETCHME_HS IND_HS
-
-# define FETCHME_GA_LOCN FETCHME_HS
-
-# define FETCHME_CLOSURE_SIZE(closure) IND_CLOSURE_SIZE(closure)
-# define FETCHME_CLOSURE_NoPTRS(closure) 0L
-# define FETCHME_CLOSURE_NoNONPTRS(closure) (IND_CLOSURE_SIZE(closure)-IND_VHS)
-
-# define MAX_GAS (RtsFlags.GranFlags.packBufferSize / PACK_GA_SIZE)
-# define PACK_GA_SIZE 3 /* Size of a packed GA in words */
- /* Size of a packed fetch-me in words */
-# define PACK_FETCHME_SIZE (PACK_GA_SIZE + _HS)
-# define PACK_HDR_SIZE 4 /* Words of header in a packet */
-
-# define PACK_HEAP_REQUIRED \
- (RtsFlags.GranFlags.packBufferSize * sizeofW(StgClosure*) + \
- 2 * sizeofW(StgInt) + sizeofW(StgTSO*))
-
-# define PACK_FLAG_LOCN 0
-# define PACK_TSO_LOCN 1
-# define PACK_UNPACKED_SIZE_LOCN 2
-# define PACK_SIZE_LOCN 3
-# define MAGIC_PACK_FLAG 0xfabc
-
-# define GA_HDR_SIZE 1
-
-# define PROCS_HDR_POSN PAR_HDR_POSN
-# define PROCS_HDR_SIZE 1
-
-/* Accessing components of the field */
-# define PROCS(closure) ((closure)->header.gran.procs)
-/* SET_PROCS is now SET_GRAN_HEADER in ClosureMacros.h. */
-
-#endif /* GRAN */
-
-/*
- * @node End of File, , Parallel definitions
- * @section End of File
- */
-
-#endif /* defined(PAR) || defined(GRAN) whole file */
-
-#endif /* Parallel_H */
-
-
diff --git a/includes/README b/includes/README
index 90695a6e7c..dbde6579f4 100644
--- a/includes/README
+++ b/includes/README
@@ -83,17 +83,14 @@ Rts.h
SpinLock.h
TSO.h
Updates.h /* macros for performing updates */
- GranSim.h
Parallel.h
Block.h
Stable.h
Hooks.h
Signals.h
- DNInvoke.h
- Dotnet.h
- RtsExternal.h /* decls for RTS things required by .hc code */
- (RtsAPI.h)
- (HsFFI.h)
+ Adjustor.h /* foreign import "wrapper", aka adjustors */
+ StgPrimFloat.h /* primitive floating-point operations */
+ Hpc.h
Cmm.h /* included into .cmm source only */
DerivedConstants.h /* generated by mkDerivedConstants.c from other */
diff --git a/includes/Rts.h b/includes/Rts.h
index a32bf34309..7358c368c1 100644
--- a/includes/Rts.h
+++ b/includes/Rts.h
@@ -1,8 +1,9 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1998-2004
+ * (c) The GHC Team, 1998-2009
*
- * Top-level include file for the RTS itself
+ * RTS external APIs. This file declares everything that the GHC RTS
+ * exposes externally.
*
* ---------------------------------------------------------------------------*/
@@ -18,8 +19,8 @@ extern "C" {
#endif
#include "Stg.h"
-// ToDo: move RtsExternal stuff elsewhere
-#include "RtsExternal.h"
+#include "HsFFI.h"
+#include "RtsAPI.h"
// Turn off inlining when debugging - it obfuscates things
#ifdef DEBUG
@@ -27,7 +28,7 @@ extern "C" {
# define STATIC_INLINE static
#endif
-#include "RtsTypes.h"
+#include "rts/Types.h"
#if __GNUC__ >= 3
/* Assume that a flexible array member at the end of a struct
@@ -63,11 +64,6 @@ extern "C" {
#define sizeofW(t) ROUNDUP_BYTES_TO_WDS(sizeof(t))
-/*
- * It's nice to be able to grep for casts
- */
-#define stgCast(ty,e) ((ty)(e))
-
/* -----------------------------------------------------------------------------
Assertions and Debuggery
@@ -75,7 +71,8 @@ extern "C" {
ASSERT(p) like CHECK(p) if DEBUG is on, otherwise a no-op
-------------------------------------------------------------------------- */
-extern void _assertFail (const char *, unsigned int);
+void _assertFail(const char *filename, unsigned int linenum)
+ GNUC3_ATTRIBUTE(__noreturn__);
#define CHECK(predicate) \
if (predicate) \
@@ -124,29 +121,6 @@ extern void _assertFail (const char *, unsigned int);
#define FMT_Int64 "lld"
#endif
-/*
- * Macros for untagging and retagging closure pointers
- * For more information look at the comments in Cmm.h
- */
-
-static inline StgWord
-GET_CLOSURE_TAG(StgClosure * p)
-{
- return (StgWord)p & TAG_MASK;
-}
-
-static inline StgClosure *
-UNTAG_CLOSURE(StgClosure * p)
-{
- return (StgClosure*)((StgWord)p & ~TAG_MASK);
-}
-
-static inline StgClosure *
-TAG_CLOSURE(StgWord tag,StgClosure * p)
-{
- return (StgClosure*)((StgWord)p | tag);
-}
-
/* -----------------------------------------------------------------------------
Include everything STG-ish
-------------------------------------------------------------------------- */
@@ -158,59 +132,62 @@ TAG_CLOSURE(StgWord tag,StgClosure * p)
*/
#include <stdlib.h>
+#include "rts/Config.h"
+
/* Global constaints */
-#include "Constants.h"
+#include "rts/Constants.h"
/* Profiling information */
-#include "StgProf.h"
-#include "StgLdvProf.h"
-
-/* Storage format definitions */
-#include "StgFun.h"
-#include "Closures.h"
-#include "Liveness.h"
-#include "ClosureTypes.h"
-#include "InfoTables.h"
-#include "TSO.h"
-
-/* Info tables, closures & code fragments defined in the RTS */
-#include "StgMiscClosures.h"
+#include "rts/prof/CCS.h"
+#include "rts/prof/LDV.h"
/* Parallel information */
-#include "OSThreads.h"
-#include "SMPClosureOps.h"
-#include "SpinLock.h"
-
-/* Macros for STG/C code */
-#include "Block.h"
-#include "ClosureMacros.h"
-
-/* Runtime-system hooks */
-#include "Hooks.h"
-#include "RtsMessages.h"
+#include "rts/OSThreads.h"
+#include "rts/SpinLock.h"
-/* for StablePtr/getStablePtr/deRefStablePtr */
-#include "Storage.h"
-#include "Stable.h"
+#include "rts/Messages.h"
-#include "ieee-flpt.h"
-
-#include "Signals.h"
+/* Storage format definitions */
+#include "rts/storage/FunTypes.h"
+#include "rts/storage/InfoTables.h"
+#include "rts/storage/Closures.h"
+#include "rts/storage/Liveness.h"
+#include "rts/storage/ClosureTypes.h"
+#include "rts/storage/TSO.h"
+#include "stg/MiscClosures.h" /* InfoTables, closures etc. defined in the RTS */
+#include "rts/storage/SMPClosureOps.h"
+#include "rts/storage/Block.h"
+#include "rts/storage/ClosureMacros.h"
+#include "rts/storage/MBlock.h"
+#include "rts/storage/GC.h"
+
+/* Other RTS external APIs */
+#include "rts/Parallel.h"
+#include "rts/Hooks.h"
+#include "rts/Signals.h"
+#include "rts/Hpc.h"
+#include "rts/Flags.h"
+#include "rts/Adjustor.h"
+#include "rts/FileLock.h"
+#include "rts/Globals.h"
+#include "rts/IOManager.h"
+#include "rts/Linker.h"
+#include "rts/Threads.h"
+#include "rts/Timer.h"
+#include "rts/Stable.h"
/* Misc stuff without a home */
DLL_IMPORT_RTS extern char **prog_argv; /* so we can get at these from Haskell */
DLL_IMPORT_RTS extern int prog_argc;
DLL_IMPORT_RTS extern char *prog_name;
-extern void stackOverflow(void);
-
-extern void __decodeDouble_2Int (I_ *man_sign, W_ *man_high, W_ *man_low, I_ *exp, StgDouble dbl);
-extern void __decodeFloat_Int (I_ *man, I_ *exp, StgFloat flt);
+void stackOverflow(void);
-/* Initialising the whole adjustor thunk machinery. */
-extern void initAdjustor(void);
+void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
-extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
+#ifndef mingw32_HOST_OS
+int stg_sig_install (int, int, void *);
+#endif
/* -----------------------------------------------------------------------------
RTS Exit codes
@@ -236,11 +213,6 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
extern StgInt RIGHT_ARITY_##arity; \
extern StgInt TAGGED_PTR_##arity;
-#define TICK_VAR_INI(arity) \
- StgInt SLOW_CALLS_##arity = 1; \
- StgInt RIGHT_ARITY_##arity = 1; \
- StgInt TAGGED_PTR_##arity = 0;
-
extern StgInt TOTAL_CALLS;
TICK_VAR(1)
@@ -253,10 +225,6 @@ TICK_VAR(2)
#define IF_RTSFLAGS(c,s) if (RtsFlags.c) { s; }
-/* -----------------------------------------------------------------------------
- Assertions and Debuggery
- -------------------------------------------------------------------------- */
-
#ifdef DEBUG
#if IN_STG_CODE
#define IF_DEBUG(c,s) if (RtsFlags[0].DebugFlags.c) { s; }
diff --git a/includes/RtsAPI.h b/includes/RtsAPI.h
index 5160046da8..2d2c35ca97 100644
--- a/includes/RtsAPI.h
+++ b/includes/RtsAPI.h
@@ -26,7 +26,7 @@ typedef enum {
HeapExhausted /* out of memory */
} SchedulerStatus;
-typedef StgClosure *HaskellObj;
+typedef struct StgClosure_ *HaskellObj;
/*
* An abstract type representing the token returned by rts_lock() and
diff --git a/includes/RtsConfig.h b/includes/RtsConfig.h
deleted file mode 100644
index 3b088b7417..0000000000
--- a/includes/RtsConfig.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * (c) The GHC Team, 1998-2004
- *
- * Rts settings.
- *
- * NOTE: assumes #include "ghcconfig.h"
- *
- * NB: THIS FILE IS INCLUDED IN NON-C CODE AND DATA! #defines only please.
- * ---------------------------------------------------------------------------*/
-
-#ifndef RTSCONFIG_H
-#define RTSCONFIG_H
-
-/*
- * SUPPORT_LONG_LONGS controls whether we need to support long longs on a
- * particular platform. On 64-bit platforms, we don't need to support
- * long longs since regular machine words will do just fine.
- */
-#if HAVE_LONG_LONG && SIZEOF_VOID_P < 8
-#define SUPPORT_LONG_LONGS 1
-#endif
-
-/*
- * Whether the runtime system will use libbfd for debugging purposes.
- */
-#if defined(DEBUG) && defined(HAVE_BFD_H) && defined(HAVE_LIBBFD) && !defined(_WIN32)
-#define USING_LIBBFD 1
-#endif
-
-/* -----------------------------------------------------------------------------
- Labels - entry labels & info labels point to the same place in
- TABLES_NEXT_TO_CODE, so we only generate the _info label. Jumps
- must therefore be directed to foo_info rather than foo_entry when
- TABLES_NEXT_TO_CODE is on.
-
- This isn't a good place for these macros, but they need to be
- available to .cmm sources as well as C and we don't have a better
- place.
- -------------------------------------------------------------------------- */
-
-#ifdef TABLES_NEXT_TO_CODE
-#define ENTRY_LBL(f) f##_info
-#else
-#define ENTRY_LBL(f) f##_entry
-#endif
-
-#ifdef TABLES_NEXT_TO_CODE
-#define RET_LBL(f) f##_info
-#else
-#define RET_LBL(f) f##_ret
-#endif
-
-/* -----------------------------------------------------------------------------
- Signals - supported on non-PAR versions of the runtime. See RtsSignals.h.
- -------------------------------------------------------------------------- */
-
-#define RTS_USER_SIGNALS 1
-
-/* Profile spin locks */
-
-#define PROF_SPIN
-
-#endif /* RTSCONFIG_H */
diff --git a/includes/RtsExternal.h b/includes/RtsExternal.h
deleted file mode 100644
index 2272b2a429..0000000000
--- a/includes/RtsExternal.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * (c) The GHC Team, 1998-2004
- *
- * Things visible externally to the RTS
- *
- * -------------------------------------------------------------------------- */
-
-#ifndef RTSEXTERNAL_H
-#define RTSEXTERNAL_H
-
-/* The RTS public interface. */
-#include "RtsAPI.h"
-
-/* The standard FFI interface */
-#include "HsFFI.h"
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-
-/* -----------------------------------------------------------------------------
- Functions exported by the RTS for use in Stg code
- -------------------------------------------------------------------------- */
-
-#if IN_STG_CODE
-extern void newCAF(void*);
-#else
-extern void newCAF(StgClosure*);
-#endif
-
-/* ToDo: remove? */
-extern HsInt genSymZh(void);
-extern HsInt resetGenSymZh(void);
-
-/* Alternate to raise(3) for threaded rts, for OpenBSD */
-extern int genericRaise(int sig);
-
-/* Concurrency/Exception PrimOps. */
-extern int cmp_thread(StgPtr tso1, StgPtr tso2);
-extern int rts_getThreadId(StgPtr tso);
-extern int forkOS_createThread ( HsStablePtr entry );
-extern pid_t forkProcess(HsStablePtr *entry);
-extern HsBool rtsSupportsBoundThreads(void);
-extern StgInt newSpark (StgRegTable *reg, StgClosure *p);
-extern void stopTimer(void);
-extern unsigned int n_capabilities;
-
-/* grimy low-level support functions defined in StgPrimFloat.c */
-extern StgDouble __encodeDouble (I_ size, StgByteArray arr, I_ e);
-extern StgDouble __2Int_encodeDouble (I_ j_high, I_ j_low, I_ e);
-extern StgDouble __int_encodeDouble (I_ j, I_ e);
-extern StgDouble __word_encodeDouble (W_ j, I_ e);
-extern StgFloat __encodeFloat (I_ size, StgByteArray arr, I_ e);
-extern StgFloat __int_encodeFloat (I_ j, I_ e);
-extern StgFloat __word_encodeFloat (W_ j, I_ e);
-extern StgInt isDoubleNaN(StgDouble d);
-extern StgInt isDoubleInfinite(StgDouble d);
-extern StgInt isDoubleDenormalized(StgDouble d);
-extern StgInt isDoubleNegativeZero(StgDouble d);
-extern StgInt isFloatNaN(StgFloat f);
-extern StgInt isFloatInfinite(StgFloat f);
-extern StgInt isFloatDenormalized(StgFloat f);
-extern StgInt isFloatNegativeZero(StgFloat f);
-
-/* Suspending/resuming threads around foreign calls */
-extern void * suspendThread ( StgRegTable * );
-extern StgRegTable * resumeThread ( void * );
-
-/* scheduler stuff */
-extern void stg_scheduleThread (StgRegTable *reg, struct StgTSO_ *tso);
-
-/* Creating and destroying an adjustor thunk */
-extern void* createAdjustor(int cconv, StgStablePtr hptr, StgFunPtr wptr,
- char *typeString);
-extern void freeHaskellFunctionPtr(void* ptr);
-
-/* Hpc stuff */
-extern int hs_hpc_module(char *modName, StgWord32 modCount, StgWord32 modHashNo,StgWord64 *tixArr);
-// Simple linked list of modules
-typedef struct _HpcModuleInfo {
- char *modName; // name of module
- StgWord32 tickCount; // number of ticks
- StgWord32 tickOffset; // offset into a single large .tix Array
- StgWord32 hashNo; // Hash number for this module's mix info
- StgWord64 *tixArr; // tix Array; local for this module
- struct _HpcModuleInfo *next;
-} HpcModuleInfo;
-
-extern HpcModuleInfo *hs_hpc_rootModule(void);
-
-
-#if defined(mingw32_HOST_OS)
-extern int rts_InstallConsoleEvent ( int action, StgStablePtr *handler );
-extern void rts_ConsoleHandlerDone ( int ev );
-#else
-extern int stg_sig_install (int, int, void *);
-#endif
-
-#if defined(mingw32_HOST_OS)
-extern StgInt console_handler;
-#else
-extern StgInt *signal_handlers;
-#endif
-
-#if defined(mingw32_HOST_OS)
-void *getIOManagerEvent (void);
-HsWord32 readIOManagerEvent (void);
-void sendIOManagerEvent (HsWord32 event);
-#else
-extern void setIOManagerPipe (int fd);
-#endif
-
-extern void* allocateExec(unsigned int len, void **exec_addr);
-
-// Breakpoint stuff
-
-/* -----------------------------------------------------------------------------
- Storage manager stuff exported
- -------------------------------------------------------------------------- */
-
-extern void performGC(void);
-extern void performMajorGC(void);
-extern HsInt64 getAllocations( void );
-extern void revertCAFs( void );
-extern void dirty_MUT_VAR(StgRegTable *reg, StgClosure *p);
-extern void dirty_MVAR(StgRegTable *reg, StgClosure *p);
-
-#endif /* RTSEXTERNAL_H */
diff --git a/includes/RtsFlags.h b/includes/RtsFlags.h
index ab6f2982cd..778fccf40a 100644
--- a/includes/RtsFlags.h
+++ b/includes/RtsFlags.h
@@ -1,239 +1,2 @@
-/* -----------------------------------------------------------------------------
- *
- * (c) The GHC Team, 1998-1999
- *
- * Datatypes that holds the command-line flag settings.
- *
- * ---------------------------------------------------------------------------*/
-
-#ifndef RTSFLAGS_H
-#define RTSFLAGS_H
-
-#include <stdio.h>
-
-/* For defaults, see the @initRtsFlagsDefaults@ routine. */
-
-struct GC_FLAGS {
- FILE *statsFile;
- nat giveStats;
-#define NO_GC_STATS 0
-#define COLLECT_GC_STATS 1
-#define ONELINE_GC_STATS 2
-#define SUMMARY_GC_STATS 3
-#define VERBOSE_GC_STATS 4
-
- nat maxStkSize; /* in *words* */
- nat initialStkSize; /* in *words* */
-
- nat maxHeapSize; /* in *blocks* */
- nat minAllocAreaSize; /* in *blocks* */
- nat minOldGenSize; /* in *blocks* */
- nat heapSizeSuggestion; /* in *blocks* */
- double oldGenFactor;
- double pcFreeHeap;
-
- nat generations;
- nat steps;
- rtsBool squeezeUpdFrames;
-
- rtsBool compact; /* True <=> "compact all the time" */
- double compactThreshold;
-
- rtsBool sweep; /* use "mostly mark-sweep" instead of copying
- * for the oldest generation */
- rtsBool ringBell;
- rtsBool frontpanel;
-
- int idleGCDelayTime; /* in milliseconds */
-
- StgWord heapBase; /* address to ask the OS for memory */
-};
-
-struct DEBUG_FLAGS {
- /* flags to control debugging output & extra checking in various subsystems */
- rtsBool scheduler; /* 's' */
- rtsBool interpreter; /* 'i' */
- rtsBool weak; /* 'w' */
- rtsBool gccafs; /* 'G' */
- rtsBool gc; /* 'g' */
- rtsBool block_alloc; /* 'b' */
- rtsBool sanity; /* 'S' warning: might be expensive! */
- rtsBool stable; /* 't' */
- rtsBool prof; /* 'p' */
- rtsBool eventlog; /* 'e' */
- rtsBool linker; /* 'l' the object linker */
- rtsBool apply; /* 'a' */
- rtsBool stm; /* 'm' */
- rtsBool squeeze; /* 'z' stack squeezing & lazy blackholing */
- rtsBool hpc; /* 'c' coverage */
- rtsBool timestamp; /* add timestamps to traces */
-};
-
-struct COST_CENTRE_FLAGS {
- unsigned int doCostCentres;
-# define COST_CENTRES_SUMMARY 1
-# define COST_CENTRES_VERBOSE 2 /* incl. serial time profile */
-# define COST_CENTRES_ALL 3
-# define COST_CENTRES_XML 4
-
- int profilerTicks; /* derived */
- int msecsPerTick; /* derived */
-};
-
-struct PROFILING_FLAGS {
- unsigned int doHeapProfile;
-# define NO_HEAP_PROFILING 0 /* N.B. Used as indexes into arrays */
-# define HEAP_BY_CCS 1
-# define HEAP_BY_MOD 2
-# define HEAP_BY_DESCR 4
-# define HEAP_BY_TYPE 5
-# define HEAP_BY_RETAINER 6
-# define HEAP_BY_LDV 7
-
-# define HEAP_BY_CLOSURE_TYPE 8
-
- nat profileInterval; /* delta between samples (in ms) */
- nat profileIntervalTicks; /* delta between samples (in 'ticks') */
- rtsBool includeTSOs;
-
-
- rtsBool showCCSOnException;
-
- nat maxRetainerSetSize;
-
- nat ccsLength;
-
- char* modSelector;
- char* descrSelector;
- char* typeSelector;
- char* ccSelector;
- char* ccsSelector;
- char* retainerSelector;
- char* bioSelector;
-
-};
-
-#ifdef EVENTLOG
-struct EVENTLOG_FLAGS {
- rtsBool doEventLogging;
-};
-#endif
-
-struct CONCURRENT_FLAGS {
- int ctxtSwitchTime; /* in milliseconds */
- int ctxtSwitchTicks; /* derived */
-};
-
-struct MISC_FLAGS {
- int tickInterval; /* in milliseconds */
- rtsBool install_signal_handlers;
- rtsBool machineReadable;
- StgWord linkerMemBase; /* address to ask the OS for memory
- * for the linker, NULL ==> off */
-};
-
-#ifdef THREADED_RTS
-struct PAR_FLAGS {
- nat nNodes; /* number of threads to run simultaneously */
- rtsBool migrate; /* migrate threads between capabilities */
- rtsBool wakeupMigrate; /* migrate a thread on wakeup */
- unsigned int maxLocalSparks;
- rtsBool parGcEnabled; /* enable parallel GC */
- rtsBool parGcGen; /* do parallel GC in this generation
- * and higher only */
- rtsBool parGcLoadBalancing; /* do load-balancing in parallel GC */
- rtsBool setAffinity; /* force thread affinity with CPUs */
-};
-#endif /* THREADED_RTS */
-
-struct TICKY_FLAGS {
- rtsBool showTickyStats;
- FILE *tickyFile;
-};
-
-#ifdef USE_PAPI
-#define MAX_PAPI_USER_EVENTS 8
-
-struct PAPI_FLAGS {
- nat eventType; /* The type of events to count */
- nat numUserEvents;
- char * userEvents[MAX_PAPI_USER_EVENTS];
-};
-
-#define PAPI_FLAG_CACHE_L1 1
-#define PAPI_FLAG_CACHE_L2 2
-#define PAPI_FLAG_BRANCH 3
-#define PAPI_FLAG_STALLS 4
-#define PAPI_FLAG_CB_EVENTS 5
-#define PAPI_USER_EVENTS 6
-
-#endif
-
-/* Put them together: */
-
-typedef struct _RTS_FLAGS {
- /* The first portion of RTS_FLAGS is invariant. */
- struct GC_FLAGS GcFlags;
- struct CONCURRENT_FLAGS ConcFlags;
- struct MISC_FLAGS MiscFlags;
- struct DEBUG_FLAGS DebugFlags;
- struct COST_CENTRE_FLAGS CcFlags;
- struct PROFILING_FLAGS ProfFlags;
-#ifdef EVENTLOG
- struct EVENTLOG_FLAGS EventLogFlags;
-#endif
- struct TICKY_FLAGS TickyFlags;
-
-#if defined(THREADED_RTS)
- struct PAR_FLAGS ParFlags;
-#endif
-#ifdef USE_PAPI
- struct PAPI_FLAGS PapiFlags;
-#endif
-} RTS_FLAGS;
-
-#ifdef COMPILING_RTS_MAIN
-extern DLLIMPORT RTS_FLAGS RtsFlags;
-#elif IN_STG_CODE
-/* Hack because the C code generator can't generate '&label'. */
-extern RTS_FLAGS RtsFlags[];
-#else
-extern RTS_FLAGS RtsFlags;
-#endif
-
-/* Routines that operate-on/to-do-with RTS flags: */
-
-extern void initRtsFlagsDefaults(void);
-extern void setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]);
-extern void setProgName(char *argv[]);
-
-
-/*
- * The printf formats are here, so we are less likely to make
- * overly-long filenames (with disastrous results). No more than 128
- * chars, please!
- */
-
-#define STATS_FILENAME_MAXLEN 128
-
-#define GR_FILENAME_FMT "%0.124s.gr"
-#define GR_FILENAME_FMT_GUM "%0.120s.%03d.%s"
-#define HP_FILENAME_FMT "%0.124s.hp"
-#define LIFE_FILENAME_FMT "%0.122s.life"
-#define PROF_FILENAME_FMT "%0.122s.prof"
-#define PROF_FILENAME_FMT_GUM "%0.118s.%03d.prof"
-#define QP_FILENAME_FMT "%0.124s.qp"
-#define STAT_FILENAME_FMT "%0.122s.stat"
-#define TICKY_FILENAME_FMT "%0.121s.ticky"
-#define TIME_FILENAME_FMT "%0.122s.time"
-#define TIME_FILENAME_FMT_GUM "%0.118s.%03d.time"
-
-/* an "int" so as to match normal "argc" */
-/* Now defined in Stg.h (lib/std/cbits need these too.)
-extern int prog_argc;
-extern char **prog_argv;
-*/
-extern int rts_argc; /* ditto */
-extern char *rts_argv[];
-
-#endif /* RTSFLAGS_H */
+#warning RtsFlags.h is DEPRECATED; please just #include "Rts.h"
+#include "Rts.h"
diff --git a/includes/Stable.h b/includes/Stable.h
deleted file mode 100644
index 9752a534bb..0000000000
--- a/includes/Stable.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * (c) The GHC Team, 1998-2004
- *
- * Stable Pointers: A stable pointer is represented as an index into
- * the stable pointer table in the low BITS_PER_WORD-8 bits with a
- * weight in the upper 8 bits.
- *
- * SUP: StgStablePtr used to be a synonym for StgWord, but stable pointers
- * are guaranteed to be void* on the C-side, so we have to do some occasional
- * casting. Size is not a matter, because StgWord is always the same size as
- * a void*.
- *
- * ---------------------------------------------------------------------------*/
-
-#ifndef STABLE_H
-#define STABLE_H
-
-/* -----------------------------------------------------------------------------
- External C Interface
- -------------------------------------------------------------------------- */
-
-EXTERN_INLINE StgPtr deRefStablePtr(StgStablePtr stable_ptr);
-extern void freeStablePtr(StgStablePtr sp);
-extern StgStablePtr splitStablePtr(StgStablePtr sp);
-extern StgStablePtr getStablePtr(StgPtr p);
-
-/* -----------------------------------------------------------------------------
- PRIVATE from here.
- -------------------------------------------------------------------------- */
-
-typedef struct {
- StgPtr addr; /* Haskell object, free list, or NULL */
- StgPtr old; /* old Haskell object, used during GC */
- StgWord ref; /* used for reference counting */
- StgClosure *sn_obj; /* the StableName object (or NULL) */
-} snEntry;
-
-extern DLL_IMPORT_RTS snEntry *stable_ptr_table;
-
-extern void freeStablePtr(StgStablePtr sp);
-
-EXTERN_INLINE
-StgPtr deRefStablePtr(StgStablePtr sp)
-{
- ASSERT(stable_ptr_table[(StgWord)sp].ref > 0);
- return stable_ptr_table[(StgWord)sp].addr;
-}
-
-extern void initStablePtrTable ( void );
-extern void exitStablePtrTable ( void );
-extern void enlargeStablePtrTable ( void );
-extern StgWord lookupStableName ( StgPtr p );
-
-extern void markStablePtrTable ( evac_fn evac, void *user );
-extern void threadStablePtrTable ( evac_fn evac, void *user );
-extern void gcStablePtrTable ( void );
-extern void updateStablePtrTable ( rtsBool full );
-
-extern void stablePtrPreGC ( void );
-extern void stablePtrPostGC ( void );
-
-#endif
diff --git a/includes/Stg.h b/includes/Stg.h
index 06a866256e..0344b70fd2 100644
--- a/includes/Stg.h
+++ b/includes/Stg.h
@@ -23,11 +23,16 @@
#ifndef STG_H
#define STG_H
-
-/* If we include "Stg.h" directly, we're in STG code, and we therefore
- * get all the global register variables, macros etc. that go along
- * with that. If "Stg.h" is included via "Rts.h", we're assumed to
- * be in vanilla C.
+/*
+ * If we are compiling a .hc file, then we want all the register
+ * variables. This is the what happens if you #include "Stg.h" first:
+ * we assume this is a .hc file, and set IN_STG_CODE==1, which later
+ * causes the register variables to be enabled in stg/Regs.h.
+ *
+ * If instead "Rts.h" is included first, then we are compiling a
+ * vanilla C file. Everything from Stg.h is provided, except that
+ * IN_STG_CODE is not defined, and the register variables will not be
+ * active.
*/
#ifndef IN_STG_CODE
# define IN_STG_CODE 1
@@ -47,7 +52,6 @@
/* Configuration */
#include "ghcconfig.h"
-#include "RtsConfig.h"
/* The code generator calls the math functions directly in .hc code.
NB. after configuration stuff above, because this sets #defines
@@ -59,7 +63,7 @@
-------------------------------------------------------------------------- */
/*
- * The C backend like to refer to labels by just mentioning their
+ * The C backend likes to refer to labels by just mentioning their
* names. Howevver, when a symbol is declared as a variable in C, the
* C compiler will implicitly dereference it when it occurs in source.
* So we must subvert this behaviour for .hc files by declaring
@@ -165,7 +169,7 @@
-------------------------------------------------------------------------- */
#include "MachDeps.h"
-#include "StgTypes.h"
+#include "stg/Types.h"
/* -----------------------------------------------------------------------------
Shorthand forms
@@ -174,24 +178,14 @@
typedef StgChar C_;
typedef StgWord W_;
typedef StgWord* P_;
-typedef P_* PP_;
typedef StgInt I_;
-typedef StgAddr A_;
-typedef const StgWord* D_;
-typedef StgFunPtr F_;
-typedef StgByteArray B_;
-typedef StgClosurePtr L_;
-
-typedef StgInt64 LI_;
-typedef StgWord64 LW_;
-
-#define IF_(f) static F_ GNUC3_ATTRIBUTE(used) f(void)
-#define FN_(f) F_ f(void)
-#define EF_(f) extern F_ f(void)
-
typedef StgWord StgWordArray[];
+
#define EI_(X) extern StgWordArray (X) GNU_ATTRIBUTE(aligned (8))
#define II_(X) static StgWordArray (X) GNU_ATTRIBUTE(aligned (8))
+#define IF_(f) static StgFunPtr GNUC3_ATTRIBUTE(used) f(void)
+#define FN_(f) StgFunPtr f(void)
+#define EF_(f) extern StgFunPtr f(void)
/* -----------------------------------------------------------------------------
Tail calls
@@ -200,27 +194,26 @@ typedef StgWord StgWordArray[];
to be before all procedures (inline & out-of-line).
-------------------------------------------------------------------------- */
-#include "TailCalls.h"
+#include "stg/TailCalls.h"
/* -----------------------------------------------------------------------------
Other Stg stuff...
-------------------------------------------------------------------------- */
-#include "StgDLL.h"
-#include "MachRegs.h"
-#include "Regs.h"
-
-#include "TickyCounters.h"
+#include "stg/DLL.h"
+#include "stg/MachRegs.h"
+#include "stg/Regs.h"
+#include "stg/Ticky.h"
#if IN_STG_CODE
/*
* This is included later for RTS sources, after definitions of
* StgInfoTable, StgClosure and so on.
*/
-#include "StgMiscClosures.h"
+#include "stg/MiscClosures.h"
#endif
-#include "SMP.h" // write_barrier() inline is required
+#include "stg/SMP.h" // write_barrier() inline is required
/* -----------------------------------------------------------------------------
Moving Floats and Doubles
@@ -342,7 +335,7 @@ INLINE_HEADER StgDouble PK_DBL(W_ p_src[])
In both cases the memory location might not be 64-bit aligned.
-------------------------------------------------------------------------- */
-#ifdef SUPPORT_LONG_LONGS
+#if SIZEOF_HSWORD == 4
typedef struct
{ StgWord dhi;
@@ -413,7 +406,7 @@ INLINE_HEADER StgInt64 PK_Int64(W_ p_src[])
return p_src[0];
}
-#endif
+#endif /* SIZEOF_HSWORD == 4 */
/* -----------------------------------------------------------------------------
Split markers
diff --git a/includes/Storage.h b/includes/Storage.h
deleted file mode 100644
index 5d3e7733cf..0000000000
--- a/includes/Storage.h
+++ /dev/null
@@ -1,583 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * (c) The GHC Team, 1998-2004
- *
- * External Storage Manger Interface
- *
- * ---------------------------------------------------------------------------*/
-
-#ifndef STORAGE_H
-#define STORAGE_H
-
-#include <stddef.h>
-#include "OSThreads.h"
-#include "SMP.h"
-
-/* -----------------------------------------------------------------------------
- * Generational GC
- *
- * We support an arbitrary number of generations, with an arbitrary number
- * of steps per generation. Notes (in no particular order):
- *
- * - all generations except the oldest should have two steps. This gives
- * objects a decent chance to age before being promoted, and in
- * particular will ensure that we don't end up with too many
- * thunks being updated in older generations.
- *
- * - the oldest generation has one step. There's no point in aging
- * objects in the oldest generation.
- *
- * - generation 0, step 0 (G0S0) is the allocation area. It is given
- * a fixed set of blocks during initialisation, and these blocks
- * are never freed.
- *
- * - during garbage collection, each step which is an evacuation
- * destination (i.e. all steps except G0S0) is allocated a to-space.
- * evacuated objects are allocated into the step's to-space until
- * GC is finished, when the original step's contents may be freed
- * and replaced by the to-space.
- *
- * - the mutable-list is per-generation (not per-step). G0 doesn't
- * have one (since every garbage collection collects at least G0).
- *
- * - block descriptors contain pointers to both the step and the
- * generation that the block belongs to, for convenience.
- *
- * - static objects are stored in per-generation lists. See GC.c for
- * details of how we collect CAFs in the generational scheme.
- *
- * - large objects are per-step, and are promoted in the same way
- * as small objects, except that we may allocate large objects into
- * generation 1 initially.
- *
- * ------------------------------------------------------------------------- */
-
-typedef struct step_ {
- unsigned int no; // step number in this generation
- unsigned int abs_no; // absolute step number
-
- struct generation_ * gen; // generation this step belongs to
- unsigned int gen_no; // generation number (cached)
-
- bdescr * blocks; // blocks in this step
- unsigned int n_blocks; // number of blocks
- unsigned int n_words; // number of words
-
- struct step_ * to; // destination step for live objects
-
- bdescr * large_objects; // large objects (doubly linked)
- unsigned int n_large_blocks; // no. of blocks used by large objs
-
- StgTSO * threads; // threads in this step
- // linked via global_link
-
- // ------------------------------------
- // Fields below are used during GC only
-
- // During GC, if we are collecting this step, blocks and n_blocks
- // are copied into the following two fields. After GC, these blocks
- // are freed.
-
-#if defined(THREADED_RTS)
- char pad[128]; // make sure the following is
- // on a separate cache line.
- SpinLock sync_large_objects; // lock for large_objects
- // and scavenged_large_objects
-#endif
-
- int mark; // mark (not copy)? (old gen only)
- int compact; // compact (not sweep)? (old gen only)
-
- bdescr * old_blocks; // bdescr of first from-space block
- unsigned int n_old_blocks; // number of blocks in from-space
- unsigned int live_estimate; // for sweeping: estimate of live data
-
- bdescr * part_blocks; // partially-full scanned blocks
- unsigned int n_part_blocks; // count of above
-
- bdescr * scavenged_large_objects; // live large objs after GC (d-link)
- unsigned int n_scavenged_large_blocks; // size (not count) of above
-
- bdescr * bitmap; // bitmap for compacting collection
-
- StgTSO * old_threads;
-
-} step;
-
-
-typedef struct generation_ {
- unsigned int no; // generation number
- step * steps; // steps
- unsigned int n_steps; // number of steps
- unsigned int max_blocks; // max blocks in step 0
- bdescr *mut_list; // mut objects in this gen (not G0)
-
- // stats information
- unsigned int collections;
- unsigned int par_collections;
- unsigned int failed_promotions;
-
- // temporary use during GC:
- bdescr *saved_mut_list;
-} generation;
-
-extern generation * RTS_VAR(generations);
-
-extern generation * RTS_VAR(g0);
-extern step * RTS_VAR(g0s0);
-extern generation * RTS_VAR(oldest_gen);
-extern step * RTS_VAR(all_steps);
-extern nat RTS_VAR(total_steps);
-
-/* -----------------------------------------------------------------------------
- Initialisation / De-initialisation
- -------------------------------------------------------------------------- */
-
-extern void initStorage(void);
-extern void exitStorage(void);
-extern void freeStorage(void);
-
-/* -----------------------------------------------------------------------------
- Generic allocation
-
- StgPtr allocateInGen(generation *g, nat n)
- Allocates a chunk of contiguous store
- n words long in generation g,
- returning a pointer to the first word.
- Always succeeds.
-
- StgPtr allocate(nat n) Equaivalent to allocateInGen(g0)
-
- StgPtr allocateLocal(Capability *cap, nat n)
- Allocates memory from the nursery in
- the current Capability. This can be
- done without taking a global lock,
- unlike allocate().
-
- StgPtr allocatePinned(nat n) Allocates a chunk of contiguous store
- n words long, which is at a fixed
- address (won't be moved by GC).
- Returns a pointer to the first word.
- Always succeeds.
-
- NOTE: the GC can't in general handle
- pinned objects, so allocatePinned()
- can only be used for ByteArrays at the
- moment.
-
- Don't forget to TICK_ALLOC_XXX(...)
- after calling allocate or
- allocatePinned, for the
- benefit of the ticky-ticky profiler.
-
- rtsBool doYouWantToGC(void) Returns True if the storage manager is
- ready to perform a GC, False otherwise.
-
- lnat allocatedBytes(void) Returns the number of bytes allocated
- via allocate() since the last GC.
- Used in the reporting of statistics.
-
- -------------------------------------------------------------------------- */
-
-extern StgPtr allocate ( lnat n );
-extern StgPtr allocateInGen ( generation *g, lnat n );
-extern StgPtr allocateLocal ( Capability *cap, lnat n );
-extern StgPtr allocatePinned ( lnat n );
-extern lnat allocatedBytes ( void );
-
-extern bdescr * RTS_VAR(small_alloc_list);
-extern bdescr * RTS_VAR(large_alloc_list);
-extern bdescr * RTS_VAR(pinned_object_block);
-
-extern nat RTS_VAR(alloc_blocks);
-extern nat RTS_VAR(alloc_blocks_lim);
-
-INLINE_HEADER rtsBool
-doYouWantToGC( void )
-{
- return (alloc_blocks >= alloc_blocks_lim);
-}
-
-/* memory allocator for executable memory */
-extern void* allocateExec(unsigned int len, void **exec_addr);
-extern void freeExec (void *p);
-
-/* for splitting blocks groups in two */
-extern bdescr * splitLargeBlock (bdescr *bd, nat blocks);
-
-/* -----------------------------------------------------------------------------
- Performing Garbage Collection
-
- GarbageCollect(get_roots) Performs a garbage collection.
- 'get_roots' is called to find all the
- roots that the system knows about.
-
-
- -------------------------------------------------------------------------- */
-
-extern void GarbageCollect(rtsBool force_major_gc, nat gc_type, Capability *cap);
-
-/* -----------------------------------------------------------------------------
- Generational garbage collection support
-
- recordMutable(StgPtr p) Informs the garbage collector that a
- previously immutable object has
- become (permanently) mutable. Used
- by thawArray and similar.
-
- updateWithIndirection(p1,p2) Updates the object at p1 with an
- indirection pointing to p2. This is
- normally called for objects in an old
- generation (>0) when they are updated.
-
- updateWithPermIndirection(p1,p2) As above but uses a permanent indir.
-
- -------------------------------------------------------------------------- */
-
-/*
- * Storage manager mutex
- */
-#if defined(THREADED_RTS)
-extern Mutex sm_mutex;
-#endif
-
-#if defined(THREADED_RTS)
-#define ACQUIRE_SM_LOCK ACQUIRE_LOCK(&sm_mutex);
-#define RELEASE_SM_LOCK RELEASE_LOCK(&sm_mutex);
-#define ASSERT_SM_LOCK() ASSERT_LOCK_HELD(&sm_mutex);
-#else
-#define ACQUIRE_SM_LOCK
-#define RELEASE_SM_LOCK
-#define ASSERT_SM_LOCK()
-#endif
-
-#if !IN_STG_CODE
-
-INLINE_HEADER void
-recordMutableGen(StgClosure *p, nat gen_no)
-{
- bdescr *bd;
-
- bd = generations[gen_no].mut_list;
- if (bd->free >= bd->start + BLOCK_SIZE_W) {
- bdescr *new_bd;
- new_bd = allocBlock();
- new_bd->link = bd;
- bd = new_bd;
- generations[gen_no].mut_list = bd;
- }
- *bd->free++ = (StgWord)p;
-
-}
-
-INLINE_HEADER void
-recordMutableGenLock(StgClosure *p, nat gen_no)
-{
- ACQUIRE_SM_LOCK;
- recordMutableGen(p,gen_no);
- RELEASE_SM_LOCK;
-}
-
-INLINE_HEADER void
-recordMutable(StgClosure *p)
-{
- bdescr *bd;
- ASSERT(closure_MUTABLE(p));
- bd = Bdescr((P_)p);
- if (bd->gen_no > 0) recordMutableGen(p, bd->gen_no);
-}
-
-INLINE_HEADER void
-recordMutableLock(StgClosure *p)
-{
- ACQUIRE_SM_LOCK;
- recordMutable(p);
- RELEASE_SM_LOCK;
-}
-
-#endif // !IN_STG_CODE
-
-/* -----------------------------------------------------------------------------
- The CAF table - used to let us revert CAFs in GHCi
- -------------------------------------------------------------------------- */
-
-/* set to disable CAF garbage collection in GHCi. */
-/* (needed when dynamic libraries are used). */
-extern rtsBool keepCAFs;
-
-/* -----------------------------------------------------------------------------
- This is the write barrier for MUT_VARs, a.k.a. IORefs. A
- MUT_VAR_CLEAN object is not on the mutable list; a MUT_VAR_DIRTY
- is. When written to, a MUT_VAR_CLEAN turns into a MUT_VAR_DIRTY
- and is put on the mutable list.
- -------------------------------------------------------------------------- */
-
-void dirty_MUT_VAR(StgRegTable *reg, StgClosure *p);
-
-/* -----------------------------------------------------------------------------
- DEBUGGING predicates for pointers
-
- LOOKS_LIKE_INFO_PTR(p) returns False if p is definitely not an info ptr
- LOOKS_LIKE_CLOSURE_PTR(p) returns False if p is definitely not a closure ptr
-
- These macros are complete but not sound. That is, they might
- return false positives. Do not rely on them to distinguish info
- pointers from closure pointers, for example.
-
- We don't use address-space predicates these days, for portability
- reasons, and the fact that code/data can be scattered about the
- address space in a dynamically-linked environment. Our best option
- is to look at the alleged info table and see whether it seems to
- make sense...
- -------------------------------------------------------------------------- */
-
-INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR (StgWord p);
-INLINE_HEADER rtsBool LOOKS_LIKE_CLOSURE_PTR (void *p); // XXX StgClosure*
-
-/* -----------------------------------------------------------------------------
- Macros for calculating how big a closure will be (used during allocation)
- -------------------------------------------------------------------------- */
-
-INLINE_HEADER StgOffset PAP_sizeW ( nat n_args )
-{ return sizeofW(StgPAP) + n_args; }
-
-INLINE_HEADER StgOffset AP_sizeW ( nat n_args )
-{ return sizeofW(StgAP) + n_args; }
-
-INLINE_HEADER StgOffset AP_STACK_sizeW ( nat size )
-{ return sizeofW(StgAP_STACK) + size; }
-
-INLINE_HEADER StgOffset CONSTR_sizeW( nat p, nat np )
-{ return sizeofW(StgHeader) + p + np; }
-
-INLINE_HEADER StgOffset THUNK_SELECTOR_sizeW ( void )
-{ return sizeofW(StgSelector); }
-
-INLINE_HEADER StgOffset BLACKHOLE_sizeW ( void )
-{ return sizeofW(StgHeader)+MIN_PAYLOAD_SIZE; }
-
-/* --------------------------------------------------------------------------
- Sizes of closures
- ------------------------------------------------------------------------*/
-
-INLINE_HEADER StgOffset sizeW_fromITBL( const StgInfoTable* itbl )
-{ return sizeofW(StgClosure)
- + sizeofW(StgPtr) * itbl->layout.payload.ptrs
- + sizeofW(StgWord) * itbl->layout.payload.nptrs; }
-
-INLINE_HEADER StgOffset thunk_sizeW_fromITBL( const StgInfoTable* itbl )
-{ return sizeofW(StgThunk)
- + sizeofW(StgPtr) * itbl->layout.payload.ptrs
- + sizeofW(StgWord) * itbl->layout.payload.nptrs; }
-
-INLINE_HEADER StgOffset ap_stack_sizeW( StgAP_STACK* x )
-{ return AP_STACK_sizeW(x->size); }
-
-INLINE_HEADER StgOffset ap_sizeW( StgAP* x )
-{ return AP_sizeW(x->n_args); }
-
-INLINE_HEADER StgOffset pap_sizeW( StgPAP* x )
-{ return PAP_sizeW(x->n_args); }
-
-INLINE_HEADER StgOffset arr_words_sizeW( StgArrWords* x )
-{ return sizeofW(StgArrWords) + x->words; }
-
-INLINE_HEADER StgOffset mut_arr_ptrs_sizeW( StgMutArrPtrs* x )
-{ return sizeofW(StgMutArrPtrs) + x->ptrs; }
-
-INLINE_HEADER StgWord tso_sizeW ( StgTSO *tso )
-{ return TSO_STRUCT_SIZEW + tso->stack_size; }
-
-INLINE_HEADER StgWord bco_sizeW ( StgBCO *bco )
-{ return bco->size; }
-
-INLINE_HEADER nat
-closure_sizeW_ (StgClosure *p, StgInfoTable *info)
-{
- switch (info->type) {
- case THUNK_0_1:
- case THUNK_1_0:
- return sizeofW(StgThunk) + 1;
- case FUN_0_1:
- case CONSTR_0_1:
- case FUN_1_0:
- case CONSTR_1_0:
- return sizeofW(StgHeader) + 1;
- case THUNK_0_2:
- case THUNK_1_1:
- case THUNK_2_0:
- return sizeofW(StgThunk) + 2;
- case FUN_0_2:
- case CONSTR_0_2:
- case FUN_1_1:
- case CONSTR_1_1:
- case FUN_2_0:
- case CONSTR_2_0:
- return sizeofW(StgHeader) + 2;
- case THUNK:
- return thunk_sizeW_fromITBL(info);
- case THUNK_SELECTOR:
- return THUNK_SELECTOR_sizeW();
- case AP_STACK:
- return ap_stack_sizeW((StgAP_STACK *)p);
- case AP:
- return ap_sizeW((StgAP *)p);
- case PAP:
- return pap_sizeW((StgPAP *)p);
- case IND:
- case IND_PERM:
- case IND_OLDGEN:
- case IND_OLDGEN_PERM:
- return sizeofW(StgInd);
- case ARR_WORDS:
- return arr_words_sizeW((StgArrWords *)p);
- case MUT_ARR_PTRS_CLEAN:
- case MUT_ARR_PTRS_DIRTY:
- case MUT_ARR_PTRS_FROZEN:
- case MUT_ARR_PTRS_FROZEN0:
- return mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
- case TSO:
- return tso_sizeW((StgTSO *)p);
- case BCO:
- return bco_sizeW((StgBCO *)p);
- case TVAR_WATCH_QUEUE:
- return sizeofW(StgTVarWatchQueue);
- case TVAR:
- return sizeofW(StgTVar);
- case TREC_CHUNK:
- return sizeofW(StgTRecChunk);
- case TREC_HEADER:
- return sizeofW(StgTRecHeader);
- case ATOMIC_INVARIANT:
- return sizeofW(StgAtomicInvariant);
- case INVARIANT_CHECK_QUEUE:
- return sizeofW(StgInvariantCheckQueue);
- default:
- return sizeW_fromITBL(info);
- }
-}
-
-// The definitive way to find the size, in words, of a heap-allocated closure
-INLINE_HEADER nat
-closure_sizeW (StgClosure *p)
-{
- return closure_sizeW_(p, get_itbl(p));
-}
-
-/* -----------------------------------------------------------------------------
- Sizes of stack frames
- -------------------------------------------------------------------------- */
-
-INLINE_HEADER StgWord stack_frame_sizeW( StgClosure *frame )
-{
- StgRetInfoTable *info;
-
- info = get_ret_itbl(frame);
- switch (info->i.type) {
-
- case RET_DYN:
- {
- StgRetDyn *dyn = (StgRetDyn *)frame;
- return sizeofW(StgRetDyn) + RET_DYN_BITMAP_SIZE +
- RET_DYN_NONPTR_REGS_SIZE +
- RET_DYN_PTRS(dyn->liveness) + RET_DYN_NONPTRS(dyn->liveness);
- }
-
- case RET_FUN:
- return sizeofW(StgRetFun) + ((StgRetFun *)frame)->size;
-
- case RET_BIG:
- return 1 + GET_LARGE_BITMAP(&info->i)->size;
-
- case RET_BCO:
- return 2 + BCO_BITMAP_SIZE((StgBCO *)((P_)frame)[1]);
-
- default:
- return 1 + BITMAP_SIZE(info->i.layout.bitmap);
- }
-}
-
-/* -----------------------------------------------------------------------------
- Nursery manipulation
- -------------------------------------------------------------------------- */
-
-extern void allocNurseries ( void );
-extern void resetNurseries ( void );
-extern void resizeNurseries ( nat blocks );
-extern void resizeNurseriesFixed ( nat blocks );
-extern lnat countNurseryBlocks ( void );
-
-
-/* -----------------------------------------------------------------------------
- Functions from GC.c
- -------------------------------------------------------------------------- */
-
-typedef void (*evac_fn)(void *user, StgClosure **root);
-
-extern void threadPaused ( Capability *cap, StgTSO * );
-extern StgClosure * isAlive ( StgClosure *p );
-extern void markCAFs ( evac_fn evac, void *user );
-extern void GetRoots ( evac_fn evac, void *user );
-
-/* -----------------------------------------------------------------------------
- Stats 'n' DEBUG stuff
- -------------------------------------------------------------------------- */
-
-extern ullong RTS_VAR(total_allocated);
-
-extern lnat calcAllocated ( void );
-extern lnat calcLiveBlocks ( void );
-extern lnat calcLiveWords ( void );
-extern lnat countOccupied ( bdescr *bd );
-extern lnat calcNeeded ( void );
-
-#if defined(DEBUG)
-extern void memInventory(rtsBool show);
-extern void checkSanity(void);
-extern nat countBlocks(bdescr *);
-extern void checkNurserySanity( step *stp );
-#endif
-
-#if defined(DEBUG)
-void printMutOnceList(generation *gen);
-void printMutableList(generation *gen);
-#endif
-
-/* ----------------------------------------------------------------------------
- Storage manager internal APIs and globals
- ------------------------------------------------------------------------- */
-
-#define END_OF_STATIC_LIST stgCast(StgClosure*,1)
-
-extern void newDynCAF(StgClosure *);
-
-extern void move_TSO(StgTSO *src, StgTSO *dest);
-extern StgTSO *relocate_stack(StgTSO *dest, ptrdiff_t diff);
-
-extern StgWeak * RTS_VAR(old_weak_ptr_list);
-extern StgWeak * RTS_VAR(weak_ptr_list);
-extern StgClosure * RTS_VAR(caf_list);
-extern StgClosure * RTS_VAR(revertible_caf_list);
-extern StgTSO * RTS_VAR(resurrected_threads);
-
-#define IS_FORWARDING_PTR(p) ((((StgWord)p) & 1) != 0)
-#define MK_FORWARDING_PTR(p) (((StgWord)p) | 1)
-#define UN_FORWARDING_PTR(p) (((StgWord)p) - 1)
-
-INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR_NOT_NULL (StgWord p)
-{
- StgInfoTable *info = INFO_PTR_TO_STRUCT(p);
- return info->type != INVALID_OBJECT && info->type < N_CLOSURE_TYPES;
-}
-
-INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR (StgWord p)
-{
- return p && (IS_FORWARDING_PTR(p) || LOOKS_LIKE_INFO_PTR_NOT_NULL(p));
-}
-
-INLINE_HEADER rtsBool LOOKS_LIKE_CLOSURE_PTR (void *p)
-{
- return LOOKS_LIKE_INFO_PTR((StgWord)(UNTAG_CLOSURE((StgClosure *)(p)))->header.info);
-}
-
-#endif /* STORAGE_H */
diff --git a/includes/config.h b/includes/config.h
deleted file mode 100644
index 66e2ade637..0000000000
--- a/includes/config.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __CONFIG_H__
-#define __CONFIG_H__
-
-#warning config.h is deprecated; please use ghcconfig.h instead
-#include "ghcconfig.h"
-
-#endif
diff --git a/includes/ghc.mk b/includes/ghc.mk
index a266bf4c6a..50107eda37 100644
--- a/includes/ghc.mk
+++ b/includes/ghc.mk
@@ -33,7 +33,7 @@ ifeq "$(GhcEnableTablesNextToCode) $(GhcUnregisterised)" "YES NO"
includes_CC_OPTS += -DTABLES_NEXT_TO_CODE
endif
-includes_CC_OPTS += -Iincludes -Irts -Irts/parallel
+includes_CC_OPTS += -Iincludes -Irts
ifneq "$(GhcWithSMP)" "YES"
includes_CC_OPTS += -DNOSMP
@@ -129,7 +129,7 @@ includes_dist-derivedconstants_PROG = mkDerivedConstants$(exeext)
$(eval $(call build-prog,includes,dist-derivedconstants,0))
-$(includes_dist-derivedconstants_depfile) : $(includes_H_CONFIG) $(includes_H_PLATFORM)
+$(includes_dist-derivedconstants_depfile) : $(includes_H_CONFIG) $(includes_H_PLATFORM) $(wildcard includes/*.h) $(wildcard rts/*.h)
includes/dist-derivedconstants/build/mkDerivedConstants.o : $(includes_H_CONFIG) $(includes_H_PLATFORM)
ifneq "$(BINDIST)" "YES"
@@ -159,7 +159,7 @@ includes_dist-ghcconstants_CC_OPTS = -DGEN_HASKELL
$(eval $(call build-prog,includes,dist-ghcconstants,0))
ifneq "$(BINDIST)" "YES"
-$(includes_dist-ghcconstants_depfile) : $(includes_H_CONFIG) $(includes_H_PLATFORM)
+$(includes_dist-ghcconstants_depfile) : $(includes_H_CONFIG) $(includes_H_PLATFORM) $(wildcard includes/*.h) $(wildcard rts/*.h)
includes/dist-ghcconstants/build/mkDerivedConstants.o : $(includes_H_CONFIG) $(includes_H_PLATFORM)
diff --git a/includes/ieee-flpt.h b/includes/ieee-flpt.h
deleted file mode 100644
index a1fce3a8da..0000000000
--- a/includes/ieee-flpt.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* this file is #included into both C (.c and .hc) and Haskell files */
-
- /* IEEE format floating-point */
-#define IEEE_FLOATING_POINT 1
-
- /* Radix of exponent representation */
-#ifndef FLT_RADIX
-# define FLT_RADIX 2
-#endif
-
- /* Number of base-FLT_RADIX digits in the significand of a float */
-#ifndef FLT_MANT_DIG
-# define FLT_MANT_DIG 24
-#endif
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#ifndef FLT_MIN_EXP
-# define FLT_MIN_EXP (-125)
-#endif
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#ifndef FLT_MAX_EXP
-# define FLT_MAX_EXP 128
-#endif
-
- /* Number of base-FLT_RADIX digits in the significand of a double */
-#ifndef DBL_MANT_DIG
-# define DBL_MANT_DIG 53
-#endif
- /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#ifndef DBL_MIN_EXP
-# define DBL_MIN_EXP (-1021)
-#endif
- /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#ifndef DBL_MAX_EXP
-# define DBL_MAX_EXP 1024
-#endif
diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c
index f1289f61f3..b38f3abe36 100644
--- a/includes/mkDerivedConstants.c
+++ b/includes/mkDerivedConstants.c
@@ -21,10 +21,8 @@
#define THREADED_RTS
#include "Rts.h"
-#include "RtsFlags.h"
-#include "Storage.h"
+
#include "Stable.h"
-#include "OSThreads.h"
#include "Capability.h"
#include <stdio.h>
diff --git a/includes/rts/Adjustor.h b/includes/rts/Adjustor.h
new file mode 100644
index 0000000000..71e15246c1
--- /dev/null
+++ b/includes/rts/Adjustor.h
@@ -0,0 +1,20 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2009
+ *
+ * Adjustor API
+ *
+ * -------------------------------------------------------------------------- */
+
+#ifndef RTS_ADJUSTOR_H
+#define RTS_ADJUSTOR_H
+
+/* Creating and destroying an adjustor thunk */
+void* createAdjustor (int cconv,
+ StgStablePtr hptr,
+ StgFunPtr wptr,
+ char *typeString);
+
+void freeHaskellFunctionPtr (void* ptr);
+
+#endif /* RTS_ADJUSTOR_H */
diff --git a/includes/Bytecodes.h b/includes/rts/Bytecodes.h
index 4aff907cfd..4aff907cfd 100644
--- a/includes/Bytecodes.h
+++ b/includes/rts/Bytecodes.h
diff --git a/includes/rts/Config.h b/includes/rts/Config.h
new file mode 100644
index 0000000000..ce332fa2a2
--- /dev/null
+++ b/includes/rts/Config.h
@@ -0,0 +1,36 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2004
+ *
+ * Rts settings.
+ *
+ * NOTE: assumes #include "ghcconfig.h"
+ *
+ * NB: THIS FILE IS INCLUDED IN NON-C CODE AND DATA! #defines only please.
+ * ---------------------------------------------------------------------------*/
+
+#ifndef RTS_CONFIG_H
+#define RTS_CONFIG_H
+
+#if defined(TICKY_TICKY) && defined(THREADED_RTS)
+#error TICKY_TICKY is incompatible with THREADED_RTS
+#endif
+
+/*
+ * Whether the runtime system will use libbfd for debugging purposes.
+ */
+#if defined(DEBUG) && defined(HAVE_BFD_H) && defined(HAVE_LIBBFD) && !defined(_WIN32)
+#define USING_LIBBFD 1
+#endif
+
+/* -----------------------------------------------------------------------------
+ Signals - supported on non-PAR versions of the runtime. See RtsSignals.h.
+ -------------------------------------------------------------------------- */
+
+#define RTS_USER_SIGNALS 1
+
+/* Profile spin locks */
+
+#define PROF_SPIN
+
+#endif /* RTS_CONFIG_H */
diff --git a/includes/Constants.h b/includes/rts/Constants.h
index 967a852496..bab45a362c 100644
--- a/includes/Constants.h
+++ b/includes/rts/Constants.h
@@ -14,8 +14,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef CONSTANTS_H
-#define CONSTANTS_H
+#ifndef RTS_CONSTANTS_H
+#define RTS_CONSTANTS_H
/* -----------------------------------------------------------------------------
Minimum closure sizes
@@ -287,4 +287,4 @@
#error RESERVED_STACK_WORDS may be wrong!
#endif
-#endif /* CONSTANTS_H */
+#endif /* RTS_CONSTANTS_H */
diff --git a/includes/EventLogFormat.h b/includes/rts/EventLogFormat.h
index b56b0b77e4..363c1ca1cf 100644
--- a/includes/EventLogFormat.h
+++ b/includes/rts/EventLogFormat.h
@@ -73,8 +73,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef EVENTLOGFORMAT_H
-#define EVENTLOGFORMAT_H
+#ifndef RTS_EVENTLOGFORMAT_H
+#define RTS_EVENTLOGFORMAT_H
/*
* Markers for begin/end of the Header.
@@ -140,4 +140,4 @@ typedef StgWord16 EventCapNo;
#endif
-#endif /* EVENTLOGFORMAT_H */
+#endif /* RTS_EVENTLOGFORMAT_H */
diff --git a/includes/FileLock.h b/includes/rts/FileLock.h
index 3fc1a81aec..9a35ecc581 100644
--- a/includes/FileLock.h
+++ b/includes/rts/FileLock.h
@@ -6,7 +6,10 @@
*
* ---------------------------------------------------------------------------*/
-void initFileLocking(void);
-void freeFileLocking(void);
+#ifndef RTS_FILELOCK_H
+#define RTS_FILELOCK_H
+
int lockFile(int fd, dev_t dev, ino_t ino, int for_writing);
int unlockFile(int fd);
+
+#endif /* RTS_FILELOCK_H */
diff --git a/includes/rts/Flags.h b/includes/rts/Flags.h
new file mode 100644
index 0000000000..3f3a0a952f
--- /dev/null
+++ b/includes/rts/Flags.h
@@ -0,0 +1,239 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-1999
+ *
+ * Datatypes that holds the command-line flag settings.
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef RTS_FLAGS_H
+#define RTS_FLAGS_H
+
+#include <stdio.h>
+
+/* For defaults, see the @initRtsFlagsDefaults@ routine. */
+
+struct GC_FLAGS {
+ FILE *statsFile;
+ nat giveStats;
+#define NO_GC_STATS 0
+#define COLLECT_GC_STATS 1
+#define ONELINE_GC_STATS 2
+#define SUMMARY_GC_STATS 3
+#define VERBOSE_GC_STATS 4
+
+ nat maxStkSize; /* in *words* */
+ nat initialStkSize; /* in *words* */
+
+ nat maxHeapSize; /* in *blocks* */
+ nat minAllocAreaSize; /* in *blocks* */
+ nat minOldGenSize; /* in *blocks* */
+ nat heapSizeSuggestion; /* in *blocks* */
+ double oldGenFactor;
+ double pcFreeHeap;
+
+ nat generations;
+ nat steps;
+ rtsBool squeezeUpdFrames;
+
+ rtsBool compact; /* True <=> "compact all the time" */
+ double compactThreshold;
+
+ rtsBool sweep; /* use "mostly mark-sweep" instead of copying
+ * for the oldest generation */
+ rtsBool ringBell;
+ rtsBool frontpanel;
+
+ int idleGCDelayTime; /* in milliseconds */
+
+ StgWord heapBase; /* address to ask the OS for memory */
+};
+
+struct DEBUG_FLAGS {
+ /* flags to control debugging output & extra checking in various subsystems */
+ rtsBool scheduler; /* 's' */
+ rtsBool interpreter; /* 'i' */
+ rtsBool weak; /* 'w' */
+ rtsBool gccafs; /* 'G' */
+ rtsBool gc; /* 'g' */
+ rtsBool block_alloc; /* 'b' */
+ rtsBool sanity; /* 'S' warning: might be expensive! */
+ rtsBool stable; /* 't' */
+ rtsBool prof; /* 'p' */
+ rtsBool eventlog; /* 'e' */
+ rtsBool linker; /* 'l' the object linker */
+ rtsBool apply; /* 'a' */
+ rtsBool stm; /* 'm' */
+ rtsBool squeeze; /* 'z' stack squeezing & lazy blackholing */
+ rtsBool hpc; /* 'c' coverage */
+ rtsBool timestamp; /* add timestamps to traces */
+};
+
+struct COST_CENTRE_FLAGS {
+ unsigned int doCostCentres;
+# define COST_CENTRES_SUMMARY 1
+# define COST_CENTRES_VERBOSE 2 /* incl. serial time profile */
+# define COST_CENTRES_ALL 3
+# define COST_CENTRES_XML 4
+
+ int profilerTicks; /* derived */
+ int msecsPerTick; /* derived */
+};
+
+struct PROFILING_FLAGS {
+ unsigned int doHeapProfile;
+# define NO_HEAP_PROFILING 0 /* N.B. Used as indexes into arrays */
+# define HEAP_BY_CCS 1
+# define HEAP_BY_MOD 2
+# define HEAP_BY_DESCR 4
+# define HEAP_BY_TYPE 5
+# define HEAP_BY_RETAINER 6
+# define HEAP_BY_LDV 7
+
+# define HEAP_BY_CLOSURE_TYPE 8
+
+ nat profileInterval; /* delta between samples (in ms) */
+ nat profileIntervalTicks; /* delta between samples (in 'ticks') */
+ rtsBool includeTSOs;
+
+
+ rtsBool showCCSOnException;
+
+ nat maxRetainerSetSize;
+
+ nat ccsLength;
+
+ char* modSelector;
+ char* descrSelector;
+ char* typeSelector;
+ char* ccSelector;
+ char* ccsSelector;
+ char* retainerSelector;
+ char* bioSelector;
+
+};
+
+#ifdef EVENTLOG
+struct EVENTLOG_FLAGS {
+ rtsBool doEventLogging;
+};
+#endif
+
+struct CONCURRENT_FLAGS {
+ int ctxtSwitchTime; /* in milliseconds */
+ int ctxtSwitchTicks; /* derived */
+};
+
+struct MISC_FLAGS {
+ int tickInterval; /* in milliseconds */
+ rtsBool install_signal_handlers;
+ rtsBool machineReadable;
+ StgWord linkerMemBase; /* address to ask the OS for memory
+ * for the linker, NULL ==> off */
+};
+
+#ifdef THREADED_RTS
+struct PAR_FLAGS {
+ nat nNodes; /* number of threads to run simultaneously */
+ rtsBool migrate; /* migrate threads between capabilities */
+ rtsBool wakeupMigrate; /* migrate a thread on wakeup */
+ unsigned int maxLocalSparks;
+ rtsBool parGcEnabled; /* enable parallel GC */
+ rtsBool parGcGen; /* do parallel GC in this generation
+ * and higher only */
+ rtsBool parGcLoadBalancing; /* do load-balancing in parallel GC */
+ rtsBool setAffinity; /* force thread affinity with CPUs */
+};
+#endif /* THREADED_RTS */
+
+struct TICKY_FLAGS {
+ rtsBool showTickyStats;
+ FILE *tickyFile;
+};
+
+#ifdef USE_PAPI
+#define MAX_PAPI_USER_EVENTS 8
+
+struct PAPI_FLAGS {
+ nat eventType; /* The type of events to count */
+ nat numUserEvents;
+ char * userEvents[MAX_PAPI_USER_EVENTS];
+};
+
+#define PAPI_FLAG_CACHE_L1 1
+#define PAPI_FLAG_CACHE_L2 2
+#define PAPI_FLAG_BRANCH 3
+#define PAPI_FLAG_STALLS 4
+#define PAPI_FLAG_CB_EVENTS 5
+#define PAPI_USER_EVENTS 6
+
+#endif
+
+/* Put them together: */
+
+typedef struct _RTS_FLAGS {
+ /* The first portion of RTS_FLAGS is invariant. */
+ struct GC_FLAGS GcFlags;
+ struct CONCURRENT_FLAGS ConcFlags;
+ struct MISC_FLAGS MiscFlags;
+ struct DEBUG_FLAGS DebugFlags;
+ struct COST_CENTRE_FLAGS CcFlags;
+ struct PROFILING_FLAGS ProfFlags;
+#ifdef EVENTLOG
+ struct EVENTLOG_FLAGS EventLogFlags;
+#endif
+ struct TICKY_FLAGS TickyFlags;
+
+#if defined(THREADED_RTS)
+ struct PAR_FLAGS ParFlags;
+#endif
+#ifdef USE_PAPI
+ struct PAPI_FLAGS PapiFlags;
+#endif
+} RTS_FLAGS;
+
+#ifdef COMPILING_RTS_MAIN
+extern DLLIMPORT RTS_FLAGS RtsFlags;
+#elif IN_STG_CODE
+/* Hack because the C code generator can't generate '&label'. */
+extern RTS_FLAGS RtsFlags[];
+#else
+extern RTS_FLAGS RtsFlags;
+#endif
+
+/* Routines that operate-on/to-do-with RTS flags: */
+
+extern void initRtsFlagsDefaults(void);
+extern void setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]);
+extern void setProgName(char *argv[]);
+
+
+/*
+ * The printf formats are here, so we are less likely to make
+ * overly-long filenames (with disastrous results). No more than 128
+ * chars, please!
+ */
+
+#define STATS_FILENAME_MAXLEN 128
+
+#define GR_FILENAME_FMT "%0.124s.gr"
+#define GR_FILENAME_FMT_GUM "%0.120s.%03d.%s"
+#define HP_FILENAME_FMT "%0.124s.hp"
+#define LIFE_FILENAME_FMT "%0.122s.life"
+#define PROF_FILENAME_FMT "%0.122s.prof"
+#define PROF_FILENAME_FMT_GUM "%0.118s.%03d.prof"
+#define QP_FILENAME_FMT "%0.124s.qp"
+#define STAT_FILENAME_FMT "%0.122s.stat"
+#define TICKY_FILENAME_FMT "%0.121s.ticky"
+#define TIME_FILENAME_FMT "%0.122s.time"
+#define TIME_FILENAME_FMT_GUM "%0.118s.%03d.time"
+
+/* an "int" so as to match normal "argc" */
+/* Now defined in Stg.h (lib/std/cbits need these too.)
+extern int prog_argc;
+extern char **prog_argv;
+*/
+extern int rts_argc; /* ditto */
+extern char *rts_argv[];
+
+#endif /* RTS_FLAGS_H */
diff --git a/includes/RtsGlobals.h b/includes/rts/Globals.h
index 476f112e17..71846e75a1 100644
--- a/includes/RtsGlobals.h
+++ b/includes/rts/Globals.h
@@ -9,13 +9,10 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef RTSGLOBALS_H
-#define RTSGLOBALS_H
-
-void initGlobalStore(void);
-void exitGlobalStore(void);
+#ifndef RTS_GLOBALS_H
+#define RTS_GLOBALS_H
StgStablePtr getOrSetTypeableStore(StgStablePtr value);
StgStablePtr getOrSetSignalHandlerStore(StgStablePtr value);
-#endif
+#endif /* RTS_GLOBALS_H */
diff --git a/includes/Hooks.h b/includes/rts/Hooks.h
index e281c89ab9..4fe50b4b9f 100644
--- a/includes/Hooks.h
+++ b/includes/rts/Hooks.h
@@ -6,6 +6,9 @@
*
* ---------------------------------------------------------------------------*/
+#ifndef RTS_HOOKS_H
+#define RTS_HOOKS_H
+
extern char *ghc_rts_opts;
extern void OnExitHook (void);
@@ -14,3 +17,5 @@ extern void StackOverflowHook (unsigned long stack_size);
extern void OutOfHeapHook (unsigned long request_size, unsigned long heap_size);
extern void MallocFailHook (unsigned long request_size /* in bytes */, char *msg);
extern void defaultsHook (void);
+
+#endif /* RTS_HOOKS_H */
diff --git a/includes/rts/Hpc.h b/includes/rts/Hpc.h
new file mode 100644
index 0000000000..c966e32cd9
--- /dev/null
+++ b/includes/rts/Hpc.h
@@ -0,0 +1,32 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 2008-2009
+ *
+ * Haskell Program Coverage
+ *
+ * -------------------------------------------------------------------------- */
+
+#ifndef RTS_HPC_H
+#define RTS_HPC_H
+
+// Simple linked list of modules
+typedef struct _HpcModuleInfo {
+ char *modName; // name of module
+ StgWord32 tickCount; // number of ticks
+ StgWord32 tickOffset; // offset into a single large .tix Array
+ StgWord32 hashNo; // Hash number for this module's mix info
+ StgWord64 *tixArr; // tix Array; local for this module
+ struct _HpcModuleInfo *next;
+} HpcModuleInfo;
+
+int hs_hpc_module (char *modName,
+ StgWord32 modCount,
+ StgWord32 modHashNo,
+ StgWord64 *tixArr);
+
+HpcModuleInfo * hs_hpc_rootModule (void);
+
+void startupHpc(void);
+void exitHpc(void);
+
+#endif /* RTS_HPC_H */
diff --git a/includes/rts/IOManager.h b/includes/rts/IOManager.h
new file mode 100644
index 0000000000..1c269ada6d
--- /dev/null
+++ b/includes/rts/IOManager.h
@@ -0,0 +1,39 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2009
+ *
+ * IO Manager functionality in the RTS
+ *
+ * -------------------------------------------------------------------------- */
+
+#ifndef RTS_IOMANAGER_H
+#define RTS_IOMANAGER_H
+
+#if defined(mingw32_HOST_OS)
+
+int rts_InstallConsoleEvent ( int action, StgStablePtr *handler );
+void rts_ConsoleHandlerDone ( int ev );
+extern StgInt console_handler;
+
+void * getIOManagerEvent (void);
+HsWord32 readIOManagerEvent (void);
+void sendIOManagerEvent (HsWord32 event);
+
+#else
+
+void setIOManagerPipe (int fd);
+
+#endif
+
+//
+// Communicating with the IO manager thread (see GHC.Conc).
+// Posix implementation in posix/Signals.c
+// Win32 implementation in win32/ThrIOManager.c
+//
+#if defined(THREADED_RTS)
+void ioManagerWakeup (void);
+void ioManagerDie (void);
+void ioManagerStart (void);
+#endif
+
+#endif /* RTS_IOMANAGER_H */
diff --git a/includes/Linker.h b/includes/rts/Linker.h
index 053d411153..df74e7eeb8 100644
--- a/includes/Linker.h
+++ b/includes/rts/Linker.h
@@ -6,8 +6,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef LINKER_H
-#define LINKER_H
+#ifndef RTS_LINKER_H
+#define RTS_LINKER_H
/* initialize the object linker */
void initLinker( void );
@@ -33,6 +33,4 @@ HsInt resolveObjs( void );
/* load a dynamic library */
const char *addDLL( char* dll_name );
-extern void markRootPtrTable(void (*)(StgClosure **));
-
-#endif /* LINKER_H */
+#endif /* RTS_LINKER_H */
diff --git a/includes/RtsMessages.h b/includes/rts/Messages.h
index 79c48d3b98..e01eff47cf 100644
--- a/includes/RtsMessages.h
+++ b/includes/rts/Messages.h
@@ -9,8 +9,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef RTSMESSAGES_H
-#define RTSMESSAGES_H
+#ifndef RTS_MESSAGES_H
+#define RTS_MESSAGES_H
#include <stdarg.h>
@@ -26,14 +26,15 @@
* barf() invokes (*fatalInternalErrorFn)(). This function is not
* expected to return.
*/
-extern void barf(const char *s, ...)
+void barf(const char *s, ...)
GNUC3_ATTRIBUTE(__noreturn__);
-extern void vbarf(const char *s, va_list ap)
+void vbarf(const char *s, va_list ap)
GNUC3_ATTRIBUTE(__noreturn__);
-extern void _assertFail(const char *filename, unsigned int linenum)
- GNUC3_ATTRIBUTE(__noreturn__);
+// declared in Rts.h:
+// extern void _assertFail(const char *filename, unsigned int linenum)
+// GNUC3_ATTRIBUTE(__noreturn__);
/*
* An error condition which is caused by and/or can be corrected by
@@ -41,10 +42,10 @@ extern void _assertFail(const char *filename, unsigned int linenum)
*
* errorBelch() invokes (*errorMsgFn)().
*/
-extern void errorBelch(const char *s, ...)
+void errorBelch(const char *s, ...)
GNUC3_ATTRIBUTE(format (printf, 1, 2));
-extern void verrorBelch(const char *s, va_list ap);
+void verrorBelch(const char *s, va_list ap);
/*
* An error condition which is caused by and/or can be corrected by
@@ -55,10 +56,10 @@ extern void verrorBelch(const char *s, va_list ap);
*
* sysErrorBelch() invokes (*sysErrorMsgFn)().
*/
-extern void sysErrorBelch(const char *s, ...)
+void sysErrorBelch(const char *s, ...)
GNUC3_ATTRIBUTE(format (printf, 1, 2));
-extern void vsysErrorBelch(const char *s, va_list ap);
+void vsysErrorBelch(const char *s, va_list ap);
/*
* A debugging message. Debugging messages are generated either as a
@@ -67,10 +68,10 @@ extern void vsysErrorBelch(const char *s, va_list ap);
*
* debugBelch() invokes (*debugMsgFn)().
*/
-extern void debugBelch(const char *s, ...)
+void debugBelch(const char *s, ...)
GNUC3_ATTRIBUTE(format (printf, 1, 2));
-extern void vdebugBelch(const char *s, va_list ap);
+void vdebugBelch(const char *s, va_list ap);
/* Hooks for redirecting message generation: */
@@ -88,4 +89,4 @@ extern RtsMsgFunction rtsDebugMsgFn;
extern RtsMsgFunction rtsErrorMsgFn;
extern RtsMsgFunction rtsSysErrorMsgFn;
-#endif /* RTSMESSAGES_H */
+#endif /* RTS_MESSAGES_H */
diff --git a/includes/OSThreads.h b/includes/rts/OSThreads.h
index f5c434fc28..2d32136379 100644
--- a/includes/OSThreads.h
+++ b/includes/rts/OSThreads.h
@@ -7,8 +7,8 @@
*
* --------------------------------------------------------------------------*/
-#ifndef __OSTHREADS_H__
-#define __OSTHREADS_H__
+#ifndef RTS_OSTHREADS_H
+#define RTS_OSTHREADS_H
#if defined(THREADED_RTS) /* to the end */
@@ -152,7 +152,7 @@ typedef HANDLE Mutex;
// General thread operations
//
extern OSThreadId osThreadId ( void );
-extern void shutdownThread ( void );
+extern void shutdownThread ( void ) GNUC3_ATTRIBUTE(__noreturn__);
extern void yieldThread ( void );
typedef void OSThreadProcAttr OSThreadProc(void *);
@@ -198,4 +198,12 @@ void setThreadAffinity (nat n, nat m);
#endif /* defined(THREADED_RTS) */
-#endif /* __OSTHREADS_H__ */
+//
+// Support for forkOS (defined regardless of THREADED_RTS, but does
+// nothing when !THREADED_RTS).
+//
+#ifndef CMINUSMINUS
+int forkOS_createThread ( HsStablePtr entry );
+#endif
+
+#endif /* RTS_OSTHREADS_H */
diff --git a/includes/rts/Parallel.h b/includes/rts/Parallel.h
new file mode 100644
index 0000000000..b6759819b1
--- /dev/null
+++ b/includes/rts/Parallel.h
@@ -0,0 +1,14 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2009
+ *
+ * Parallelism-related functionality
+ *
+ * -------------------------------------------------------------------------- */
+
+#ifndef RTS_PARALLEL_H
+#define RTS_PARALLEL_H
+
+StgInt newSpark (StgRegTable *reg, StgClosure *p);
+
+#endif /* RTS_PARALLEL_H */
diff --git a/includes/Signals.h b/includes/rts/Signals.h
index a5907bbee9..8d9e0fd4b7 100644
--- a/includes/Signals.h
+++ b/includes/rts/Signals.h
@@ -1,18 +1,21 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1998-2005
+ * (c) The GHC Team, 1998-2009
*
* RTS signal handling
*
* ---------------------------------------------------------------------------*/
-#ifndef SIGNALS_H
-#define SIGNALS_H
+#ifndef RTS_SIGNALS_H
+#define RTS_SIGNALS_H
+/* NB. #included in Haskell code, no prototypes in here. */
+
+/* arguments to stg_sig_install() */
#define STG_SIG_DFL (-1)
#define STG_SIG_IGN (-2)
#define STG_SIG_ERR (-3)
#define STG_SIG_HAN (-4)
#define STG_SIG_RST (-5)
-#endif /* SIGNALS_H */
+#endif /* RTS_SIGNALS_H */
diff --git a/includes/SpinLock.h b/includes/rts/SpinLock.h
index 76fcd4e00e..ea992a3457 100644
--- a/includes/SpinLock.h
+++ b/includes/rts/SpinLock.h
@@ -14,8 +14,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef SPINLOCK_H
-#define SPINLOCK_H
+#ifndef RTS_SPINLOCK_H
+#define RTS_SPINLOCK_H
#if defined(THREADED_RTS)
@@ -101,5 +101,5 @@ INLINE_HEADER void initSpinLock(void * p STG_UNUSED)
#endif /* THREADED_RTS */
-#endif /* SPINLOCK_H */
+#endif /* RTS_SPINLOCK_H */
diff --git a/includes/rts/Stable.h b/includes/rts/Stable.h
new file mode 100644
index 0000000000..95a3f96156
--- /dev/null
+++ b/includes/rts/Stable.h
@@ -0,0 +1,35 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2004
+ *
+ * Stable Pointers
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef RTS_STABLE_H
+#define RTS_STABLE_H
+
+EXTERN_INLINE StgPtr deRefStablePtr (StgStablePtr stable_ptr);
+StgStablePtr getStablePtr (StgPtr p);
+
+/* -----------------------------------------------------------------------------
+ PRIVATE from here.
+ -------------------------------------------------------------------------- */
+
+typedef struct {
+ StgPtr addr; /* Haskell object, free list, or NULL */
+ StgPtr old; /* old Haskell object, used during GC */
+ StgWord ref; /* used for reference counting */
+ StgClosure *sn_obj; /* the StableName object (or NULL) */
+} snEntry;
+
+extern DLL_IMPORT_RTS snEntry *stable_ptr_table;
+
+EXTERN_INLINE
+StgPtr deRefStablePtr(StgStablePtr sp)
+{
+ ASSERT(stable_ptr_table[(StgWord)sp].ref > 0);
+ return stable_ptr_table[(StgWord)sp].addr;
+}
+
+#endif /* RTS_STABLE_H */
diff --git a/includes/SchedAPI.h b/includes/rts/Threads.h
index b11437bda2..06a0ed11dc 100644
--- a/includes/SchedAPI.h
+++ b/includes/rts/Threads.h
@@ -1,18 +1,18 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team 1998-2002
+ * (c) The GHC Team 1998-2009
*
* External API for the scheduler. For most uses, the functions in
* RtsAPI.h should be enough.
*
* ---------------------------------------------------------------------------*/
-#ifndef SCHEDAPI_H
-#define SCHEDAPI_H
+#ifndef RTS_THREADS_H
+#define RTS_THREADS_H
-/*
- * Creating threads
- */
+//
+// Creating threads
+//
StgTSO *createThread (Capability *cap, nat stack_size);
Capability *scheduleWaitThread (StgTSO *tso, /*out*/HaskellObj* ret,
@@ -24,4 +24,24 @@ StgTSO *createIOThread (Capability *cap, nat stack_size,
StgClosure *closure);
StgTSO *createStrictIOThread (Capability *cap, nat stack_size,
StgClosure *closure);
+
+// Suspending/resuming threads around foreign calls
+void * suspendThread (StgRegTable *);
+StgRegTable * resumeThread (void *);
+
+//
+// Thread operations from Threads.c
+//
+int cmp_thread (StgPtr tso1, StgPtr tso2);
+int rts_getThreadId (StgPtr tso);
+pid_t forkProcess (HsStablePtr *entry);
+HsBool rtsSupportsBoundThreads (void);
+
+// The number of Capabilities
+extern unsigned int n_capabilities;
+
+#if !IN_STG_CODE
+extern Capability MainCapability;
#endif
+
+#endif /* RTS_THREADS_H */
diff --git a/includes/rts/Timer.h b/includes/rts/Timer.h
new file mode 100644
index 0000000000..e3a5c2dc69
--- /dev/null
+++ b/includes/rts/Timer.h
@@ -0,0 +1,15 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1995-2006
+ *
+ * Interface to the RTS timer signal (uses OS-dependent Ticker.h underneath)
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef RTS_TIMER_H
+#define RTS_TIMER_H
+
+void startTimer (void);
+void stopTimer (void);
+
+#endif /* RTS_TIMER_H */
diff --git a/includes/RtsTypes.h b/includes/rts/Types.h
index 79bbf1fccf..6f399e083d 100644
--- a/includes/RtsTypes.h
+++ b/includes/rts/Types.h
@@ -35,10 +35,8 @@ typedef enum {
rtsTrue
} rtsBool;
-/*
- Types specific to the parallel runtime system.
-*/
-
-typedef ullong rtsTime;
+typedef struct StgClosure_ StgClosure;
+typedef struct StgInfoTable_ StgInfoTable;
+typedef struct StgTSO_ StgTSO;
#endif /* RTS_TYPES_H */
diff --git a/includes/StgProf.h b/includes/rts/prof/CCS.h
index 9b3ce69a9f..3512930b7b 100644
--- a/includes/StgProf.h
+++ b/includes/rts/prof/CCS.h
@@ -6,8 +6,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef STGPROF_H
-#define STGPROF_H
+#ifndef RTS_PROF_CCS_H
+#define RTS_PROF_CCS_H
/* -----------------------------------------------------------------------------
* Data Structures
@@ -234,5 +234,5 @@ extern CostCentreStack * RTS_VAR(CCS_LIST); /* registered CCS list */
#endif /* PROFILING */
-#endif /* STGPROF_H */
+#endif /* RTS_PROF_CCS_H */
diff --git a/includes/StgLdvProf.h b/includes/rts/prof/LDV.h
index 3c3df1c5fa..c51b10647e 100644
--- a/includes/StgLdvProf.h
+++ b/includes/rts/prof/LDV.h
@@ -6,8 +6,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef STGLDVPROF_H
-#define STGLDVPROF_H
+#ifndef RTS_PROF_LDV_H
+#define RTS_PROF_LDV_H
#ifdef PROFILING
@@ -42,4 +42,5 @@
#define LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(c) /* nothing */
#endif /* PROFILING */
+
#endif /* STGLDVPROF_H */
diff --git a/includes/Block.h b/includes/rts/storage/Block.h
index ec894da02e..849f99f430 100644
--- a/includes/Block.h
+++ b/includes/rts/storage/Block.h
@@ -6,8 +6,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef BLOCK_H
-#define BLOCK_H
+#ifndef RTS_STORAGE_BLOCK_H
+#define RTS_STORAGE_BLOCK_H
/* The actual block and megablock-size constants are defined in
* includes/Constants.h, all constants here are derived from these.
@@ -268,4 +268,4 @@ round_up_to_mblocks(StgWord words)
}
#endif /* !CMINUSMINUS */
-#endif /* BLOCK_H */
+#endif /* RTS_STORAGE_BLOCK_H */
diff --git a/includes/rts/storage/ClosureMacros.h b/includes/rts/storage/ClosureMacros.h
new file mode 100644
index 0000000000..458960f3f7
--- /dev/null
+++ b/includes/rts/storage/ClosureMacros.h
@@ -0,0 +1,395 @@
+/* ----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2004
+ *
+ * Macros for building and manipulating closures
+ *
+ * -------------------------------------------------------------------------- */
+
+#ifndef RTS_STORAGE_CLOSUREMACROS_H
+#define RTS_STORAGE_CLOSUREMACROS_H
+
+/* -----------------------------------------------------------------------------
+ Info tables are slammed up against the entry code, and the label
+ for the info table is at the *end* of the table itself. This
+ inline function adjusts an info pointer to point to the beginning
+ of the table, so we can use standard C structure indexing on it.
+
+ Note: this works for SRT info tables as long as you don't want to
+ access the SRT, since they are laid out the same with the SRT
+ pointer as the first word in the table.
+
+ NOTES ABOUT MANGLED C VS. MINI-INTERPRETER:
+
+ A couple of definitions:
+
+ "info pointer" The first word of the closure. Might point
+ to either the end or the beginning of the
+ info table, depending on whether we're using
+ the mini interpretter or not. GET_INFO(c)
+ retrieves the info pointer of a closure.
+
+ "info table" The info table structure associated with a
+ closure. This is always a pointer to the
+ beginning of the structure, so we can
+ use standard C structure indexing to pull out
+ the fields. get_itbl(c) returns a pointer to
+ the info table for closure c.
+
+ An address of the form xxxx_info points to the end of the info
+ table or the beginning of the info table depending on whether we're
+ mangling or not respectively. So,
+
+ c->header.info = xxx_info
+
+ makes absolute sense, whether mangling or not.
+
+ -------------------------------------------------------------------------- */
+
+#define SET_INFO(c,i) ((c)->header.info = (i))
+#define GET_INFO(c) ((c)->header.info)
+#define GET_ENTRY(c) (ENTRY_CODE(GET_INFO(c)))
+
+#define get_itbl(c) (INFO_PTR_TO_STRUCT((c)->header.info))
+#define get_ret_itbl(c) (RET_INFO_PTR_TO_STRUCT((c)->header.info))
+#define get_fun_itbl(c) (FUN_INFO_PTR_TO_STRUCT((c)->header.info))
+#define get_thunk_itbl(c) (THUNK_INFO_PTR_TO_STRUCT((c)->header.info))
+#define get_con_itbl(c) (CON_INFO_PTR_TO_STRUCT((c)->header.info))
+
+#define GET_TAG(con) (get_itbl(con)->srt_bitmap)
+
+#ifdef TABLES_NEXT_TO_CODE
+#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)(info) - 1)
+#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)(info) - 1)
+#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)(info) - 1)
+#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)(info) - 1)
+#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)(info) - 1)
+#define itbl_to_fun_itbl(i) ((StgFunInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
+#define itbl_to_ret_itbl(i) ((StgRetInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
+#define itbl_to_thunk_itbl(i) ((StgThunkInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
+#define itbl_to_con_itbl(i) ((StgConInfoTable *)(((StgInfoTable *)(i) + 1)) - 1)
+#else
+#define INFO_PTR_TO_STRUCT(info) ((StgInfoTable *)info)
+#define RET_INFO_PTR_TO_STRUCT(info) ((StgRetInfoTable *)info)
+#define FUN_INFO_PTR_TO_STRUCT(info) ((StgFunInfoTable *)info)
+#define THUNK_INFO_PTR_TO_STRUCT(info) ((StgThunkInfoTable *)info)
+#define CON_INFO_PTR_TO_STRUCT(info) ((StgConInfoTable *)info)
+#define itbl_to_fun_itbl(i) ((StgFunInfoTable *)(i))
+#define itbl_to_ret_itbl(i) ((StgRetInfoTable *)(i))
+#define itbl_to_thunk_itbl(i) ((StgThunkInfoTable *)(i))
+#define itbl_to_con_itbl(i) ((StgConInfoTable *)(i))
+#endif
+
+/* -----------------------------------------------------------------------------
+ Macros for building closures
+ -------------------------------------------------------------------------- */
+
+#ifdef PROFILING
+#ifdef DEBUG_RETAINER
+/*
+ For the sake of debugging, we take the safest way for the moment. Actually, this
+ is useful to check the sanity of heap before beginning retainer profiling.
+ flip is defined in RetainerProfile.c, and declared as extern in RetainerProfile.h.
+ Note: change those functions building Haskell objects from C datatypes, i.e.,
+ all rts_mk???() functions in RtsAPI.c, as well.
+ */
+#define SET_PROF_HDR(c,ccs_) \
+ ((c)->header.prof.ccs = ccs_, (c)->header.prof.hp.rs = (retainerSet *)((StgWord)NULL | flip))
+#else
+/*
+ For retainer profiling only: we do not have to set (c)->header.prof.hp.rs to
+ NULL | flip (flip is defined in RetainerProfile.c) because even when flip
+ is 1, rs is invalid and will be initialized to NULL | flip later when
+ the closure *c is visited.
+ */
+/*
+#define SET_PROF_HDR(c,ccs_) \
+ ((c)->header.prof.ccs = ccs_, (c)->header.prof.hp.rs = NULL)
+ */
+/*
+ The following macro works for both retainer profiling and LDV profiling:
+ for retainer profiling, ldvTime remains 0, so rs fields are initialized to 0.
+ See the invariants on ldvTime.
+ */
+#define SET_PROF_HDR(c,ccs_) \
+ ((c)->header.prof.ccs = ccs_, \
+ LDV_RECORD_CREATE((c)))
+#endif /* DEBUG_RETAINER */
+#else
+#define SET_PROF_HDR(c,ccs)
+#endif
+
+#define SET_HDR(c,_info,ccs) \
+ { \
+ (c)->header.info = _info; \
+ SET_PROF_HDR((StgClosure *)(c),ccs); \
+ }
+
+#define SET_ARR_HDR(c,info,costCentreStack,n_words) \
+ SET_HDR(c,info,costCentreStack); \
+ (c)->words = n_words;
+
+/* -----------------------------------------------------------------------------
+ How to get hold of the static link field for a static closure.
+ -------------------------------------------------------------------------- */
+
+/* These are hard-coded. */
+#define FUN_STATIC_LINK(p) (&(p)->payload[0])
+#define THUNK_STATIC_LINK(p) (&(p)->payload[1])
+#define IND_STATIC_LINK(p) (&(p)->payload[1])
+
+INLINE_HEADER StgClosure **
+STATIC_LINK(const StgInfoTable *info, StgClosure *p)
+{
+ switch (info->type) {
+ case THUNK_STATIC:
+ return THUNK_STATIC_LINK(p);
+ case FUN_STATIC:
+ return FUN_STATIC_LINK(p);
+ case IND_STATIC:
+ return IND_STATIC_LINK(p);
+ default:
+ return &(p)->payload[info->layout.payload.ptrs +
+ info->layout.payload.nptrs];
+ }
+}
+
+#define STATIC_LINK2(info,p) \
+ (*(StgClosure**)(&((p)->payload[info->layout.payload.ptrs + \
+ info->layout.payload.nptrs + 1])))
+
+/* -----------------------------------------------------------------------------
+ INTLIKE and CHARLIKE closures.
+ -------------------------------------------------------------------------- */
+
+#define CHARLIKE_CLOSURE(n) ((P_)&stg_CHARLIKE_closure[(n)-MIN_CHARLIKE])
+#define INTLIKE_CLOSURE(n) ((P_)&stg_INTLIKE_closure[(n)-MIN_INTLIKE])
+
+/* ----------------------------------------------------------------------------
+ Macros for untagging and retagging closure pointers
+ For more information look at the comments in Cmm.h
+ ------------------------------------------------------------------------- */
+
+static inline StgWord
+GET_CLOSURE_TAG(StgClosure * p)
+{
+ return (StgWord)p & TAG_MASK;
+}
+
+static inline StgClosure *
+UNTAG_CLOSURE(StgClosure * p)
+{
+ return (StgClosure*)((StgWord)p & ~TAG_MASK);
+}
+
+static inline StgClosure *
+TAG_CLOSURE(StgWord tag,StgClosure * p)
+{
+ return (StgClosure*)((StgWord)p | tag);
+}
+
+/* -----------------------------------------------------------------------------
+ Forwarding pointers
+ -------------------------------------------------------------------------- */
+
+#define IS_FORWARDING_PTR(p) ((((StgWord)p) & 1) != 0)
+#define MK_FORWARDING_PTR(p) (((StgWord)p) | 1)
+#define UN_FORWARDING_PTR(p) (((StgWord)p) - 1)
+
+/* -----------------------------------------------------------------------------
+ DEBUGGING predicates for pointers
+
+ LOOKS_LIKE_INFO_PTR(p) returns False if p is definitely not an info ptr
+ LOOKS_LIKE_CLOSURE_PTR(p) returns False if p is definitely not a closure ptr
+
+ These macros are complete but not sound. That is, they might
+ return false positives. Do not rely on them to distinguish info
+ pointers from closure pointers, for example.
+
+ We don't use address-space predicates these days, for portability
+ reasons, and the fact that code/data can be scattered about the
+ address space in a dynamically-linked environment. Our best option
+ is to look at the alleged info table and see whether it seems to
+ make sense...
+ -------------------------------------------------------------------------- */
+
+INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR_NOT_NULL (StgWord p)
+{
+ StgInfoTable *info = INFO_PTR_TO_STRUCT(p);
+ return info->type != INVALID_OBJECT && info->type < N_CLOSURE_TYPES;
+}
+
+INLINE_HEADER rtsBool LOOKS_LIKE_INFO_PTR (StgWord p)
+{
+ return p && (IS_FORWARDING_PTR(p) || LOOKS_LIKE_INFO_PTR_NOT_NULL(p));
+}
+
+INLINE_HEADER rtsBool LOOKS_LIKE_CLOSURE_PTR (void *p)
+{
+ return LOOKS_LIKE_INFO_PTR((StgWord)(UNTAG_CLOSURE((StgClosure *)(p)))->header.info);
+}
+
+/* -----------------------------------------------------------------------------
+ Macros for calculating the size of a closure
+ -------------------------------------------------------------------------- */
+
+INLINE_HEADER StgOffset PAP_sizeW ( nat n_args )
+{ return sizeofW(StgPAP) + n_args; }
+
+INLINE_HEADER StgOffset AP_sizeW ( nat n_args )
+{ return sizeofW(StgAP) + n_args; }
+
+INLINE_HEADER StgOffset AP_STACK_sizeW ( nat size )
+{ return sizeofW(StgAP_STACK) + size; }
+
+INLINE_HEADER StgOffset CONSTR_sizeW( nat p, nat np )
+{ return sizeofW(StgHeader) + p + np; }
+
+INLINE_HEADER StgOffset THUNK_SELECTOR_sizeW ( void )
+{ return sizeofW(StgSelector); }
+
+INLINE_HEADER StgOffset BLACKHOLE_sizeW ( void )
+{ return sizeofW(StgHeader)+MIN_PAYLOAD_SIZE; }
+
+/* --------------------------------------------------------------------------
+ Sizes of closures
+ ------------------------------------------------------------------------*/
+
+INLINE_HEADER StgOffset sizeW_fromITBL( const StgInfoTable* itbl )
+{ return sizeofW(StgClosure)
+ + sizeofW(StgPtr) * itbl->layout.payload.ptrs
+ + sizeofW(StgWord) * itbl->layout.payload.nptrs; }
+
+INLINE_HEADER StgOffset thunk_sizeW_fromITBL( const StgInfoTable* itbl )
+{ return sizeofW(StgThunk)
+ + sizeofW(StgPtr) * itbl->layout.payload.ptrs
+ + sizeofW(StgWord) * itbl->layout.payload.nptrs; }
+
+INLINE_HEADER StgOffset ap_stack_sizeW( StgAP_STACK* x )
+{ return AP_STACK_sizeW(x->size); }
+
+INLINE_HEADER StgOffset ap_sizeW( StgAP* x )
+{ return AP_sizeW(x->n_args); }
+
+INLINE_HEADER StgOffset pap_sizeW( StgPAP* x )
+{ return PAP_sizeW(x->n_args); }
+
+INLINE_HEADER StgOffset arr_words_sizeW( StgArrWords* x )
+{ return sizeofW(StgArrWords) + x->words; }
+
+INLINE_HEADER StgOffset mut_arr_ptrs_sizeW( StgMutArrPtrs* x )
+{ return sizeofW(StgMutArrPtrs) + x->ptrs; }
+
+INLINE_HEADER StgWord tso_sizeW ( StgTSO *tso )
+{ return TSO_STRUCT_SIZEW + tso->stack_size; }
+
+INLINE_HEADER StgWord bco_sizeW ( StgBCO *bco )
+{ return bco->size; }
+
+INLINE_HEADER nat
+closure_sizeW_ (StgClosure *p, StgInfoTable *info)
+{
+ switch (info->type) {
+ case THUNK_0_1:
+ case THUNK_1_0:
+ return sizeofW(StgThunk) + 1;
+ case FUN_0_1:
+ case CONSTR_0_1:
+ case FUN_1_0:
+ case CONSTR_1_0:
+ return sizeofW(StgHeader) + 1;
+ case THUNK_0_2:
+ case THUNK_1_1:
+ case THUNK_2_0:
+ return sizeofW(StgThunk) + 2;
+ case FUN_0_2:
+ case CONSTR_0_2:
+ case FUN_1_1:
+ case CONSTR_1_1:
+ case FUN_2_0:
+ case CONSTR_2_0:
+ return sizeofW(StgHeader) + 2;
+ case THUNK:
+ return thunk_sizeW_fromITBL(info);
+ case THUNK_SELECTOR:
+ return THUNK_SELECTOR_sizeW();
+ case AP_STACK:
+ return ap_stack_sizeW((StgAP_STACK *)p);
+ case AP:
+ return ap_sizeW((StgAP *)p);
+ case PAP:
+ return pap_sizeW((StgPAP *)p);
+ case IND:
+ case IND_PERM:
+ case IND_OLDGEN:
+ case IND_OLDGEN_PERM:
+ return sizeofW(StgInd);
+ case ARR_WORDS:
+ return arr_words_sizeW((StgArrWords *)p);
+ case MUT_ARR_PTRS_CLEAN:
+ case MUT_ARR_PTRS_DIRTY:
+ case MUT_ARR_PTRS_FROZEN:
+ case MUT_ARR_PTRS_FROZEN0:
+ return mut_arr_ptrs_sizeW((StgMutArrPtrs*)p);
+ case TSO:
+ return tso_sizeW((StgTSO *)p);
+ case BCO:
+ return bco_sizeW((StgBCO *)p);
+ case TVAR_WATCH_QUEUE:
+ return sizeofW(StgTVarWatchQueue);
+ case TVAR:
+ return sizeofW(StgTVar);
+ case TREC_CHUNK:
+ return sizeofW(StgTRecChunk);
+ case TREC_HEADER:
+ return sizeofW(StgTRecHeader);
+ case ATOMIC_INVARIANT:
+ return sizeofW(StgAtomicInvariant);
+ case INVARIANT_CHECK_QUEUE:
+ return sizeofW(StgInvariantCheckQueue);
+ default:
+ return sizeW_fromITBL(info);
+ }
+}
+
+// The definitive way to find the size, in words, of a heap-allocated closure
+INLINE_HEADER nat
+closure_sizeW (StgClosure *p)
+{
+ return closure_sizeW_(p, get_itbl(p));
+}
+
+/* -----------------------------------------------------------------------------
+ Sizes of stack frames
+ -------------------------------------------------------------------------- */
+
+INLINE_HEADER StgWord stack_frame_sizeW( StgClosure *frame )
+{
+ StgRetInfoTable *info;
+
+ info = get_ret_itbl(frame);
+ switch (info->i.type) {
+
+ case RET_DYN:
+ {
+ StgRetDyn *dyn = (StgRetDyn *)frame;
+ return sizeofW(StgRetDyn) + RET_DYN_BITMAP_SIZE +
+ RET_DYN_NONPTR_REGS_SIZE +
+ RET_DYN_PTRS(dyn->liveness) + RET_DYN_NONPTRS(dyn->liveness);
+ }
+
+ case RET_FUN:
+ return sizeofW(StgRetFun) + ((StgRetFun *)frame)->size;
+
+ case RET_BIG:
+ return 1 + GET_LARGE_BITMAP(&info->i)->size;
+
+ case RET_BCO:
+ return 2 + BCO_BITMAP_SIZE((StgBCO *)((P_)frame)[1]);
+
+ default:
+ return 1 + BITMAP_SIZE(info->i.layout.bitmap);
+ }
+}
+
+#endif /* RTS_STORAGE_CLOSUREMACROS_H */
diff --git a/includes/ClosureTypes.h b/includes/rts/storage/ClosureTypes.h
index 99bd3060ff..3415d423a3 100644
--- a/includes/ClosureTypes.h
+++ b/includes/rts/storage/ClosureTypes.h
@@ -7,8 +7,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef CLOSURETYPES_H
-#define CLOSURETYPES_H
+#ifndef RTS_STORAGE_CLOSURETYPES_H
+#define RTS_STORAGE_CLOSURETYPES_H
/*
* WARNING WARNING WARNING
@@ -93,4 +93,4 @@
#define WHITEHOLE 69
#define N_CLOSURE_TYPES 70
-#endif /* CLOSURETYPES_H */
+#endif /* RTS_STORAGE_CLOSURETYPES_H */
diff --git a/includes/Closures.h b/includes/rts/storage/Closures.h
index eb5d1ed89d..6e06e57f3c 100644
--- a/includes/Closures.h
+++ b/includes/rts/storage/Closures.h
@@ -6,8 +6,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef CLOSURES_H
-#define CLOSURES_H
+#ifndef RTS_STORAGE_CLOSURES_H
+#define RTS_STORAGE_CLOSURES_H
/*
* The Layout of a closure header depends on which kind of system we're
@@ -51,14 +51,14 @@ typedef struct {
-------------------------------------------------------------------------- */
typedef struct {
- const struct _StgInfoTable* info;
+ const StgInfoTable* info;
#ifdef PROFILING
StgProfHeader prof;
#endif
} StgHeader;
typedef struct {
- const struct _StgInfoTable* info;
+ const StgInfoTable* info;
#ifdef PROFILING
StgProfHeader prof;
#endif
@@ -77,10 +77,10 @@ typedef struct {
/* All closures follow the generic format */
-struct StgClosure_ {
+typedef struct StgClosure_ {
StgHeader header;
struct StgClosure_ *payload[FLEXIBLE_ARRAY];
-};
+} *StgClosurePtr; // StgClosure defined in Rts.h
typedef struct {
StgThunkHeader header;
@@ -124,7 +124,7 @@ typedef struct {
StgHeader header;
StgClosure *indirectee;
StgClosure *static_link;
- struct _StgInfoTable *saved_info;
+ StgInfoTable *saved_info;
} StgIndStatic;
typedef struct {
@@ -273,7 +273,7 @@ typedef struct {
-------------------------------------------------------------------------- */
typedef struct {
- const struct _StgInfoTable* info;
+ const StgInfoTable* info;
StgWord liveness;
StgWord ret_addr;
StgClosure * payload[FLEXIBLE_ARRAY];
@@ -287,7 +287,7 @@ typedef struct {
* The stack frame size is also cached in the frame for convenience.
*/
typedef struct {
- const struct _StgInfoTable* info;
+ const StgInfoTable* info;
StgWord size;
StgClosure * fun;
StgClosure * payload[FLEXIBLE_ARRAY];
@@ -414,4 +414,4 @@ typedef struct {
StgClosure *alt_code;
} StgCatchRetryFrame;
-#endif /* CLOSURES_H */
+#endif /* RTS_STORAGE_CLOSURES_H */
diff --git a/includes/StgFun.h b/includes/rts/storage/FunTypes.h
index e6f9b1fe0e..402c913bcd 100644
--- a/includes/StgFun.h
+++ b/includes/rts/storage/FunTypes.h
@@ -1,11 +1,13 @@
/* -----------------------------------------------------------------------------
+ *
* (c) The GHC Team, 2002
*
* Things for functions.
+ *
* ---------------------------------------------------------------------------*/
-#ifndef STGFUN_H
-#define STGFUN_H
+#ifndef RTS_STORAGE_FUNTYPES_H
+#define RTS_STORAGE_FUNTYPES_
/* generic - function comes with a small bitmap */
#define ARG_GEN 0
@@ -49,4 +51,4 @@
#define ARG_PPPPPPP 24
#define ARG_PPPPPPPP 25
-#endif /* STGFUN_H */
+#endif /* RTS_STORAGE_FUNTYPES_H */
diff --git a/includes/rts/storage/GC.h b/includes/rts/storage/GC.h
new file mode 100644
index 0000000000..df4ba9d153
--- /dev/null
+++ b/includes/rts/storage/GC.h
@@ -0,0 +1,204 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2004
+ *
+ * External Storage Manger Interface
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef RTS_STORAGE_GC_H
+#define RTS_STORAGE_GC_H
+
+#include <stddef.h>
+#include "rts/OSThreads.h"
+
+/* -----------------------------------------------------------------------------
+ * Generational GC
+ *
+ * We support an arbitrary number of generations, with an arbitrary number
+ * of steps per generation. Notes (in no particular order):
+ *
+ * - all generations except the oldest should have the same
+ * number of steps. Multiple steps gives objects a decent
+ * chance to age before being promoted, and helps ensure that
+ * we don't end up with too many thunks being updated in older
+ * generations.
+ *
+ * - the oldest generation has one step. There's no point in aging
+ * objects in the oldest generation.
+ *
+ * - generation 0, step 0 (G0S0) is the allocation area. It is given
+ * a fixed set of blocks during initialisation, and these blocks
+ * normally stay in G0S0. In parallel execution, each
+ * Capability has its own nursery.
+ *
+ * - during garbage collection, each step which is an evacuation
+ * destination (i.e. all steps except G0S0) is allocated a to-space.
+ * evacuated objects are allocated into the step's to-space until
+ * GC is finished, when the original step's contents may be freed
+ * and replaced by the to-space.
+ *
+ * - the mutable-list is per-generation (not per-step). G0 doesn't
+ * have one (since every garbage collection collects at least G0).
+ *
+ * - block descriptors contain pointers to both the step and the
+ * generation that the block belongs to, for convenience.
+ *
+ * - static objects are stored in per-generation lists. See GC.c for
+ * details of how we collect CAFs in the generational scheme.
+ *
+ * - large objects are per-step, and are promoted in the same way
+ * as small objects, except that we may allocate large objects into
+ * generation 1 initially.
+ *
+ * ------------------------------------------------------------------------- */
+
+typedef struct step_ {
+ unsigned int no; // step number in this generation
+ unsigned int abs_no; // absolute step number
+
+ struct generation_ * gen; // generation this step belongs to
+ unsigned int gen_no; // generation number (cached)
+
+ bdescr * blocks; // blocks in this step
+ unsigned int n_blocks; // number of blocks
+ unsigned int n_words; // number of words
+
+ struct step_ * to; // destination step for live objects
+
+ bdescr * large_objects; // large objects (doubly linked)
+ unsigned int n_large_blocks; // no. of blocks used by large objs
+
+ StgTSO * threads; // threads in this step
+ // linked via global_link
+
+ // ------------------------------------
+ // Fields below are used during GC only
+
+ // During GC, if we are collecting this step, blocks and n_blocks
+ // are copied into the following two fields. After GC, these blocks
+ // are freed.
+
+#if defined(THREADED_RTS)
+ char pad[128]; // make sure the following is
+ // on a separate cache line.
+ SpinLock sync_large_objects; // lock for large_objects
+ // and scavenged_large_objects
+#endif
+
+ int mark; // mark (not copy)? (old gen only)
+ int compact; // compact (not sweep)? (old gen only)
+
+ bdescr * old_blocks; // bdescr of first from-space block
+ unsigned int n_old_blocks; // number of blocks in from-space
+ unsigned int live_estimate; // for sweeping: estimate of live data
+
+ bdescr * part_blocks; // partially-full scanned blocks
+ unsigned int n_part_blocks; // count of above
+
+ bdescr * scavenged_large_objects; // live large objs after GC (d-link)
+ unsigned int n_scavenged_large_blocks; // size (not count) of above
+
+ bdescr * bitmap; // bitmap for compacting collection
+
+ StgTSO * old_threads;
+
+} step;
+
+
+typedef struct generation_ {
+ unsigned int no; // generation number
+ step * steps; // steps
+ unsigned int n_steps; // number of steps
+ unsigned int max_blocks; // max blocks in step 0
+ bdescr *mut_list; // mut objects in this gen (not G0)
+
+ // stats information
+ unsigned int collections;
+ unsigned int par_collections;
+ unsigned int failed_promotions;
+
+ // temporary use during GC:
+ bdescr *saved_mut_list;
+} generation;
+
+extern generation * generations;
+
+extern generation * g0;
+extern step * g0s0;
+extern generation * oldest_gen;
+extern step * all_steps;
+extern nat total_steps;
+
+/* -----------------------------------------------------------------------------
+ Generic allocation
+
+ StgPtr allocateInGen(generation *g, nat n)
+ Allocates a chunk of contiguous store
+ n words long in generation g,
+ returning a pointer to the first word.
+ Always succeeds.
+
+ StgPtr allocate(nat n) Equaivalent to allocateInGen(g0)
+
+ StgPtr allocateLocal(Capability *cap, nat n)
+ Allocates memory from the nursery in
+ the current Capability. This can be
+ done without taking a global lock,
+ unlike allocate().
+
+ StgPtr allocatePinned(nat n) Allocates a chunk of contiguous store
+ n words long, which is at a fixed
+ address (won't be moved by GC).
+ Returns a pointer to the first word.
+ Always succeeds.
+
+ NOTE: the GC can't in general handle
+ pinned objects, so allocatePinned()
+ can only be used for ByteArrays at the
+ moment.
+
+ Don't forget to TICK_ALLOC_XXX(...)
+ after calling allocate or
+ allocatePinned, for the
+ benefit of the ticky-ticky profiler.
+
+ rtsBool doYouWantToGC(void) Returns True if the storage manager is
+ ready to perform a GC, False otherwise.
+
+ lnat allocatedBytes(void) Returns the number of bytes allocated
+ via allocate() since the last GC.
+ Used in the reporting of statistics.
+
+ -------------------------------------------------------------------------- */
+
+StgPtr allocate ( lnat n );
+StgPtr allocateInGen ( generation *g, lnat n );
+StgPtr allocateLocal ( Capability *cap, lnat n );
+StgPtr allocatePinned ( lnat n );
+lnat allocatedBytes ( void );
+
+/* memory allocator for executable memory */
+void * allocateExec(unsigned int len, void **exec_addr);
+void freeExec (void *p);
+
+/* -----------------------------------------------------------------------------
+ Performing Garbage Collection
+ -------------------------------------------------------------------------- */
+
+void performGC(void);
+void performMajorGC(void);
+
+/* -----------------------------------------------------------------------------
+ The CAF table - used to let us revert CAFs in GHCi
+ -------------------------------------------------------------------------- */
+
+void newCAF (StgClosure*);
+void newDynCAF (StgClosure *);
+void revertCAFs (void);
+
+/* set to disable CAF garbage collection in GHCi. */
+/* (needed when dynamic libraries are used). */
+extern rtsBool keepCAFs;
+
+#endif /* RTS_STORAGE_GC_H */
diff --git a/includes/InfoTables.h b/includes/rts/storage/InfoTables.h
index 0c6ab52745..4596ce2d75 100644
--- a/includes/InfoTables.h
+++ b/includes/rts/storage/InfoTables.h
@@ -6,8 +6,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef INFOTABLES_H
-#define INFOTABLES_H
+#ifndef RTS_STORAGE_INFOTABLES_H
+#define RTS_STORAGE_INFOTABLES_H
/* ----------------------------------------------------------------------------
Relative pointers
@@ -212,11 +212,7 @@ typedef union {
/*
* The "standard" part of an info table. Every info table has this bit.
*/
-typedef struct _StgInfoTable {
-
-#ifndef TABLES_NEXT_TO_CODE
- StgFunPtr entry; /* pointer to the entry code */
-#endif
+typedef struct StgInfoTable_ {
#ifdef PROFILING
StgProfInfo prof;
@@ -236,7 +232,7 @@ typedef struct _StgInfoTable {
#ifdef TABLES_NEXT_TO_CODE
StgCode code[FLEXIBLE_ARRAY];
#endif
-} StgInfoTable;
+} *StgInfoTablePtr;
/* -----------------------------------------------------------------------------
@@ -254,7 +250,7 @@ typedef struct _StgInfoTable {
bitmap fields have also been omitted.
-------------------------------------------------------------------------- */
-typedef struct _StgFunInfoExtraRev {
+typedef struct StgFunInfoExtraRev_ {
OFFSET_FIELD ( slow_apply_offset ); /* apply to args on the stack */
union {
StgWord bitmap;
@@ -265,7 +261,7 @@ typedef struct _StgFunInfoExtraRev {
StgHalfWord arity; /* function arity */
} StgFunInfoExtraRev;
-typedef struct _StgFunInfoExtraFwd {
+typedef struct StgFunInfoExtraFwd_ {
StgHalfWord fun_type; /* function type */
StgHalfWord arity; /* function arity */
StgSRT *srt; /* pointer to the SRT table */
@@ -313,7 +309,7 @@ typedef struct {
* pointer iff srt_bitmap is zero.
*/
-typedef struct _StgThunkInfoTable {
+typedef struct StgThunkInfoTable_ {
#if !defined(TABLES_NEXT_TO_CODE)
StgInfoTable i;
#endif
@@ -331,7 +327,7 @@ typedef struct _StgThunkInfoTable {
Constructor info tables
-------------------------------------------------------------------------- */
-typedef struct _StgConInfoTable {
+typedef struct StgConInfoTable_ {
#if !defined(TABLES_NEXT_TO_CODE)
StgInfoTable i;
#endif
@@ -410,4 +406,5 @@ typedef struct _StgConInfoTable {
#else
#define GET_PROF_DESC(info) ((info)->prof.closure_desc)
#endif
-#endif /* INFOTABLES_H */
+
+#endif /* RTS_STORAGE_INFOTABLES_H */
diff --git a/includes/Liveness.h b/includes/rts/storage/Liveness.h
index cc93cae34f..66c82f3134 100644
--- a/includes/Liveness.h
+++ b/includes/rts/storage/Liveness.h
@@ -11,8 +11,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef LIVENESS_H
-#define LIVENESS_H
+#ifndef RTS_STORAGE_LIVENESS_H
+#define RTS_STORAGE_LIVENESS_H
#define NO_PTRS 0xff
#define R1_PTR (NO_PTRS ^ (1<<0))
@@ -31,4 +31,4 @@
#define RET_DYN_PTRS(l) ((l)>>24 & 0xff)
#define RET_DYN_LIVENESS(l) ((l) & 0xffff)
-#endif /* LIVENESS_H */
+#endif /* RTS_STORAGE_LIVENESS_H */
diff --git a/rts/sm/MBlock.h b/includes/rts/storage/MBlock.h
index f9dddc3138..03396c1fd7 100644
--- a/rts/sm/MBlock.h
+++ b/includes/rts/storage/MBlock.h
@@ -9,12 +9,10 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef MBLOCK_H
-#define MBLOCK_H
+#ifndef RTS_STORAGE_MBLOCK_H
+#define RTS_STORAGE_MBLOCK_H
-#include "GC.h"
-
-extern lnat RTS_VAR(mblocks_allocated);
+extern lnat mblocks_allocated;
extern void initMBlocks(void);
extern void * getMBlock(void);
@@ -205,4 +203,4 @@ StgBool HEAP_ALLOCED_GC(void *p)
# error HEAP_ALLOCED not defined
#endif
-#endif /* MBLOCK_H */
+#endif /* RTS_STORAGE_MBLOCK_H */
diff --git a/includes/SMPClosureOps.h b/includes/rts/storage/SMPClosureOps.h
index f46dbdefe8..d5f7c3f295 100644
--- a/includes/SMPClosureOps.h
+++ b/includes/rts/storage/SMPClosureOps.h
@@ -6,8 +6,8 @@
*
* -------------------------------------------------------------------------- */
-#ifndef SMPCLOSUREOPS_H
-#define SMPCLOSUREOPS_H
+#ifndef RTS_STORAGE_SMPCLOSUREOPS_H
+#define RTS_STORAGE_SMPCLOSUREOPS_H
#ifdef CMINUSMINUS
@@ -75,4 +75,4 @@ EXTERN_INLINE void unlockTSO(StgTSO *tso)
#endif /* CMINUSMINUS */
-#endif /* SMPCLOSUREOPS_H */
+#endif /* RTS_STORAGE_SMPCLOSUREOPS_H */
diff --git a/includes/TSO.h b/includes/rts/storage/TSO.h
index af624f7666..7cb245909f 100644
--- a/includes/TSO.h
+++ b/includes/rts/storage/TSO.h
@@ -1,36 +1,13 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1998-1999
+ * (c) The GHC Team, 1998-2009
*
* The definitions for Thread State Objects.
*
* ---------------------------------------------------------------------------*/
-#ifndef TSO_H
-#define TSO_H
-
-#if DEBUG
-#define TSO_MAGIC 4321
-#endif
-
-typedef struct {
- StgInt pri;
- StgInt magic;
- StgInt sparkname;
- rtsTime startedat;
- rtsBool exported;
- StgInt basicblocks;
- StgInt allocs;
- rtsTime exectime;
- rtsTime fetchtime;
- rtsTime fetchcount;
- rtsTime blocktime;
- StgInt blockcount;
- rtsTime blockedat;
- StgInt globalsparks;
- StgInt localsparks;
- rtsTime clock;
-} StgTSOStatBuf;
+#ifndef RTS_STORAGE_TSO_H
+#define RTS_STORAGE_TSO_H
/*
* PROFILING info in a TSO
@@ -146,14 +123,14 @@ typedef struct StgTSO_ {
StgPtr sp;
StgWord stack[FLEXIBLE_ARRAY];
-} StgTSO;
+} *StgTSOPtr;
/* -----------------------------------------------------------------------------
functions
-------------------------------------------------------------------------- */
-extern void dirty_TSO (Capability *cap, StgTSO *tso);
-extern void setTSOLink (Capability *cap, StgTSO *tso, StgTSO *target);
+void dirty_TSO (Capability *cap, StgTSO *tso);
+void setTSOLink (Capability *cap, StgTSO *tso, StgTSO *target);
/* -----------------------------------------------------------------------------
Invariants:
@@ -174,7 +151,7 @@ extern void setTSOLink (Capability *cap, StgTSO *tso, StgTSO *target);
----------------------------------------------------------------------
NotBlocked NULL runnable_queue, or running
- BlockedOnBlackHole the BLACKHOLE_BQ the BLACKHOLE_BQ's queue
+ BlockedOnBlackHole the BLACKHOLE blackhole_queue
BlockedOnMVar the MVAR the MVAR's queue
@@ -226,4 +203,4 @@ extern StgTSO dummy_tso;
/* this is the NIL ptr for a TSO queue (e.g. runnable queue) */
#define END_TSO_QUEUE ((StgTSO *)(void*)&stg_END_TSO_QUEUE_closure)
-#endif /* TSO_H */
+#endif /* RTS_STORAGE_TSO_H */
diff --git a/includes/StgDLL.h b/includes/stg/DLL.h
index 5e824271bf..5e824271bf 100644
--- a/includes/StgDLL.h
+++ b/includes/stg/DLL.h
diff --git a/includes/MachRegs.h b/includes/stg/MachRegs.h
index d6075326db..d6075326db 100644
--- a/includes/MachRegs.h
+++ b/includes/stg/MachRegs.h
diff --git a/includes/StgMiscClosures.h b/includes/stg/MiscClosures.h
index d5a03fcdd9..1591570780 100644
--- a/includes/StgMiscClosures.h
+++ b/includes/stg/MiscClosures.h
@@ -253,7 +253,6 @@ RTS_INFO(stg_sel_5_upd_info);
RTS_INFO(stg_sel_6_upd_info);
RTS_INFO(stg_sel_7_upd_info);
RTS_INFO(stg_sel_8_upd_info);
-RTS_INFO(stg_sel_8_upd_info);
RTS_INFO(stg_sel_9_upd_info);
RTS_INFO(stg_sel_10_upd_info);
RTS_INFO(stg_sel_11_upd_info);
@@ -271,7 +270,6 @@ RTS_ENTRY(stg_sel_5_upd_entry);
RTS_ENTRY(stg_sel_6_upd_entry);
RTS_ENTRY(stg_sel_7_upd_entry);
RTS_ENTRY(stg_sel_8_upd_entry);
-RTS_ENTRY(stg_sel_8_upd_entry);
RTS_ENTRY(stg_sel_9_upd_entry);
RTS_ENTRY(stg_sel_10_upd_entry);
RTS_ENTRY(stg_sel_11_upd_entry);
@@ -517,7 +515,7 @@ RTS_FUN(orIntegerzh_fast);
RTS_FUN(xorIntegerzh_fast);
RTS_FUN(complementIntegerzh_fast);
-#ifdef SUPPORT_LONG_LONGS
+#if SIZEOF_HSINT == 4
RTS_FUN(int64ToIntegerzh_fast);
RTS_FUN(word64ToIntegerzh_fast);
diff --git a/includes/Regs.h b/includes/stg/Regs.h
index beb71c9184..fb26254d5a 100644
--- a/includes/Regs.h
+++ b/includes/stg/Regs.h
@@ -37,14 +37,9 @@ typedef union {
StgWord w;
StgAddr a;
StgChar c;
- StgInt8 i8;
StgFloat f;
StgInt i;
StgPtr p;
- StgClosurePtr cl;
- StgStackOffset offset; /* unused? */
- StgByteArray b;
- StgTSOPtr t;
} StgUnion;
/*
diff --git a/includes/SMP.h b/includes/stg/SMP.h
index b7538424b9..5d9d80169b 100644
--- a/includes/SMP.h
+++ b/includes/stg/SMP.h
@@ -9,28 +9,17 @@
#ifndef SMP_H
#define SMP_H
-/* THREADED_RTS is currently not compatible with the following options:
- *
- * PROFILING (but only 1 CPU supported)
- * TICKY_TICKY
- * Unregisterised builds are ok, but only 1 CPU supported.
- */
-
#if defined(THREADED_RTS)
-#if defined(TICKY_TICKY)
-#error Build options incompatible with THREADED_RTS.
-#endif
-
/* ----------------------------------------------------------------------------
Atomic operations
------------------------------------------------------------------------- */
-#if !IN_STG_CODE
-// We only want write_barrier() declared in .hc files. Defining the
-// other inline functions here causes type mismatch errors from gcc,
-// because the generated C code is assuming that there are no
-// prototypes in scope.
+#if !IN_STG_CODE || IN_STGCRUN
+// We only want the barriers, e.g. write_barrier(), declared in .hc
+// files. Defining the other inline functions here causes type
+// mismatch errors from gcc, because the generated C code is assuming
+// that there are no prototypes in scope.
/*
* The atomic exchange operation: xchg(p,w) exchanges the value
@@ -94,12 +83,8 @@ EXTERN_INLINE void load_load_barrier(void);
Implementations
------------------------------------------------------------------------- */
-#if !IN_STG_CODE
+#if !IN_STG_CODE || IN_STGCRUN
-/*
- * NB: the xchg instruction is implicitly locked, so we do not need
- * a lock prefix here.
- */
EXTERN_INLINE StgWord
xchg(StgPtr p, StgWord w)
{
@@ -107,6 +92,8 @@ xchg(StgPtr p, StgWord w)
#if i386_HOST_ARCH || x86_64_HOST_ARCH
result = w;
__asm__ __volatile__ (
+ // NB: the xchg instruction is implicitly locked, so we do not
+ // need a lock prefix here.
"xchg %1,%0"
:"+r" (result), "+m" (*p)
: /* no input-only operands */
diff --git a/includes/TailCalls.h b/includes/stg/TailCalls.h
index 854c7b4b18..854c7b4b18 100644
--- a/includes/TailCalls.h
+++ b/includes/stg/TailCalls.h
diff --git a/includes/TickyCounters.h b/includes/stg/Ticky.h
index 38e84ef2af..fd7edf85c5 100644
--- a/includes/TickyCounters.h
+++ b/includes/stg/Ticky.h
@@ -3,7 +3,8 @@
* (c) The GHC Team, 2007
*
* Declarations for counters used by ticky-ticky profiling.
- *----------------------------------------------------------------------------- */
+ *
+ * -------------------------------------------------------------------------- */
#ifndef TICKYCOUNTERS_H
@@ -25,7 +26,6 @@
#define EXTERN extern
#endif
-
/* Here are all the counter declarations: */
EXTERN StgInt ENT_VIA_NODE_ctr INIT(0);
diff --git a/includes/StgTypes.h b/includes/stg/Types.h
index 7f2c08e5e2..227356c9ea 100644
--- a/includes/StgTypes.h
+++ b/includes/stg/Types.h
@@ -19,9 +19,8 @@
StgInt Signed version of StgWord
StgAddr Generic address type
- StgBool, StgVoid, StgClosurePtr, StgPtr, StgOffset,
- StgTSOPtr, StgForeignPtr, StgStackOffset, StgStackPtr,
- StgCode, StgArray, StgByteArray, StgStablePtr, StgFunPtr,
+ StgBool, StgVoid, StgPtr, StgOffset,
+ StgCode, StgStablePtr, StgFunPtr,
StgUnion.
* WARNING: Keep this file, MachDeps.h, and HsFFI.h in synch!
@@ -58,23 +57,17 @@ typedef unsigned int StgWord32;
#error GHC untested on this architecture: sizeof(int) != 4
#endif
-#ifdef SUPPORT_LONG_LONGS
-/* assume long long is 64 bits */
-# ifndef _MSC_VER
-typedef signed long long int StgInt64;
-typedef unsigned long long int StgWord64;
-# else
-typedef __int64 StgInt64;
-typedef unsigned __int64 StgWord64;
-# endif
-#elif SIZEOF_LONG == 8
+#if SIZEOF_LONG == 8
typedef signed long StgInt64;
typedef unsigned long StgWord64;
#elif defined(__MSVC__)
typedef __int64 StgInt64;
typedef unsigned __int64 StgWord64;
+#elif SIZEOF_LONG_LONG == 8
+typedef signed long long int StgInt64;
+typedef unsigned long long int StgWord64;
#else
-#error GHC untested on this architecture: sizeof(void *) < 8 and no long longs.
+#error cannot find a way to define StgInt64
#endif
/*
@@ -106,40 +99,21 @@ typedef StgWord16 StgHalfWord;
#define W_MASK (sizeof(W_)-1)
-typedef void* StgAddr;
-
/*
* Other commonly-used STG datatypes.
*/
+typedef void* StgAddr;
typedef StgWord32 StgChar;
typedef int StgBool;
-
typedef float StgFloat;
typedef double StgDouble;
-
-typedef void StgVoid;
-
-typedef struct StgClosure_ StgClosure;
-typedef StgClosure* StgClosurePtr;
-typedef StgWord* StgPtr; /* pointer into closure */
+typedef StgWord* StgPtr; /* heap or stack pointer */
typedef StgWord volatile* StgVolatilePtr; /* pointer to volatile word */
typedef StgWord StgOffset; /* byte offset within closure */
-
-typedef struct StgTSO_* StgTSOPtr;
-
-typedef void* StgForeignPtr;
-
-typedef StgInt StgStackOffset; /* offset in words! */
-
-typedef StgWord* StgStackPtr;
-
-typedef StgWord8 StgCode; /* close enough */
-
-typedef StgPtr* StgArray; /* the goods of an Array# */
-typedef char* StgByteArray; /* the goods of a ByteArray# */
-
+typedef StgWord8 StgCode; /* close enough */
typedef void* StgStablePtr;
+typedef StgWord8* StgByteArray;
/*
Types for the generated C functions
diff --git a/rts/Adjustor.c b/rts/Adjustor.c
index e93f361aee..0f09743a02 100644
--- a/rts/Adjustor.c
+++ b/rts/Adjustor.c
@@ -38,9 +38,9 @@ Haskell side.
#include "PosixSource.h"
#include "Rts.h"
-#include "RtsExternal.h"
+
#include "RtsUtils.h"
-#include <stdlib.h>
+#include "Stable.h"
#if defined(USE_LIBFFI_FOR_ADJUSTORS)
diff --git a/rts/Arena.c b/rts/Arena.c
index fcdc6cce14..7fc49f44d7 100644
--- a/rts/Arena.c
+++ b/rts/Arena.c
@@ -18,12 +18,12 @@
which most allocations are small.
-------------------------------------------------------------------------- */
+#include "PosixSource.h"
#include "Rts.h"
+
#include "RtsUtils.h"
#include "Arena.h"
-#include <stdlib.h>
-
// Each arena struct is allocated using malloc().
struct _Arena {
bdescr *current;
diff --git a/rts/AwaitEvent.h b/rts/AwaitEvent.h
index e03cb4444e..758e81a288 100644
--- a/rts/AwaitEvent.h
+++ b/rts/AwaitEvent.h
@@ -21,4 +21,4 @@ void awaitEvent(rtsBool wait); /* In posix/Select.c or
* win32/AwaitEvent.c */
#endif
-#endif /* SELECT_H */
+#endif /* AWAITEVENT_H */
diff --git a/rts/Capability.c b/rts/Capability.c
index 02308d4c20..ddaba699a3 100644
--- a/rts/Capability.c
+++ b/rts/Capability.c
@@ -18,28 +18,27 @@
#include "PosixSource.h"
#include "Rts.h"
-#include "RtsUtils.h"
-#include "RtsFlags.h"
-#include "STM.h"
-#include "OSThreads.h"
+
#include "Capability.h"
#include "Schedule.h"
#include "Sparks.h"
#include "Trace.h"
-#include "GC.h"
+#include "sm/GC.h" // for gcWorkerThread()
+#include "STM.h"
+#include "RtsUtils.h"
// one global capability, this is the Capability for non-threaded
// builds, and for +RTS -N1
Capability MainCapability;
-nat n_capabilities;
+nat n_capabilities = 0;
Capability *capabilities = NULL;
// Holds the Capability which last became free. This is used so that
// an in-call has a chance of quickly finding a free Capability.
// Maintaining a global free list of Capabilities would require global
// locking, so we don't do that.
-Capability *last_free_capability;
+Capability *last_free_capability = NULL;
/* GC indicator, in scope for the scheduler, init'ed to false */
volatile StgWord waiting_for_gc = 0;
@@ -235,8 +234,8 @@ initCapability( Capability *cap, nat i )
#endif
cap->f.stgEagerBlackholeInfo = (W_)&__stg_EAGER_BLACKHOLE_info;
- cap->f.stgGCEnter1 = (F_)__stg_gc_enter_1;
- cap->f.stgGCFun = (F_)__stg_gc_fun;
+ cap->f.stgGCEnter1 = (StgFunPtr)__stg_gc_enter_1;
+ cap->f.stgGCFun = (StgFunPtr)__stg_gc_fun;
cap->mut_lists = stgMallocBytes(sizeof(bdescr *) *
RtsFlags.GcFlags.generations,
diff --git a/rts/Capability.h b/rts/Capability.h
index d2fcc5ed7b..fb199e2a3e 100644
--- a/rts/Capability.h
+++ b/rts/Capability.h
@@ -4,26 +4,21 @@
*
* Capabilities
*
- * The notion of a capability is used when operating in multi-threaded
- * environments (which the THREADED_RTS build of the RTS does), to
- * hold all the state an OS thread/task needs to run Haskell code:
- * its STG registers, a pointer to its TSO, a nursery etc. During
- * STG execution, a pointer to the capabilitity is kept in a
- * register (BaseReg).
+ * A Capability holds all the state an OS thread/task needs to run
+ * Haskell code: its STG registers, a pointer to its TSO, a nursery
+ * etc. During STG execution, a pointer to the Capabilitity is kept in
+ * a register (BaseReg).
*
- * Only in an THREADED_RTS build will there be multiple capabilities,
- * in the non-threaded builds there is one global capability, namely
+ * Only in a THREADED_RTS build will there be multiple capabilities,
+ * in the non-threaded RTS there is one global capability, called
* MainCapability.
*
- * This header file contains the functions for working with capabilities.
- * (the main, and only, consumer of this interface is the scheduler).
- *
* --------------------------------------------------------------------------*/
#ifndef CAPABILITY_H
#define CAPABILITY_H
-#include "RtsFlags.h"
+#include "sm/GC.h" // for evac_fn
#include "Task.h"
#include "Sparks.h"
@@ -174,14 +169,14 @@ INLINE_HEADER void releaseCapability_ (Capability* cap STG_UNUSED,
rtsBool always_wakeup STG_UNUSED) {};
#endif
-#if !IN_STG_CODE
-// one global capability
-extern Capability MainCapability;
-#endif
+// declared in includes/rts/Threads.h:
+// extern Capability MainCapability;
+
+// declared in includes/rts/Threads.h:
+// extern nat n_capabilities;
// Array of all the capabilities
//
-extern nat n_capabilities;
extern Capability *capabilities;
// The Capability that was last free. Used as a good guess for where
@@ -281,7 +276,7 @@ INLINE_HEADER void contextSwitchCapability(Capability *cap);
// Free all capabilities
void freeCapabilities (void);
-// FOr the GC:
+// For the GC:
void markSomeCapabilities (evac_fn evac, void *user, nat i0, nat delta,
rtsBool prune_sparks);
void markCapabilities (evac_fn evac, void *user);
diff --git a/rts/Disassembler.c b/rts/Disassembler.c
index 19c121f2f1..fff3fe9d76 100644
--- a/rts/Disassembler.c
+++ b/rts/Disassembler.c
@@ -13,12 +13,10 @@
#include "PosixSource.h"
#include "Rts.h"
#include "RtsAPI.h"
+#include "rts/Bytecodes.h"
+
#include "RtsUtils.h"
-#include "Closures.h"
-#include "TSO.h"
#include "Schedule.h"
-
-#include "Bytecodes.h"
#include "Printer.h"
#include "Disassembler.h"
#include "Interpreter.h"
diff --git a/rts/FrontPanel.c b/rts/FrontPanel.c
index 2ce91e2c65..163a7c08ca 100644
--- a/rts/FrontPanel.c
+++ b/rts/FrontPanel.c
@@ -12,11 +12,10 @@
/* #include "PosixSource.h" */
#include "Rts.h"
+
#include "RtsUtils.h"
-#include "MBlock.h"
#include "FrontPanel.h"
#include "Stats.h"
-#include "RtsFlags.h"
#include "Schedule.h"
#include <gtk/gtk.h>
diff --git a/rts/Globals.c b/rts/Globals.c
index a0d0788335..15b10130a8 100644
--- a/rts/Globals.c
+++ b/rts/Globals.c
@@ -9,8 +9,11 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsGlobals.h"
+
+#include "Globals.h"
+#include "Stable.h"
static StgStablePtr typeableStore = 0;
static StgStablePtr signalHandlerStore = 0;
diff --git a/rts/Globals.h b/rts/Globals.h
new file mode 100644
index 0000000000..bc68904f78
--- /dev/null
+++ b/rts/Globals.h
@@ -0,0 +1,19 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 2006-2009
+ *
+ * The RTS stores some "global" values on behalf of libraries, so that
+ * some libraries can ensure that certain top-level things are shared
+ * even when multiple versions of the library are loaded. e.g. see
+ * Data.Typeable and GHC.Conc.
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef GLOBALS_H
+#define GLOBALS_H
+
+void initGlobalStore(void);
+void exitGlobalStore(void);
+
+#endif
+
diff --git a/rts/Hash.c b/rts/Hash.c
index 033ccb3e73..09d0a06808 100644
--- a/rts/Hash.c
+++ b/rts/Hash.c
@@ -10,10 +10,10 @@
#include "PosixSource.h"
#include "Rts.h"
+
#include "Hash.h"
#include "RtsUtils.h"
-#include <stdlib.h>
#include <string.h>
#define HSEGSIZE 1024 /* Size of a single hash table segment */
diff --git a/rts/Hpc.c b/rts/Hpc.c
index a6e854ba83..cf75a05847 100644
--- a/rts/Hpc.c
+++ b/rts/Hpc.c
@@ -2,16 +2,16 @@
* (c)2006 Galois Connections, Inc.
*/
+#include "PosixSource.h"
+#include "Rts.h"
+
+#include "Trace.h"
+
#include <stdio.h>
#include <ctype.h>
-#include <stdlib.h>
#include <string.h>
#include <assert.h>
-#include "Rts.h"
-#include "Hpc.h"
-#include "Trace.h"
-
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
@@ -49,7 +49,8 @@ int totalTixes = 0; // total number of tix boxes.
static char *tixFilename;
-static void failure(char *msg) {
+static void GNU_ATTRIBUTE(__noreturn__)
+failure(char *msg) {
debugTrace(DEBUG_hpc,"hpc failure: %s\n",msg);
fprintf(stderr,"Hpc failure: %s\n",msg);
if (tixFilename) {
diff --git a/rts/Hpc.h b/rts/Hpc.h
deleted file mode 100644
index a0ff40b06c..0000000000
--- a/rts/Hpc.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef HPC_H
-#define HPC_H
-
-extern void startupHpc(void);
-extern void exitHpc(void);
-
-#endif /* HPC_H */
-
-
-
diff --git a/rts/HsFFI.c b/rts/HsFFI.c
index 350bcfbdec..57f91b198e 100644
--- a/rts/HsFFI.c
+++ b/rts/HsFFI.c
@@ -6,9 +6,12 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "HsFFI.h"
#include "Rts.h"
+#include "Stable.h"
+
// hs_init and hs_exit are defined in RtsStartup.c
void
diff --git a/rts/Inlines.c b/rts/Inlines.c
index 5d2be70c63..88cbdd2f44 100644
--- a/rts/Inlines.c
+++ b/rts/Inlines.c
@@ -2,4 +2,5 @@
// compiled for real here, just in case the definition was not inlined
// at some call site:
#define KEEP_INLINES
+#include "PosixSource.h"
#include "Rts.h"
diff --git a/rts/Interpreter.c b/rts/Interpreter.c
index 91e500b8ee..d047876d21 100644
--- a/rts/Interpreter.c
+++ b/rts/Interpreter.c
@@ -7,21 +7,20 @@
#include "PosixSource.h"
#include "Rts.h"
#include "RtsAPI.h"
+#include "rts/Bytecodes.h"
+
+// internal headers
+#include "sm/Storage.h"
#include "RtsUtils.h"
-#include "Closures.h"
-#include "TSO.h"
#include "Schedule.h"
-#include "RtsFlags.h"
-#include "LdvProfile.h"
#include "Updates.h"
#include "Sanity.h"
-#include "Liveness.h"
#include "Prelude.h"
-
-#include "Bytecodes.h"
+#include "Stable.h"
#include "Printer.h"
#include "Disassembler.h"
#include "Interpreter.h"
+#include "ThreadPaused.h"
#include <string.h> /* for memcpy */
#ifdef HAVE_ERRNO_H
diff --git a/rts/LdvProfile.c b/rts/LdvProfile.c
index eab3ec3e4b..c97187a9a9 100644
--- a/rts/LdvProfile.c
+++ b/rts/LdvProfile.c
@@ -9,9 +9,9 @@
#ifdef PROFILING
+#include "PosixSource.h"
#include "Rts.h"
-#include "LdvProfile.h"
-#include "RtsFlags.h"
+
#include "Profiling.h"
#include "Stats.h"
#include "RtsUtils.h"
diff --git a/rts/Linker.c b/rts/Linker.c
index 162ada872c..7db88cb625 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -18,17 +18,19 @@
#endif
#include "Rts.h"
-#include "RtsFlags.h"
#include "HsFFI.h"
+
+#include "sm/Storage.h"
#include "Hash.h"
-#include "Linker.h"
#include "LinkerInternals.h"
#include "RtsUtils.h"
-#include "Schedule.h"
-#include "Sparks.h"
-#include "RtsGlobals.h"
-#include "Timer.h"
#include "Trace.h"
+#include "StgPrimFloat.h" // for __int_encodeFloat etc.
+#include "Stable.h"
+
+#if !defined(mingw32_HOST_OS)
+#include "posix/Signals.h"
+#endif
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
@@ -230,8 +232,8 @@ typedef struct _RtsSymbolVal {
#if !defined (mingw32_HOST_OS)
#define RTS_POSIX_ONLY_SYMBOLS \
SymI_HasProto(shutdownHaskellAndSignal) \
- SymI_NeedsProto(lockFile) \
- SymI_NeedsProto(unlockFile) \
+ SymI_HasProto(lockFile) \
+ SymI_HasProto(unlockFile) \
SymI_HasProto(signal_handlers) \
SymI_HasProto(stg_sig_install) \
SymI_NeedsProto(nocldstop)
@@ -613,7 +615,6 @@ typedef struct _RtsSymbolVal {
SymI_HasProto(forkProcess) \
SymI_HasProto(forkOS_createThread) \
SymI_HasProto(freeHaskellFunctionPtr) \
- SymI_HasProto(freeStablePtr) \
SymI_HasProto(getOrSetTypeableStore) \
SymI_HasProto(getOrSetSignalHandlerStore) \
SymI_HasProto(genSymZh) \
@@ -635,15 +636,7 @@ typedef struct _RtsSymbolVal {
SymI_HasProto(getApStackValzh_fast) \
SymI_HasProto(getSparkzh_fast) \
SymI_HasProto(isCurrentThreadBoundzh_fast) \
- SymI_HasProto(isDoubleDenormalized) \
- SymI_HasProto(isDoubleInfinite) \
- SymI_HasProto(isDoubleNaN) \
- SymI_HasProto(isDoubleNegativeZero) \
SymI_HasProto(isEmptyMVarzh_fast) \
- SymI_HasProto(isFloatDenormalized) \
- SymI_HasProto(isFloatInfinite) \
- SymI_HasProto(isFloatNaN) \
- SymI_HasProto(isFloatNegativeZero) \
SymI_HasProto(killThreadzh_fast) \
SymI_HasProto(loadObj) \
SymI_HasProto(insertStableSymbol) \
@@ -674,7 +667,6 @@ typedef struct _RtsSymbolVal {
SymI_HasProto(raiseIOzh_fast) \
SymI_HasProto(readTVarzh_fast) \
SymI_HasProto(readTVarIOzh_fast) \
- SymI_HasProto(resetNonBlockingFd) \
SymI_HasProto(resumeThread) \
SymI_HasProto(resolveObjs) \
SymI_HasProto(retryzh_fast) \
@@ -735,7 +727,6 @@ typedef struct _RtsSymbolVal {
SymI_HasProto(stackOverflow) \
SymI_HasProto(stg_CAF_BLACKHOLE_info) \
SymI_HasProto(__stg_EAGER_BLACKHOLE_info) \
- SymI_HasProto(awakenBlockedQueue) \
SymI_HasProto(startTimer) \
SymI_HasProto(stg_CHARLIKE_closure) \
SymI_HasProto(stg_MVAR_CLEAN_info) \
diff --git a/rts/Main.c b/rts/Main.c
index 58d3f37919..c1b028ff1b 100644
--- a/rts/Main.c
+++ b/rts/Main.c
@@ -11,6 +11,7 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
#include "RtsMain.h"
diff --git a/rts/Papi.c b/rts/Papi.c
index d95e26c8e7..e62fc9595c 100644
--- a/rts/Papi.c
+++ b/rts/Papi.c
@@ -16,12 +16,12 @@
#include <papi.h>
-#include "Papi.h"
+#include "PosixSource.h"
#include "Rts.h"
+
#include "RtsUtils.h"
#include "Stats.h"
-#include "RtsFlags.h"
-#include "OSThreads.h"
+#include "Papi.h"
// used to protect the aggregated counters
#ifdef THREADED_RTS
diff --git a/rts/Papi.h b/rts/Papi.h
index fc92a913d5..8f58f6dfc9 100644
--- a/rts/Papi.h
+++ b/rts/Papi.h
@@ -5,6 +5,9 @@
*
* ---------------------------------------------------------------------------*/
+#ifndef PAPI_H
+#define PAPI_H
+
/* Check the error value of a PAPI call, reporting an error, if needed */
extern int papi_error;
@@ -25,3 +28,5 @@ void papi_stop_gc1_count(void);
// events and aggregate them into the main GC counters.
void papi_thread_start_gc1_count(int event_set);
void papi_thread_stop_gc1_count(int event_set);
+
+#endif /* PAPI_H */
diff --git a/rts/PosixSource.h b/rts/PosixSource.h
index a938f9bc0f..cd1aeea34c 100644
--- a/rts/PosixSource.h
+++ b/rts/PosixSource.h
@@ -11,8 +11,9 @@
#define _POSIX_SOURCE 1
#define _POSIX_C_SOURCE 199506L
-#define _ISOC9X_SOURCE
+#define _XOPEN_SOURCE 500
+#define _ISOC99_SOURCE
-/* Let's be ISO C9X too... */
+/* Let's be ISO C99 too... */
#endif /* POSIXSOURCE_H */
diff --git a/rts/Printer.c b/rts/Printer.c
index a0040a5d46..ee91777854 100644
--- a/rts/Printer.c
+++ b/rts/Printer.c
@@ -8,18 +8,16 @@
#include "PosixSource.h"
#include "Rts.h"
+#include "rts/Bytecodes.h" /* for InstrPtr */
+
#include "Printer.h"
#include "RtsUtils.h"
#ifdef DEBUG
-#include "RtsFlags.h"
-#include "MBlock.h"
-#include "Bytecodes.h" /* for InstrPtr */
#include "Disassembler.h"
#include "Apply.h"
-#include <stdlib.h>
#include <string.h>
/* --------------------------------------------------------------------------
@@ -37,7 +35,6 @@ static rtsBool lookup_name ( char *name, StgWord *result );
static void enZcode ( char *in, char *out );
#endif
static char unZcode ( char ch );
-const char * lookupGHCName ( void *addr );
static void printZcoded ( const char *raw );
/* --------------------------------------------------------------------------
@@ -186,7 +183,7 @@ printClosure( StgClosure *obj )
case AP:
{
- StgAP* ap = stgCast(StgAP*,obj);
+ StgAP* ap = (StgAP*)obj;
StgWord i;
debugBelch("AP("); printPtr((StgPtr)ap->fun);
for (i = 0; i < ap->n_args; ++i) {
@@ -199,7 +196,7 @@ printClosure( StgClosure *obj )
case PAP:
{
- StgPAP* pap = stgCast(StgPAP*,obj);
+ StgPAP* pap = (StgPAP*)obj;
StgWord i;
debugBelch("PAP/%d(",pap->arity);
printPtr((StgPtr)pap->fun);
@@ -213,7 +210,7 @@ printClosure( StgClosure *obj )
case AP_STACK:
{
- StgAP_STACK* ap = stgCast(StgAP_STACK*,obj);
+ StgAP_STACK* ap = (StgAP_STACK*)obj;
StgWord i;
debugBelch("AP_STACK("); printPtr((StgPtr)ap->fun);
for (i = 0; i < ap->size; ++i) {
@@ -226,31 +223,31 @@ printClosure( StgClosure *obj )
case IND:
debugBelch("IND(");
- printPtr((StgPtr)stgCast(StgInd*,obj)->indirectee);
+ printPtr((StgPtr)((StgInd*)obj)->indirectee);
debugBelch(")\n");
break;
case IND_OLDGEN:
debugBelch("IND_OLDGEN(");
- printPtr((StgPtr)stgCast(StgInd*,obj)->indirectee);
+ printPtr((StgPtr)((StgInd*)obj)->indirectee);
debugBelch(")\n");
break;
case IND_PERM:
debugBelch("IND(");
- printPtr((StgPtr)stgCast(StgInd*,obj)->indirectee);
+ printPtr((StgPtr)((StgInd*)obj)->indirectee);
debugBelch(")\n");
break;
case IND_OLDGEN_PERM:
debugBelch("IND_OLDGEN_PERM(");
- printPtr((StgPtr)stgCast(StgInd*,obj)->indirectee);
+ printPtr((StgPtr)((StgInd*)obj)->indirectee);
debugBelch(")\n");
break;
case IND_STATIC:
debugBelch("IND_STATIC(");
- printPtr((StgPtr)stgCast(StgInd*,obj)->indirectee);
+ printPtr((StgPtr)((StgInd*)obj)->indirectee);
debugBelch(")\n");
break;
@@ -264,7 +261,7 @@ printClosure( StgClosure *obj )
case UPDATE_FRAME:
{
- StgUpdateFrame* u = stgCast(StgUpdateFrame*,obj);
+ StgUpdateFrame* u = (StgUpdateFrame*)obj;
debugBelch("UPDATE_FRAME(");
printPtr((StgPtr)GET_INFO(u));
debugBelch(",");
@@ -275,7 +272,7 @@ printClosure( StgClosure *obj )
case CATCH_FRAME:
{
- StgCatchFrame* u = stgCast(StgCatchFrame*,obj);
+ StgCatchFrame* u = (StgCatchFrame*)obj;
debugBelch("CATCH_FRAME(");
printPtr((StgPtr)GET_INFO(u));
debugBelch(",");
@@ -286,7 +283,7 @@ printClosure( StgClosure *obj )
case STOP_FRAME:
{
- StgStopFrame* u = stgCast(StgStopFrame*,obj);
+ StgStopFrame* u = (StgStopFrame*)obj;
debugBelch("STOP_FRAME(");
printPtr((StgPtr)GET_INFO(u));
debugBelch(")\n");
diff --git a/rts/Printer.h b/rts/Printer.h
index 689c2f8d4a..52c1c3eb21 100644
--- a/rts/Printer.h
+++ b/rts/Printer.h
@@ -15,8 +15,8 @@ extern void printObj ( StgClosure *obj );
#ifdef DEBUG
extern void prettyPrintClosure (StgClosure *obj);
extern void printClosure ( StgClosure *obj );
-extern StgStackPtr printStackObj ( StgStackPtr sp );
-extern void printStackChunk ( StgStackPtr sp, StgStackPtr spLim );
+extern StgPtr printStackObj ( StgPtr sp );
+extern void printStackChunk ( StgPtr sp, StgPtr spLim );
extern void printTSO ( StgTSO *tso );
void info_hdr_type ( StgClosure *closure, char *res );
diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c
index 36d4eb5f6f..8d9843893b 100644
--- a/rts/ProfHeap.c
+++ b/rts/ProfHeap.c
@@ -8,20 +8,17 @@
#include "PosixSource.h"
#include "Rts.h"
+
#include "RtsUtils.h"
-#include "RtsFlags.h"
#include "Profiling.h"
#include "ProfHeap.h"
#include "Stats.h"
#include "Hash.h"
#include "RetainerProfile.h"
-#include "LdvProfile.h"
#include "Arena.h"
#include "Printer.h"
#include <string.h>
-#include <stdlib.h>
-#include <math.h>
/* -----------------------------------------------------------------------------
* era stores the current time period. It is the same as the
@@ -95,6 +92,8 @@ static void aggregateCensusInfo( void );
static void dumpCensus( Census *census );
+static rtsBool closureSatisfiesConstraints( StgClosure* p );
+
/* ----------------------------------------------------------------------------
Closure Type Profiling;
------------------------------------------------------------------------- */
@@ -615,7 +614,6 @@ fprint_ccs(FILE *fp, CostCentreStack *ccs, nat max_length)
}
fprintf(fp, "%s", buf);
}
-#endif /* PROFILING */
rtsBool
strMatchesSelector( char* str, char* sel )
@@ -641,11 +639,13 @@ strMatchesSelector( char* str, char* sel )
}
}
+#endif /* PROFILING */
+
/* -----------------------------------------------------------------------------
* Figure out whether a closure should be counted in this census, by
* testing against all the specified constraints.
* -------------------------------------------------------------------------- */
-rtsBool
+static rtsBool
closureSatisfiesConstraints( StgClosure* p )
{
#if !defined(PROFILING)
@@ -1012,7 +1012,7 @@ heapCensusChain( Census *census, bdescr *bd )
case ARR_WORDS:
prim = rtsTrue;
- size = arr_words_sizeW(stgCast(StgArrWords*,p));
+ size = arr_words_sizeW((StgArrWords*)p);
break;
case MUT_ARR_PTRS_CLEAN:
diff --git a/rts/ProfHeap.h b/rts/ProfHeap.h
index 0251416762..a3da424d24 100644
--- a/rts/ProfHeap.h
+++ b/rts/ProfHeap.h
@@ -12,7 +12,6 @@
extern void heapCensus( void );
extern nat initHeapProfiling( void );
extern void endHeapProfiling( void );
-extern rtsBool closureSatisfiesConstraints( StgClosure* p );
extern void LDV_recordDead( StgClosure *c, nat size );
extern rtsBool strMatchesSelector( char* str, char* sel );
diff --git a/rts/Profiling.c b/rts/Profiling.c
index d729c8a09e..0769b529c0 100644
--- a/rts/Profiling.c
+++ b/rts/Profiling.c
@@ -10,15 +10,13 @@
#include "PosixSource.h"
#include "Rts.h"
+
#include "RtsUtils.h"
-#include "RtsFlags.h"
#include "Profiling.h"
#include "Proftimer.h"
-#include "Timer.h"
#include "ProfHeap.h"
#include "Arena.h"
#include "RetainerProfile.h"
-#include "LdvProfile.h"
#include <string.h>
diff --git a/rts/Proftimer.c b/rts/Proftimer.c
index 32e5c56073..dfcc709625 100644
--- a/rts/Proftimer.c
+++ b/rts/Proftimer.c
@@ -7,14 +7,15 @@
* ---------------------------------------------------------------------------*/
#include "PosixSource.h"
-
#include "Rts.h"
+
#include "Profiling.h"
-#include "Timer.h"
#include "Proftimer.h"
-#include "RtsFlags.h"
+#ifdef PROFILING
static rtsBool do_prof_ticks = rtsFalse; // enable profiling ticks
+#endif
+
static rtsBool do_heap_prof_ticks = rtsFalse; // enable heap profiling ticks
// Number of ticks until next heap census
@@ -23,6 +24,8 @@ static int ticks_to_heap_profile;
// Time for a heap profile on the next context switch
rtsBool performHeapProfile;
+#ifdef PROFILING
+
void
stopProfTimer( void )
{
@@ -35,6 +38,8 @@ startProfTimer( void )
do_prof_ticks = rtsTrue;
}
+#endif
+
void
stopHeapProfTimer( void )
{
diff --git a/rts/Proftimer.h b/rts/Proftimer.h
index c837b855f9..1379792d66 100644
--- a/rts/Proftimer.h
+++ b/rts/Proftimer.h
@@ -12,8 +12,11 @@
extern void initProfTimer ( void );
extern void handleProfTick ( void );
+#ifdef PROFILING
extern void stopProfTimer ( void );
extern void startProfTimer ( void );
+#endif
+
extern void stopHeapProfTimer ( void );
extern void startHeapProfTimer ( void );
diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c
index 2ff916a70a..39c973bd1d 100644
--- a/rts/RaiseAsync.c
+++ b/rts/RaiseAsync.c
@@ -8,17 +8,17 @@
#include "PosixSource.h"
#include "Rts.h"
+
+#include "sm/Storage.h"
#include "Threads.h"
#include "Trace.h"
#include "RaiseAsync.h"
-#include "SMP.h"
#include "Schedule.h"
-#include "LdvProfile.h"
#include "Updates.h"
#include "STM.h"
#include "Sanity.h"
#include "Profiling.h"
-#include "EventLog.h"
+#include "eventlog/EventLog.h"
#if defined(mingw32_HOST_OS)
#include "win32/IOManager.h"
#endif
diff --git a/rts/RetainerProfile.c b/rts/RetainerProfile.c
index 2bd213ad3d..fa12637ef6 100644
--- a/rts/RetainerProfile.c
+++ b/rts/RetainerProfile.c
@@ -16,13 +16,14 @@
#define INLINE inline
#endif
+#include "PosixSource.h"
#include "Rts.h"
+
#include "RtsUtils.h"
#include "RetainerProfile.h"
#include "RetainerSet.h"
#include "Schedule.h"
#include "Printer.h"
-#include "RtsFlags.h"
#include "Weak.h"
#include "Sanity.h"
#include "Profiling.h"
diff --git a/rts/RetainerProfile.h b/rts/RetainerProfile.h
index f33c079f04..5f4503c84b 100644
--- a/rts/RetainerProfile.h
+++ b/rts/RetainerProfile.h
@@ -20,7 +20,7 @@ extern void printRetainer ( FILE *, retainer );
extern void retainerProfile ( void );
extern void resetStaticObjectForRetainerProfiling( StgClosure *static_objects );
-extern StgWord RTS_VAR(flip);
+extern StgWord flip;
// extract the retainer set field from c
#define RSET(c) ((c)->header.prof.hp.rs)
diff --git a/rts/RetainerSet.c b/rts/RetainerSet.c
index 201412b958..5e9b37c04c 100644
--- a/rts/RetainerSet.c
+++ b/rts/RetainerSet.c
@@ -9,15 +9,15 @@
#ifdef PROFILING
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
#include "Stats.h"
#include "RtsUtils.h"
#include "RetainerSet.h"
#include "Arena.h"
#include "Profiling.h"
-#include <stdlib.h>
#include <string.h>
#define HASH_TABLE_SIZE 255
diff --git a/rts/RtsAPI.c b/rts/RtsAPI.c
index df4315fdb8..3eecab14d4 100644
--- a/rts/RtsAPI.c
+++ b/rts/RtsAPI.c
@@ -8,18 +8,15 @@
#include "PosixSource.h"
#include "Rts.h"
-#include "OSThreads.h"
#include "RtsAPI.h"
-#include "SchedAPI.h"
-#include "RtsFlags.h"
+#include "HsFFI.h"
+
#include "RtsUtils.h"
#include "Prelude.h"
#include "Schedule.h"
#include "Capability.h"
#include "Stable.h"
-#include <stdlib.h>
-
/* ----------------------------------------------------------------------------
Building Haskell objects from C datatypes.
diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c
index 856137119c..1204c59356 100644
--- a/rts/RtsFlags.c
+++ b/rts/RtsFlags.c
@@ -9,7 +9,7 @@
#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
#include "RtsUtils.h"
#include "Profiling.h"
@@ -17,7 +17,6 @@
#include <ctype.h>
#endif
-#include <stdlib.h>
#include <string.h>
// Flag Structure
@@ -1272,7 +1271,7 @@ decode(const char *s)
return (I_)m;
}
-static void
+static void GNU_ATTRIBUTE(__noreturn__)
bad_option(const char *s)
{
errorBelch("bad RTS option: %s", s);
diff --git a/rts/RtsMain.c b/rts/RtsMain.c
index 438110a179..b6cf546aea 100644
--- a/rts/RtsMain.c
+++ b/rts/RtsMain.c
@@ -11,8 +11,7 @@
#include "PosixSource.h"
#include "Rts.h"
#include "RtsAPI.h"
-#include "SchedAPI.h"
-#include "RtsFlags.h"
+
#include "RtsUtils.h"
#include "RtsMain.h"
#include "Prelude.h"
@@ -20,7 +19,6 @@
#if defined(mingw32_HOST_OS)
#include "win32/seh_excn.h"
#endif
-#include <stdlib.h>
#ifdef DEBUG
# include "Printer.h" /* for printing */
diff --git a/rts/RtsMessages.c b/rts/RtsMessages.c
index c263a2cf57..ef5c5a226c 100644
--- a/rts/RtsMessages.c
+++ b/rts/RtsMessages.c
@@ -128,7 +128,7 @@ isGUIApp(void)
#define xstr(s) str(s)
#define str(s) #s
-void
+void GNU_ATTRIBUTE(__noreturn__)
rtsFatalInternalErrorFn(const char *s, va_list ap)
{
#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
diff --git a/rts/RtsSignals.h b/rts/RtsSignals.h
index e130fb4281..601a46b79c 100644
--- a/rts/RtsSignals.h
+++ b/rts/RtsSignals.h
@@ -6,8 +6,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef RTS_SIGNALS_H
-#define RTS_SIGNALS_H
+#ifndef RTSSIGNALS_H
+#define RTSSIGNALS_H
#if !defined(mingw32_HOST_OS)
@@ -17,12 +17,11 @@
#include "win32/ConsoleHandler.h"
-#else /* PAR */
+#else
#define signals_pending() (rtsFalse)
-#endif /* PAR */
-
+#endif
#if RTS_USER_SIGNALS
@@ -78,4 +77,4 @@ extern void markSignalHandlers (evac_fn evac, void *user);
#endif /* RTS_USER_SIGNALS */
-#endif /* RTS_SIGNALS_H */
+#endif /* RTSSIGNALS_H */
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index c21aac767c..2c1c5549f1 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -7,42 +7,38 @@
* ---------------------------------------------------------------------------*/
// PAPI uses caddr_t, which is not POSIX
-// #include "PosixSource.h"
+#ifndef USE_PAPI
+#include "PosixSource.h"
+#endif
#include "Rts.h"
#include "RtsAPI.h"
+#include "HsFFI.h"
+
+#include "sm/Storage.h"
#include "RtsUtils.h"
-#include "RtsFlags.h"
-#include "OSThreads.h"
#include "Schedule.h" /* initScheduler */
#include "Stats.h" /* initStats */
#include "STM.h" /* initSTM */
-#include "Signals.h"
#include "RtsSignals.h"
-#include "ThrIOManager.h"
-#include "Timer.h" /* startTimer, stopTimer */
#include "Weak.h"
#include "Ticky.h"
#include "StgRun.h"
#include "Prelude.h" /* fixupRTStoPreludeRefs */
-#include "HsFFI.h"
-#include "Linker.h"
#include "ThreadLabels.h"
-#include "BlockAlloc.h"
+#include "sm/BlockAlloc.h"
#include "Trace.h"
-#include "RtsGlobals.h"
#include "Stable.h"
-#include "Hpc.h"
-#include "FileLock.h"
-#include "EventLog.h"
+#include "eventlog/EventLog.h"
#include "Hash.h"
+#include "Profiling.h"
+#include "Timer.h"
+#include "Globals.h"
#if defined(RTS_GTK_FRONTPANEL)
#include "FrontPanel.h"
#endif
-# include "Profiling.h"
-
#if defined(PROFILING)
# include "ProfHeap.h"
# include "RetainerProfile.h"
@@ -52,14 +48,11 @@
#include "win32/AsyncIO.h"
#endif
-#include <stdlib.h>
-
-#ifdef HAVE_TERMIOS_H
-#include <termios.h>
-#endif
-#ifdef HAVE_SIGNAL_H
-#include <signal.h>
+#if !defined(mingw32_HOST_OS)
+#include "posix/TTY.h"
+#include "posix/FileLock.h"
#endif
+
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
@@ -74,26 +67,6 @@
// Count of how many outstanding hs_init()s there have been.
static int hs_init_count = 0;
-// Here we save the terminal settings on the standard file
-// descriptors, if we need to change them (eg. to support NoBuffering
-// input).
-static void *saved_termios[3] = {NULL,NULL,NULL};
-
-void*
-__hscore_get_saved_termios(int fd)
-{
- return (0 <= fd && fd < (int)(sizeof(saved_termios) / sizeof(*saved_termios))) ?
- saved_termios[fd] : NULL;
-}
-
-void
-__hscore_set_saved_termios(int fd, void* ts)
-{
- if (0 <= fd && fd < (int)(sizeof(saved_termios) / sizeof(*saved_termios))) {
- saved_termios[fd] = ts;
- }
-}
-
/* -----------------------------------------------------------------------------
Initialise floating point unit on x86 (currently disabled. why?)
(see comment in ghc/compiler/nativeGen/MachInstrs.lhs).
@@ -292,7 +265,7 @@ startupHaskell(int argc, char *argv[], void (*init_root)(void))
/* The init functions use an explicit stack...
*/
#define INIT_STACK_BLOCKS 4
-static F_ *init_stack = NULL;
+static StgFunPtr *init_stack = NULL;
void
hs_add_root(void (*init_root)(void))
@@ -311,10 +284,10 @@ hs_add_root(void (*init_root)(void))
to the last occupied word */
init_sp = INIT_STACK_BLOCKS*BLOCK_SIZE_W;
bd = allocGroup_lock(INIT_STACK_BLOCKS);
- init_stack = (F_ *)bd->start;
- init_stack[--init_sp] = (F_)stg_init_finish;
+ init_stack = (StgFunPtr *)bd->start;
+ init_stack[--init_sp] = (StgFunPtr)stg_init_finish;
if (init_root != NULL) {
- init_stack[--init_sp] = (F_)init_root;
+ init_stack[--init_sp] = (StgFunPtr)init_root;
}
cap->r.rSp = (P_)(init_stack + init_sp);
@@ -391,30 +364,9 @@ hs_exit_(rtsBool wait_foreign)
stopTimer();
exitTimer();
- /* reset the standard file descriptors to blocking mode */
- resetNonBlockingFd(0);
- resetNonBlockingFd(1);
- resetNonBlockingFd(2);
-
-#if HAVE_TERMIOS_H
- // Reset the terminal settings on the standard file descriptors,
- // if we changed them. See System.Posix.Internals.tcSetAttr for
- // more details, including the reason we termporarily disable
- // SIGTTOU here.
- {
- int fd;
- sigset_t sigset, old_sigset;
- sigemptyset(&sigset);
- sigaddset(&sigset, SIGTTOU);
- sigprocmask(SIG_BLOCK, &sigset, &old_sigset);
- for (fd = 0; fd <= 2; fd++) {
- struct termios* ts = (struct termios*)__hscore_get_saved_termios(fd);
- if (ts != NULL) {
- tcsetattr(fd,TCSANOW,ts);
- }
- }
- sigprocmask(SIG_SETMASK, &old_sigset, NULL);
- }
+ // set the terminal settings back to what they were
+#if !defined(mingw32_HOST_OS)
+ resetTerminalSettings();
#endif
// uninstall signal handlers
diff --git a/rts/RtsUtils.c b/rts/RtsUtils.c
index ed082a31f4..1953e1e838 100644
--- a/rts/RtsUtils.c
+++ b/rts/RtsUtils.c
@@ -7,10 +7,9 @@
* ---------------------------------------------------------------------------*/
#include "PosixSource.h"
-
#include "Rts.h"
#include "RtsAPI.h"
-#include "RtsFlags.h"
+
#include "RtsUtils.h"
#include "Ticky.h"
#include "Schedule.h"
@@ -284,22 +283,6 @@ heapOverflow(void)
}
/* -----------------------------------------------------------------------------
- Out-of-line strlen.
-
- Used in addr2Integer because the C compiler on x86 chokes on
- strlen, trying to inline it with not enough registers available.
- -------------------------------------------------------------------------- */
-
-nat stg_strlen(char *s)
-{
- char *p = s;
-
- while (*p) p++;
- return p-s;
-}
-
-
-/* -----------------------------------------------------------------------------
genSym stuff, used by GHC itself for its splitting unique supply.
ToDo: put this somewhere sensible.
@@ -343,44 +326,6 @@ time_str(void)
}
/* -----------------------------------------------------------------------------
- * Reset a file handle to blocking mode. We do this for the standard
- * file descriptors before exiting, because the shell doesn't always
- * clean up for us.
- * -------------------------------------------------------------------------- */
-
-#if !defined(mingw32_HOST_OS)
-void
-resetNonBlockingFd(int fd)
-{
- long fd_flags;
-
- /* clear the non-blocking flag on this file descriptor */
- fd_flags = fcntl(fd, F_GETFL);
- if (fd_flags & O_NONBLOCK) {
- fcntl(fd, F_SETFL, fd_flags & ~O_NONBLOCK);
- }
-}
-
-void
-setNonBlockingFd(int fd)
-{
- long fd_flags;
-
- /* clear the non-blocking flag on this file descriptor */
- fd_flags = fcntl(fd, F_GETFL);
- if (!(fd_flags & O_NONBLOCK)) {
- fcntl(fd, F_SETFL, fd_flags | O_NONBLOCK);
- }
-}
-#else
-/* Stub defns -- async / non-blocking IO is not done
- * via O_NONBLOCK and select() under Win32.
- */
-void resetNonBlockingFd(int fd STG_UNUSED) {}
-void setNonBlockingFd(int fd STG_UNUSED) {}
-#endif
-
-/* -----------------------------------------------------------------------------
Print large numbers, with punctuation.
-------------------------------------------------------------------------- */
diff --git a/rts/RtsUtils.h b/rts/RtsUtils.h
index 11a2826596..14856bf943 100644
--- a/rts/RtsUtils.h
+++ b/rts/RtsUtils.h
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1998-2005
+ * (c) The GHC Team, 1998-2009
*
* General utility functions used in the RTS.
*
@@ -13,42 +13,44 @@
* (Checked) dynamic allocation
* -------------------------------------------------------------------------- */
-extern void initAllocator(void);
-extern void shutdownAllocator(void);
+void initAllocator(void);
+void shutdownAllocator(void);
-extern void *stgMallocBytes(int n, char *msg)
+void *stgMallocBytes(int n, char *msg)
GNUC3_ATTRIBUTE(__malloc__);
-extern void *stgReallocBytes(void *p, int n, char *msg);
+void *stgReallocBytes(void *p, int n, char *msg);
-extern void *stgCallocBytes(int n, int m, char *msg)
+void *stgCallocBytes(int n, int m, char *msg)
GNUC3_ATTRIBUTE(__malloc__);
-extern void stgFree(void* p);
+void stgFree(void* p);
/* -----------------------------------------------------------------------------
* Misc other utilities
* -------------------------------------------------------------------------- */
-extern void heapOverflow(void);
+void heapOverflow(void);
-extern void setNonBlockingFd(int fd);
-extern void resetNonBlockingFd(int fd);
-
-extern nat stg_strlen(char *str);
-
-extern char *time_str(void);
-extern char *ullong_format_string(ullong, char *, rtsBool);
+char *time_str(void);
+char *ullong_format_string(ullong, char *, rtsBool);
#ifdef DEBUG
-extern void heapCheckFail( void );
+void heapCheckFail( void );
#endif
-extern void* __hscore_get_saved_termios(int fd);
-extern void __hscore_set_saved_termios(int fd, void* ts);
+// XXX shouldn't be here
+void* __hscore_get_saved_termios(int fd);
+void __hscore_set_saved_termios(int fd, void* ts);
void printRtsInfo(void);
+HsInt genSymZh(void);
+HsInt resetGenSymZh(void);
+
+/* Alternate to raise(3) for threaded rts, for OpenBSD */
+int genericRaise(int sig);
+
int rts_isProfiled(void);
#endif /* RTSUTILS_H */
diff --git a/rts/STM.c b/rts/STM.c
index b9be955f55..723f77acb6 100644
--- a/rts/STM.c
+++ b/rts/STM.c
@@ -74,25 +74,24 @@
* (d) release the locks on the TVars, writing updates to them in the case of a
* commit, (e) unlock the STM.
*
- * Queues of waiting threads hang off the first_watch_queue_entry field of each
- * TVar. This may only be manipulated when holding that TVar's lock. In
- * particular, when a thread is putting itself to sleep, it mustn't release
- * the TVar's lock until it has added itself to the wait queue and marked its
- * TSO as BlockedOnSTM -- this makes sure that other threads will know to wake it.
+ * Queues of waiting threads hang off the first_watch_queue_entry
+ * field of each TVar. This may only be manipulated when holding that
+ * TVar's lock. In particular, when a thread is putting itself to
+ * sleep, it mustn't release the TVar's lock until it has added itself
+ * to the wait queue and marked its TSO as BlockedOnSTM -- this makes
+ * sure that other threads will know to wake it.
*
* ---------------------------------------------------------------------------*/
#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
#include "RtsUtils.h"
-#include "Storage.h"
#include "Schedule.h"
-#include "SMP.h"
#include "STM.h"
#include "Trace.h"
+#include "Threads.h"
-#include <stdlib.h>
#include <stdio.h>
#define TRUE 1
diff --git a/includes/STM.h b/rts/STM.h
index 3bf976551d..3bf976551d 100644
--- a/includes/STM.h
+++ b/rts/STM.h
diff --git a/rts/Sanity.c b/rts/Sanity.c
index 02d81ed7ce..d666d57f3b 100644
--- a/rts/Sanity.c
+++ b/rts/Sanity.c
@@ -18,14 +18,13 @@
#ifdef DEBUG /* whole file */
-#include "RtsFlags.h"
#include "RtsUtils.h"
-#include "BlockAlloc.h"
+#include "sm/Storage.h"
+#include "sm/BlockAlloc.h"
#include "Sanity.h"
-#include "MBlock.h"
-#include "Storage.h"
#include "Schedule.h"
#include "Apply.h"
+#include "Printer.h"
/* -----------------------------------------------------------------------------
Forward decls.
diff --git a/rts/Sanity.h b/rts/Sanity.h
index 48f3383714..3020246a70 100644
--- a/rts/Sanity.h
+++ b/rts/Sanity.h
@@ -7,6 +7,7 @@
* ---------------------------------------------------------------------------*/
#ifndef SANITY_H
+#define SANITY_H
#ifdef DEBUG
@@ -39,4 +40,3 @@ extern rtsBool isBlackhole( StgTSO* tso, StgClosure* p );
#endif /* DEBUG */
#endif /* SANITY_H */
-
diff --git a/rts/Schedule.c b/rts/Schedule.c
index c840c78644..b3d523e111 100644
--- a/rts/Schedule.c
+++ b/rts/Schedule.c
@@ -9,34 +9,25 @@
#include "PosixSource.h"
#define KEEP_LOCKCLOSURE
#include "Rts.h"
-#include "SchedAPI.h"
+
+#include "sm/Storage.h"
#include "RtsUtils.h"
-#include "RtsFlags.h"
-#include "OSThreads.h"
-#include "Storage.h"
#include "StgRun.h"
-#include "Hooks.h"
#include "Schedule.h"
-#include "StgMiscClosures.h"
#include "Interpreter.h"
#include "Printer.h"
#include "RtsSignals.h"
#include "Sanity.h"
#include "Stats.h"
#include "STM.h"
-#include "Timer.h"
#include "Prelude.h"
#include "ThreadLabels.h"
-#include "LdvProfile.h"
#include "Updates.h"
#include "Proftimer.h"
#include "ProfHeap.h"
-#include "GC.h"
#include "Weak.h"
-#include "EventLog.h"
-
-/* PARALLEL_HASKELL includes go here */
-
+#include "eventlog/EventLog.h"
+#include "sm/GC.h" // waitForGcThreads, releaseGCThreads, N
#include "Sparks.h"
#include "Capability.h"
#include "Task.h"
@@ -47,7 +38,8 @@
#include "Trace.h"
#include "RaiseAsync.h"
#include "Threads.h"
-#include "ThrIOManager.h"
+#include "Timer.h"
+#include "ThreadPaused.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
@@ -64,12 +56,6 @@
#include <errno.h>
#endif
-// Turn off inlining when debugging - it obfuscates things
-#ifdef DEBUG
-# undef STATIC_INLINE
-# define STATIC_INLINE static
-#endif
-
/* -----------------------------------------------------------------------------
* Global variables
* -------------------------------------------------------------------------- */
@@ -2383,7 +2369,9 @@ interruptStgRts(void)
{
sched_state = SCHED_INTERRUPTING;
setContextSwitches();
+#if defined(THREADED_RTS)
wakeUpRts();
+#endif
}
/* -----------------------------------------------------------------------------
@@ -2399,16 +2387,15 @@ interruptStgRts(void)
will have interrupted any blocking system call in progress anyway.
-------------------------------------------------------------------------- */
-void
-wakeUpRts(void)
-{
#if defined(THREADED_RTS)
+void wakeUpRts(void)
+{
// This forces the IO Manager thread to wakeup, which will
// in turn ensure that some OS thread wakes up and runs the
// scheduler loop, which will cause a GC and deadlock check.
ioManagerWakeup();
-#endif
}
+#endif
/* -----------------------------------------------------------------------------
* checkBlackHoles()
diff --git a/rts/Schedule.h b/rts/Schedule.h
index 0e18168755..378bd68c66 100644
--- a/rts/Schedule.h
+++ b/rts/Schedule.h
@@ -10,9 +10,9 @@
#ifndef SCHEDULE_H
#define SCHEDULE_H
-#include "OSThreads.h"
+#include "rts/OSThreads.h"
#include "Capability.h"
-#include "EventLog.h"
+#include "eventlog/EventLog.h"
/* initScheduler(), exitScheduler()
* Called from STG : no
@@ -30,28 +30,13 @@ void scheduleThread (Capability *cap, StgTSO *tso);
// the desired Capability).
void scheduleThreadOn(Capability *cap, StgWord cpu, StgTSO *tso);
-/* awakenBlockedQueue()
- *
- * Takes a pointer to the beginning of a blocked TSO queue, and
- * wakes up the entire queue.
- * Called from STG : yes
- * Locks assumed : none
- */
-void awakenBlockedQueue (Capability *cap, StgTSO *tso);
-
/* wakeUpRts()
*
* Causes an OS thread to wake up and run the scheduler, if necessary.
*/
+#if defined(THREADED_RTS)
void wakeUpRts(void);
-
-/* unblockOne()
- *
- * Put the specified thread on the run queue of the given Capability.
- * Called from STG : yes
- * Locks assumed : we own the Capability.
- */
-StgTSO * unblockOne (Capability *cap, StgTSO *tso);
+#endif
/* raiseExceptionHelper */
StgWord raiseExceptionHelper (StgRegTable *reg, StgTSO *tso, StgClosure *exception);
@@ -69,11 +54,6 @@ StgWord findRetryFrameHelper (StgTSO *tso);
void OSThreadProcAttr workerStart(Task *task);
#endif
-char *info_type(StgClosure *closure); // dummy
-char *info_type_by_ip(StgInfoTable *ip); // dummy
-void awaken_blocked_queue(StgTSO *q);
-void initThread(StgTSO *tso, nat stack_size);
-
/* The state of the scheduler. This is used to control the sequence
* of events during shutdown, and when the runtime is interrupted
* using ^C.
@@ -82,7 +62,7 @@ void initThread(StgTSO *tso, nat stack_size);
#define SCHED_INTERRUPTING 1 /* ^C detected, before threads are deleted */
#define SCHED_SHUTTING_DOWN 2 /* final shutdown */
-extern volatile StgWord RTS_VAR(sched_state);
+extern volatile StgWord sched_state;
/*
* flag that tracks whether we have done any execution in this time slice.
@@ -105,10 +85,10 @@ extern volatile StgWord recent_activity;
*
* In GranSim we have one run/blocked_queue per PE.
*/
-extern StgTSO *RTS_VAR(blackhole_queue);
+extern StgTSO *blackhole_queue;
#if !defined(THREADED_RTS)
-extern StgTSO *RTS_VAR(blocked_queue_hd), *RTS_VAR(blocked_queue_tl);
-extern StgTSO *RTS_VAR(sleeping_queue);
+extern StgTSO *blocked_queue_hd, *blocked_queue_tl;
+extern StgTSO *sleeping_queue;
#endif
/* Set to rtsTrue if there are threads on the blackhole_queue, and
@@ -123,27 +103,15 @@ extern rtsBool blackholes_need_checking;
extern rtsBool heap_overflow;
#if defined(THREADED_RTS)
-extern Mutex RTS_VAR(sched_mutex);
+extern Mutex sched_mutex;
#endif
-SchedulerStatus rts_mainLazyIO(HaskellObj p, /*out*/HaskellObj *ret);
-
/* Called by shutdown_handler(). */
void interruptStgRts (void);
-nat run_queue_len (void);
-
void resurrectThreads (StgTSO *);
void performPendingThrowTos (StgTSO *);
-void printAllThreads(void);
-
-/* debugging only
- */
-#ifdef DEBUG
-void print_bq (StgClosure *node);
-#endif
-
/* -----------------------------------------------------------------------------
* Some convenient macros/inline functions...
*/
diff --git a/rts/Sparks.c b/rts/Sparks.c
index 0fe8b61b81..ff4beb7fd5 100644
--- a/rts/Sparks.c
+++ b/rts/Sparks.c
@@ -8,17 +8,11 @@
#include "PosixSource.h"
#include "Rts.h"
-#include "Storage.h"
+
#include "Schedule.h"
-#include "SchedAPI.h"
-#include "RtsFlags.h"
#include "RtsUtils.h"
-#include "ParTicky.h"
#include "Trace.h"
#include "Prelude.h"
-
-#include "SMP.h" // for cas
-
#include "Sparks.h"
#if defined(THREADED_RTS)
@@ -128,8 +122,6 @@ pruneSparkQueue (evac_fn evac, void *user, Capability *cap)
StgWord botInd,oldBotInd,currInd; // indices in array (always < size)
const StgInfoTable *info;
- PAR_TICKY_MARK_SPARK_QUEUE_START();
-
n = 0;
pruned_sparks = 0;
@@ -246,8 +238,6 @@ pruneSparkQueue (evac_fn evac, void *user, Capability *cap)
pool->bottom = (oldBotInd <= botInd) ? botInd : (botInd + pool->size);
// first free place we did not use (corrected by wraparound)
- PAR_TICKY_MARK_SPARK_QUEUE_END(n);
-
debugTrace(DEBUG_sched, "pruned %d sparks", pruned_sparks);
debugTrace(DEBUG_sched,
@@ -296,7 +286,8 @@ traverseSparkQueue (evac_fn evac, void *user, Capability *cap)
*
* Could be called after GC, before Cap. release, from scheduler.
* -------------------------------------------------------------------------- */
-void balanceSparkPoolsCaps(nat n_caps, Capability caps[]);
+void balanceSparkPoolsCaps(nat n_caps, Capability caps[])
+ GNUC3_ATTRIBUTE(__noreturn__);
void balanceSparkPoolsCaps(nat n_caps STG_UNUSED,
Capability caps[] STG_UNUSED) {
diff --git a/rts/Stable.c b/rts/Stable.c
index 97796b89a7..b427c94965 100644
--- a/rts/Stable.c
+++ b/rts/Stable.c
@@ -8,13 +8,10 @@
#include "PosixSource.h"
#include "Rts.h"
+#include "RtsAPI.h"
+
#include "Hash.h"
#include "RtsUtils.h"
-#include "OSThreads.h"
-#include "Storage.h"
-#include "RtsAPI.h"
-#include "RtsFlags.h"
-#include "OSThreads.h"
#include "Trace.h"
#include "Stable.h"
@@ -83,6 +80,8 @@ static unsigned int SPT_size = 0;
static Mutex stable_mutex;
#endif
+static void enlargeStablePtrTable(void);
+
/* This hash table maps Haskell objects to stable names, so that every
* call to lookupStableName on a given object will return the same
* stable name.
@@ -300,7 +299,7 @@ freeStablePtr(StgStablePtr sp)
RELEASE_LOCK(&stable_mutex);
}
-void
+static void
enlargeStablePtrTable(void)
{
nat old_SPT_size = SPT_size;
diff --git a/rts/Stable.h b/rts/Stable.h
new file mode 100644
index 0000000000..258a6bea80
--- /dev/null
+++ b/rts/Stable.h
@@ -0,0 +1,34 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2004
+ *
+ * Stable Pointers: A stable pointer is represented as an index into
+ * the stable pointer table.
+ *
+ * StgStablePtr used to be a synonym for StgWord, but stable pointers
+ * are guaranteed to be void* on the C-side, so we have to do some
+ * occasional casting. Size is not a matter, because StgWord is always
+ * the same size as a void*.
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef STABLE_H
+#define STABLE_H
+
+#include "sm/GC.h" // for evac_fn below
+
+void freeStablePtr (StgStablePtr sp);
+
+void initStablePtrTable ( void );
+void exitStablePtrTable ( void );
+StgWord lookupStableName ( StgPtr p );
+
+void markStablePtrTable ( evac_fn evac, void *user );
+void threadStablePtrTable ( evac_fn evac, void *user );
+void gcStablePtrTable ( void );
+void updateStablePtrTable ( rtsBool full );
+
+void stablePtrPreGC ( void );
+void stablePtrPostGC ( void );
+
+#endif /* STABLE_H */
diff --git a/rts/Stats.c b/rts/Stats.c
index ae3d843157..6029745368 100644
--- a/rts/Stats.c
+++ b/rts/Stats.c
@@ -6,17 +6,16 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
#include "RtsUtils.h"
-#include "MBlock.h"
-#include "Storage.h"
#include "Schedule.h"
#include "Stats.h"
-#include "ParTicky.h" /* ToDo: move into Rts.h */
#include "Profiling.h"
#include "GetTime.h"
-#include "GC.h"
+#include "sm/Storage.h"
+#include "sm/GC.h" // gc_alloc_block_sync, whitehole_spin
#if USE_PAPI
#include "Papi.h"
@@ -506,21 +505,11 @@ stat_endHeapCensus(void)
-------------------------------------------------------------------------- */
#ifdef DEBUG
-#define TICK_VAR(arity) \
- extern StgInt SLOW_CALLS_##arity; \
- extern StgInt RIGHT_ARITY_##arity; \
- extern StgInt TAGGED_PTR_##arity;
-
#define TICK_VAR_INI(arity) \
StgInt SLOW_CALLS_##arity = 1; \
StgInt RIGHT_ARITY_##arity = 1; \
StgInt TAGGED_PTR_##arity = 0;
-extern StgInt TOTAL_CALLS;
-
-TICK_VAR(1)
-TICK_VAR(2)
-
TICK_VAR_INI(1)
TICK_VAR_INI(2)
diff --git a/rts/Stats.h b/rts/Stats.h
index bd39ced57d..4b98739fe2 100644
--- a/rts/Stats.h
+++ b/rts/Stats.h
@@ -51,7 +51,6 @@ double mut_user_time_during_heap_census(void);
#endif /* PROFILING */
void statDescribeGens( void );
-HsInt64 getAllocations( void );
Ticks stat_getElapsedGCTime(void);
Ticks stat_getElapsedTime(void);
diff --git a/rts/StgCRun.c b/rts/StgCRun.c
index a211da3577..92ce6ebb19 100644
--- a/rts/StgCRun.c
+++ b/rts/StgCRun.c
@@ -34,7 +34,6 @@
#include "PosixSource.h"
-
/*
* We define the following (unused) global register variables, because for
* some reason gcc generates sub-optimal code for StgRun() on the Alpha
@@ -70,9 +69,8 @@ register double fake_f9 __asm__("$f9");
#define IN_STGCRUN 1
#include "Stg.h"
#include "Rts.h"
+
#include "StgRun.h"
-#include "RtsFlags.h"
-#include "OSThreads.h"
#include "Capability.h"
#ifdef DEBUG
diff --git a/rts/StgPrimFloat.c b/rts/StgPrimFloat.c
index 5987aa9589..e523f328c3 100644
--- a/rts/StgPrimFloat.c
+++ b/rts/StgPrimFloat.c
@@ -10,7 +10,12 @@
#include "PosixSource.h"
#include "Rts.h"
+#include "StgPrimFloat.h"
+
#include <math.h>
+#include <float.h>
+
+#define IEEE_FLOATING_POINT 1
/*
* Encoding and decoding Doubles. Code based on the HBC code
@@ -218,252 +223,3 @@ __decodeFloat_Int (I_ *man, I_ *exp, StgFloat flt)
}
}
-union stg_ieee754_flt
-{
- float f;
- struct {
-
-#if WORDS_BIGENDIAN
- unsigned int negative:1;
- unsigned int exponent:8;
- unsigned int mantissa:23;
-#else
- unsigned int mantissa:23;
- unsigned int exponent:8;
- unsigned int negative:1;
-#endif
- } ieee;
- struct {
-
-#if WORDS_BIGENDIAN
- unsigned int negative:1;
- unsigned int exponent:8;
- unsigned int quiet_nan:1;
- unsigned int mantissa:22;
-#else
- unsigned int mantissa:22;
- unsigned int quiet_nan:1;
- unsigned int exponent:8;
- unsigned int negative:1;
-#endif
- } ieee_nan;
-};
-
-/*
-
- To recap, here's the representation of a double precision
- IEEE floating point number:
-
- sign 63 sign bit (0==positive, 1==negative)
- exponent 62-52 exponent (biased by 1023)
- fraction 51-0 fraction (bits to right of binary point)
-*/
-
-union stg_ieee754_dbl
-{
- double d;
- struct {
-
-#if WORDS_BIGENDIAN
- unsigned int negative:1;
- unsigned int exponent:11;
- unsigned int mantissa0:20;
- unsigned int mantissa1:32;
-#else
-#if FLOAT_WORDS_BIGENDIAN
- unsigned int mantissa0:20;
- unsigned int exponent:11;
- unsigned int negative:1;
- unsigned int mantissa1:32;
-#else
- unsigned int mantissa1:32;
- unsigned int mantissa0:20;
- unsigned int exponent:11;
- unsigned int negative:1;
-#endif
-#endif
- } ieee;
- /* This format makes it easier to see if a NaN is a signalling NaN. */
- struct {
-
-#if WORDS_BIGENDIAN
- unsigned int negative:1;
- unsigned int exponent:11;
- unsigned int quiet_nan:1;
- unsigned int mantissa0:19;
- unsigned int mantissa1:32;
-#else
-#if FLOAT_WORDS_BIGENDIAN
- unsigned int mantissa0:19;
- unsigned int quiet_nan:1;
- unsigned int exponent:11;
- unsigned int negative:1;
- unsigned int mantissa1:32;
-#else
- unsigned int mantissa1:32;
- unsigned int mantissa0:19;
- unsigned int quiet_nan:1;
- unsigned int exponent:11;
- unsigned int negative:1;
-#endif
-#endif
- } ieee_nan;
-};
-
-/*
- * Predicates for testing for extreme IEEE fp values. Used
- * by the bytecode evaluator and the Prelude.
- *
- */
-
-/* In case you don't suppport IEEE, you'll just get dummy defs.. */
-#ifdef IEEE_FLOATING_POINT
-
-StgInt
-isDoubleNaN(StgDouble d)
-{
- union stg_ieee754_dbl u;
-
- u.d = d;
-
- return (
- u.ieee.exponent == 2047 /* 2^11 - 1 */ && /* Is the exponent all ones? */
- (u.ieee.mantissa0 != 0 || u.ieee.mantissa1 != 0)
- /* and the mantissa non-zero? */
- );
-}
-
-StgInt
-isDoubleInfinite(StgDouble d)
-{
- union stg_ieee754_dbl u;
-
- u.d = d;
-
- /* Inf iff exponent is all ones, mantissa all zeros */
- return (
- u.ieee.exponent == 2047 /* 2^11 - 1 */ &&
- u.ieee.mantissa0 == 0 &&
- u.ieee.mantissa1 == 0
- );
-}
-
-StgInt
-isDoubleDenormalized(StgDouble d)
-{
- union stg_ieee754_dbl u;
-
- u.d = d;
-
- /* A (single/double/quad) precision floating point number
- is denormalised iff:
- - exponent is zero
- - mantissa is non-zero.
- - (don't care about setting of sign bit.)
-
- */
- return (
- u.ieee.exponent == 0 &&
- (u.ieee.mantissa0 != 0 ||
- u.ieee.mantissa1 != 0)
- );
-
-}
-
-StgInt
-isDoubleNegativeZero(StgDouble d)
-{
- union stg_ieee754_dbl u;
-
- u.d = d;
- /* sign (bit 63) set (only) => negative zero */
-
- return (
- u.ieee.negative == 1 &&
- u.ieee.exponent == 0 &&
- u.ieee.mantissa0 == 0 &&
- u.ieee.mantissa1 == 0);
-}
-
-/* Same tests, this time for StgFloats. */
-
-/*
- To recap, here's the representation of a single precision
- IEEE floating point number:
-
- sign 31 sign bit (0 == positive, 1 == negative)
- exponent 30-23 exponent (biased by 127)
- fraction 22-0 fraction (bits to right of binary point)
-*/
-
-
-StgInt
-isFloatNaN(StgFloat f)
-{
- union stg_ieee754_flt u;
- u.f = f;
-
- /* Floating point NaN iff exponent is all ones, mantissa is
- non-zero (but see below.) */
- return (
- u.ieee.exponent == 255 /* 2^8 - 1 */ &&
- u.ieee.mantissa != 0);
-}
-
-StgInt
-isFloatInfinite(StgFloat f)
-{
- union stg_ieee754_flt u;
- u.f = f;
-
- /* A float is Inf iff exponent is max (all ones),
- and mantissa is min(all zeros.) */
- return (
- u.ieee.exponent == 255 /* 2^8 - 1 */ &&
- u.ieee.mantissa == 0);
-}
-
-StgInt
-isFloatDenormalized(StgFloat f)
-{
- union stg_ieee754_flt u;
- u.f = f;
-
- /* A (single/double/quad) precision floating point number
- is denormalised iff:
- - exponent is zero
- - mantissa is non-zero.
- - (don't care about setting of sign bit.)
-
- */
- return (
- u.ieee.exponent == 0 &&
- u.ieee.mantissa != 0);
-}
-
-StgInt
-isFloatNegativeZero(StgFloat f)
-{
- union stg_ieee754_flt u;
- u.f = f;
-
- /* sign (bit 31) set (only) => negative zero */
- return (
- u.ieee.negative &&
- u.ieee.exponent == 0 &&
- u.ieee.mantissa == 0);
-}
-
-#else /* ! IEEE_FLOATING_POINT */
-
-/* Dummy definitions of predicates - they all return false */
-StgInt isDoubleNaN(d) StgDouble d; { return 0; }
-StgInt isDoubleInfinite(d) StgDouble d; { return 0; }
-StgInt isDoubleDenormalized(d) StgDouble d; { return 0; }
-StgInt isDoubleNegativeZero(d) StgDouble d; { return 0; }
-StgInt isFloatNaN(f) StgFloat f; { return 0; }
-StgInt isFloatInfinite(f) StgFloat f; { return 0; }
-StgInt isFloatDenormalized(f) StgFloat f; { return 0; }
-StgInt isFloatNegativeZero(f) StgFloat f; { return 0; }
-
-#endif /* ! IEEE_FLOATING_POINT */
diff --git a/rts/StgPrimFloat.h b/rts/StgPrimFloat.h
new file mode 100644
index 0000000000..5de8360efd
--- /dev/null
+++ b/rts/StgPrimFloat.h
@@ -0,0 +1,21 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2009
+ *
+ * Primitive floating-point operations
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef STGPRIMFLOAT_H
+#define STGPRIMFLOAT_H
+
+/* grimy low-level support functions defined in StgPrimFloat.c */
+extern void __decodeDouble_2Int (I_ *man_sign, W_ *man_high, W_ *man_low, I_ *exp, StgDouble dbl);
+extern void __decodeFloat_Int (I_ *man, I_ *exp, StgFloat flt);
+extern StgDouble __2Int_encodeDouble (I_ j_high, I_ j_low, I_ e);
+extern StgDouble __int_encodeDouble (I_ j, I_ e);
+extern StgDouble __word_encodeDouble (W_ j, I_ e);
+extern StgFloat __int_encodeFloat (I_ j, I_ e);
+extern StgFloat __word_encodeFloat (W_ j, I_ e);
+
+#endif /* STGPRIMFLOAT_H */
diff --git a/rts/Task.c b/rts/Task.c
index af94a8aabe..9a8ebd6963 100644
--- a/rts/Task.c
+++ b/rts/Task.c
@@ -8,14 +8,13 @@
*
* -------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
+
#include "RtsUtils.h"
-#include "OSThreads.h"
#include "Task.h"
#include "Capability.h"
#include "Stats.h"
-#include "RtsFlags.h"
-#include "Storage.h"
#include "Schedule.h"
#include "Hash.h"
#include "Trace.h"
@@ -258,15 +257,15 @@ taskTimeStamp (Task *task USED_IF_THREADS)
#endif
}
+#if defined(THREADED_RTS)
+
void
workerTaskStop (Task *task)
{
-#if defined(THREADED_RTS)
OSThreadId id;
id = osThreadId();
ASSERT(task->id == id);
ASSERT(myTask() == task);
-#endif
task->cap = NULL;
taskTimeStamp(task);
@@ -280,12 +279,7 @@ workerTaskStop (Task *task)
RELEASE_LOCK(&sched_mutex);
}
-void
-resetTaskManagerAfterFork (void)
-{
- // TODO!
- taskCount = 0;
-}
+#endif
#if defined(THREADED_RTS)
diff --git a/rts/Task.h b/rts/Task.h
index 590dd679b3..c11afb584c 100644
--- a/rts/Task.h
+++ b/rts/Task.h
@@ -20,26 +20,14 @@
Task, and OS threads that enter the Haskell RTS for the purposes of
making a call-in are also Tasks.
- The relationship between the number of tasks and capabilities, and
- the runtime build (-threaded, -smp etc.) is summarised by the
- following table:
+ In the THREADED_RTS build, multiple Tasks may all be running
+ Haskell code simultaneously. A task relinquishes its Capability
+ when it is asked to evaluate an external (C) call.
- build Tasks Capabilities
- ---------------------------------
- normal 1 1
- -threaded N N
-
- The non-threaded build has a single Task and a single global
- Capability.
-
- The THREADED_RTS build allows multiple tasks and mulitple Capabilities.
- Multiple Tasks may all be running Haskell code simultaneously. A task
- relinquishes its Capability when it is asked to evaluate an external
- (C) call.
-
- In general, there may be multiple Tasks for an OS thread. This
- happens if one Task makes a foreign call from Haskell, and
- subsequently calls back in to create a new bound thread.
+ In general, there may be multiple Tasks associated with a given OS
+ thread. A second Task is created when one Task makes a foreign
+ call from Haskell, and subsequently calls back in to Haskell,
+ creating a new bound thread.
A particular Task structure can belong to more than one OS thread
over its lifetime. This is to avoid creating an unbounded number
@@ -190,7 +178,10 @@ INLINE_HEADER void taskEnter (Task *task);
// mainly for stats-gathering purposes.
// Requires: sched_mutex.
//
+#if defined(THREADED_RTS)
+// In the non-threaded RTS, tasks never stop.
void workerTaskStop (Task *task);
+#endif
// Record the time spent in this Task.
// This is called by workerTaskStop() but not by boundTaskExiting(),
@@ -207,12 +198,6 @@ void discardTask (Task *task);
//
INLINE_HEADER Task *myTask (void);
-// After a fork, the tasks are not carried into the child process, so
-// we must tell the task manager.
-// Requires: sched_mutex.
-//
-void resetTaskManagerAfterFork (void);
-
#if defined(THREADED_RTS)
// Workers are attached to the supplied Capability. This Capability
diff --git a/rts/ThrIOManager.h b/rts/ThrIOManager.h
deleted file mode 100644
index eeccc6c420..0000000000
--- a/rts/ThrIOManager.h
+++ /dev/null
@@ -1,15 +0,0 @@
-/* -----------------------------------------------------------------------------
- *
- * (c) The GHC Team 1998-2006
- *
- * Communicating with the IO manager thread (see GHC.Conc).
- * Posix implementation in posix/Signals.c
- * Win32 implementation in win32/ThrIOManager.c
- *
- * -------------------------------------------------------------------------*/
-
-#if defined(THREADED_RTS)
-void ioManagerWakeup (void);
-void ioManagerDie (void);
-void ioManagerStart (void);
-#endif
diff --git a/rts/ThreadLabels.c b/rts/ThreadLabels.c
index 6919e1ae38..aa620f0b9e 100644
--- a/rts/ThreadLabels.c
+++ b/rts/ThreadLabels.c
@@ -9,6 +9,7 @@
#include "PosixSource.h"
#include "Rts.h"
+
#include "ThreadLabels.h"
#include "RtsUtils.h"
#include "Hash.h"
diff --git a/rts/ThreadLabels.h b/rts/ThreadLabels.h
index 59eb321cb7..60289ef306 100644
--- a/rts/ThreadLabels.h
+++ b/rts/ThreadLabels.h
@@ -7,8 +7,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef __THREADLABELS_H__
-#define __THREADLABELS_H__
+#ifndef THREADLABELS_H
+#define THREADLABELS_H
#if defined(DEBUG)
void initThreadLabelTable (void);
@@ -19,4 +19,4 @@ void removeThreadLabel (StgWord key);
void labelThread (StgPtr tso, char *label);
#endif
-#endif /* __THREADLABELS_H__ */
+#endif /* THREADLABELS_H */
diff --git a/rts/ThreadPaused.c b/rts/ThreadPaused.c
index 4882ab2374..58c30e330e 100644
--- a/rts/ThreadPaused.c
+++ b/rts/ThreadPaused.c
@@ -6,13 +6,14 @@
*
* ---------------------------------------------------------------------------*/
+// #include "PosixSource.h"
#include "Rts.h"
-#include "Storage.h"
-#include "LdvProfile.h"
+
+#include "ThreadPaused.h"
+#include "sm/Storage.h"
#include "Updates.h"
#include "RaiseAsync.h"
#include "Trace.h"
-#include "RtsFlags.h"
#include <string.h> // for memmove()
@@ -141,23 +142,23 @@ stackSqueeze(StgTSO *tso, StgPtr bottom)
// <empty> indicates unused
//
{
- void *sp;
- void *gap_start, *next_gap_start, *gap_end;
+ StgWord8 *sp;
+ StgWord8 *gap_start, *next_gap_start, *gap_end;
nat chunk_size;
- next_gap_start = (void *)((unsigned char*)gap + sizeof(StgUpdateFrame));
+ next_gap_start = (StgWord8*)gap + sizeof(StgUpdateFrame);
sp = next_gap_start;
while ((StgPtr)gap > tso->sp) {
// we're working in *bytes* now...
gap_start = next_gap_start;
- gap_end = (void*) ((unsigned char*)gap_start - gap->gap_size * sizeof(W_));
+ gap_end = gap_start - gap->gap_size * sizeof(W_);
gap = gap->next_gap;
- next_gap_start = (void *)((unsigned char*)gap + sizeof(StgUpdateFrame));
+ next_gap_start = (StgWord8*)gap + sizeof(StgUpdateFrame);
- chunk_size = (unsigned char*)gap_end - (unsigned char*)next_gap_start;
+ chunk_size = gap_end - next_gap_start;
sp -= chunk_size;
memmove(sp, next_gap_start, chunk_size);
}
diff --git a/rts/ThreadPaused.h b/rts/ThreadPaused.h
new file mode 100644
index 0000000000..60cded2885
--- /dev/null
+++ b/rts/ThreadPaused.h
@@ -0,0 +1,14 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team 1998-2006
+ *
+ * Tidying up a thread when it stops running
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef THREADPAUSED_H
+#define THREADPAUSED_H
+
+void threadPaused ( Capability *cap, StgTSO * );
+
+#endif /* THREADPAUSED_H */
diff --git a/rts/Threads.c b/rts/Threads.c
index 1d871a5856..28820c8d44 100644
--- a/rts/Threads.c
+++ b/rts/Threads.c
@@ -8,10 +8,8 @@
#include "PosixSource.h"
#include "Rts.h"
-#include "SchedAPI.h"
-#include "Storage.h"
+
#include "Threads.h"
-#include "RtsFlags.h"
#include "STM.h"
#include "Schedule.h"
#include "Trace.h"
diff --git a/rts/Threads.h b/rts/Threads.h
index f6d2dfd11a..d17235a2cb 100644
--- a/rts/Threads.h
+++ b/rts/Threads.h
@@ -25,13 +25,6 @@ void printThreadBlockage (StgTSO *tso);
void printThreadStatus (StgTSO *t);
void printAllThreads (void);
void printThreadQueue (StgTSO *t);
-# if defined(PARALLEL_HASKELL)
-void print_bq (StgClosure *node);
-void print_bqe (StgBlockingQueueElement *bqe);
-nat run_queue_len (void);
-# elif defined(GRAN)
-void print_bq (StgClosure *node);
-# endif
#endif
#endif /* THREADS_H */
diff --git a/rts/Ticky.c b/rts/Ticky.c
index d319d18f09..4737f4a577 100644
--- a/rts/Ticky.c
+++ b/rts/Ticky.c
@@ -11,8 +11,8 @@
#define TICKY_C /* define those variables */
#include "PosixSource.h"
#include "Rts.h"
+
#include "TickyCounters.h"
-#include "RtsFlags.h"
#include "Ticky.h"
/* -----------------------------------------------------------------------------
diff --git a/rts/Ticky.h b/rts/Ticky.h
index 21765e4bbb..c8da50a940 100644
--- a/rts/Ticky.h
+++ b/rts/Ticky.h
@@ -6,4 +6,9 @@
*
* ---------------------------------------------------------------------------*/
-extern void PrintTickyInfo(void);
+#ifndef TICKY_H
+#define TICKY_H
+
+void PrintTickyInfo(void);
+
+#endif /* TICKY_H */
diff --git a/rts/Timer.c b/rts/Timer.c
index 96ea5e2211..8c178a076b 100644
--- a/rts/Timer.c
+++ b/rts/Timer.c
@@ -14,12 +14,13 @@
* on platform-specific services to install and run the timers.
*
*/
+
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
+#include "Timer.h"
#include "Proftimer.h"
-#include "Storage.h"
#include "Schedule.h"
-#include "Timer.h"
#include "Ticker.h"
#include "Capability.h"
#include "RtsSignals.h"
diff --git a/rts/Timer.h b/rts/Timer.h
index 59b695cac2..c679a5881a 100644
--- a/rts/Timer.h
+++ b/rts/Timer.h
@@ -9,9 +9,7 @@
#ifndef TIMER_H
#define TIMER_H
-extern void initTimer(void);
-extern void startTimer(void);
-extern void stopTimer(void);
-extern void exitTimer(void);
+void initTimer (void);
+void exitTimer (void);
#endif /* TIMER_H */
diff --git a/rts/Trace.c b/rts/Trace.c
index 63d4816585..0a47ea3860 100644
--- a/rts/Trace.c
+++ b/rts/Trace.c
@@ -8,10 +8,12 @@
#ifdef DEBUG
+// external headers
#include "Rts.h"
-#include "OSThreads.h"
+#include "rts/Flags.h"
+
+// internal headers
#include "Trace.h"
-#include "RtsFlags.h"
#include "GetTime.h"
#include "Stats.h"
diff --git a/rts/Updates.cmm b/rts/Updates.cmm
index 4043da05a5..fadf63b857 100644
--- a/rts/Updates.cmm
+++ b/rts/Updates.cmm
@@ -12,8 +12,9 @@
#include "Cmm.h"
+#include "rts/prof/LDV.h"
+
#include "Updates.h"
-#include "StgLdvProf.h"
/* on entry to the update code
(1) R1 points to the closure being returned
diff --git a/rts/parallel/WSDeque.c b/rts/WSDeque.c
index acecb85e5f..090a549709 100644
--- a/rts/parallel/WSDeque.c
+++ b/rts/WSDeque.c
@@ -38,10 +38,11 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
+
#include "RtsUtils.h"
#include "WSDeque.h"
-#include "SMP.h" // for cas
#define CASTOP(addr,old,new) ((old) == cas(((StgPtr)addr),(old),(new)))
diff --git a/rts/parallel/WSDeque.h b/rts/WSDeque.h
index d85567c38a..d85567c38a 100644
--- a/rts/parallel/WSDeque.h
+++ b/rts/WSDeque.h
diff --git a/rts/Weak.c b/rts/Weak.c
index 17150f6b3c..f5c3a62bda 100644
--- a/rts/Weak.c
+++ b/rts/Weak.c
@@ -8,13 +8,12 @@
#include "PosixSource.h"
#include "Rts.h"
+#include "RtsAPI.h"
+
#include "RtsUtils.h"
-#include "SchedAPI.h"
-#include "RtsFlags.h"
#include "Weak.h"
#include "Schedule.h"
#include "Prelude.h"
-#include "RtsAPI.h"
#include "Trace.h"
// ForeignPtrs with C finalizers rely on weak pointers inside weak_ptr_list
@@ -26,7 +25,7 @@ StgWeak *weak_ptr_list;
rtsBool running_finalizers = rtsFalse;
void
-runCFinalizer(StgVoid *fn, StgVoid *ptr, StgVoid *env, StgWord flag)
+runCFinalizer(void *fn, void *ptr, void *env, StgWord flag)
{
if (flag)
((void (*)(void *, void *))fn)(env, ptr);
@@ -47,9 +46,9 @@ runAllCFinalizers(StgWeak *list)
farr = (StgArrWords *)UNTAG_CLOSURE(w->cfinalizer);
if ((StgClosure *)farr != &stg_NO_FINALIZER_closure)
- runCFinalizer((StgVoid *)farr->payload[0],
- (StgVoid *)farr->payload[1],
- (StgVoid *)farr->payload[2],
+ runCFinalizer((void *)farr->payload[0],
+ (void *)farr->payload[1],
+ (void *)farr->payload[2],
farr->payload[3]);
}
@@ -97,9 +96,9 @@ scheduleFinalizers(Capability *cap, StgWeak *list)
farr = (StgArrWords *)UNTAG_CLOSURE(w->cfinalizer);
if ((StgClosure *)farr != &stg_NO_FINALIZER_closure)
- runCFinalizer((StgVoid *)farr->payload[0],
- (StgVoid *)farr->payload[1],
- (StgVoid *)farr->payload[2],
+ runCFinalizer((void *)farr->payload[0],
+ (void *)farr->payload[1],
+ (void *)farr->payload[2],
farr->payload[3]);
#ifdef PROFILING
diff --git a/rts/Weak.h b/rts/Weak.h
index 8fccae2a63..4f60bf9ebd 100644
--- a/rts/Weak.h
+++ b/rts/Weak.h
@@ -12,10 +12,12 @@
#include "Capability.h"
extern rtsBool running_finalizers;
+extern StgWeak * weak_ptr_list;
-void runCFinalizer(StgVoid *fn, StgVoid *ptr, StgVoid *env, StgWord flag);
+void runCFinalizer(void *fn, void *ptr, void *env, StgWord flag);
void runAllCFinalizers(StgWeak *w);
void scheduleFinalizers(Capability *cap, StgWeak *w);
void markWeakList(void);
-#endif
+#endif /* WEAK_H */
+
diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c
index 098934c1ba..7f93d73d00 100644
--- a/rts/eventlog/EventLog.c
+++ b/rts/eventlog/EventLog.c
@@ -8,12 +8,15 @@
#ifdef EVENTLOG
+#include "PosixSource.h"
#include "Rts.h"
+
#include "EventLog.h"
#include "Capability.h"
#include "Trace.h"
#include "RtsUtils.h"
#include "Stats.h"
+
#include <string.h>
#include <stdio.h>
diff --git a/rts/eventlog/EventLog.h b/rts/eventlog/EventLog.h
index c2511b986b..10903709d8 100644
--- a/rts/eventlog/EventLog.h
+++ b/rts/eventlog/EventLog.h
@@ -9,8 +9,8 @@
#ifndef EVENTLOG_H
#define EVENTLOG_H
+#include "rts/EventLogFormat.h"
#include "Capability.h"
-#include "EventLogFormat.h"
#ifdef EVENTLOG
diff --git a/rts/ghc.mk b/rts/ghc.mk
index a7bfd12e58..4bb4118284 100644
--- a/rts/ghc.mk
+++ b/rts/ghc.mk
@@ -72,7 +72,7 @@ rts/dist/build/sm/Scav_thr.c : rts/sm/Scav.c
"$(MKDIRHIER)" $(dir $@)
cp $< $@
-rts_H_FILES = $(wildcard $(GHC_INCLUDE_DIR)/*.h) $(wildcard rts/*.h)
+rts_H_FILES = $(wildcard includes/*.h) $(wildcard rts/*.h)
# collect the -l flags that we need to link the rts dyn lib.
rts/libs.depend : $(GHC_PKG_INPLACE)
@@ -130,27 +130,26 @@ $(foreach way,$(rts_WAYS),$(eval $(call build-rts-way,$(way))))
#-----------------------------------------------------------------------------
# Flags for compiling every file
-# gcc provides lots of useful warnings if you ask it.
-# This is a pretty good list to start with - use a # to comment out
-# any you don't like.
-WARNING_OPTS += -Wall
-WARNING_OPTS += -W
+# We like plenty of warnings.
+WARNING_OPTS += -Wall -Wextra
WARNING_OPTS += -Wstrict-prototypes
WARNING_OPTS += -Wmissing-prototypes
WARNING_OPTS += -Wmissing-declarations
WARNING_OPTS += -Winline
WARNING_OPTS += -Waggregate-return
-#WARNING_OPTS += -Wpointer-arith
+WARNING_OPTS += -Wpointer-arith
+WARNING_OPTS += -Wmissing-noreturn
+WARNING_OPTS += -Wcast-align
+WARNING_OPTS += -Wnested-externs
+WARNING_OPTS += -Wredundant-decls
+
+# These ones are hard to avoid:
+#WARNING_OPTS += -Wconversion
#WARNING_OPTS += -Wbad-function-cast
-#WARNING_OPTS += -Wcast-align
-#WARNING_OPTS += -Wnested-externs
#WARNING_OPTS += -Wshadow
#WARNING_OPTS += -Wcast-qual
-#WARNING_OPTS += -Wno-unused
-#WARNING_OPTS += -Wredundant-decls
-#WARNING_OPTS += -Wconversion
-STANDARD_OPTS += -I$(GHC_INCLUDE_DIR) -I$(GHC_RTS_DIR) -Irts/parallel -Irts/sm -Irts/eventlog
+STANDARD_OPTS += -Iincludes -Irts
# COMPILING_RTS is only used when building Win32 DLL support.
STANDARD_OPTS += -DCOMPILING_RTS
@@ -205,6 +204,8 @@ rts_HC_OPTS += -dcmm-lint
# upd_evacee() assigments get moved before the object copy.
rts_CC_OPTS += -fno-strict-aliasing
+rts_CC_OPTS += -fno-common
+
ifeq "$(BeConservative)" "YES"
rts_CC_OPTS += -DBE_CONSERVATIVE
endif
@@ -244,14 +245,14 @@ RtsUtils_CC_OPTS += -DGhcEnableTablesNextToCode=$(DQ)$(GhcEnableTablesNextToCode
# ffi.h triggers prototype warnings, so disable them here:
Interpreter_CC_OPTS += -Wno-strict-prototypes
-Adjustor_CC_OPTS += -Wno-strict-prototypes
-sm/Storage_CC_OPTS += -Wno-strict-prototypes
+Adjustor_CC_OPTS += -Wno-strict-prototypes
+sm/Storage_CC_OPTS += -Wno-strict-prototypes
+
+# inlining warnings happen in Compact
+sm/Compact_CC_OPTS += -Wno-inline
-StgCRun_CC_OPTS += -w
-Typeable_CC_OPTS += -w
RetainerProfile_CC_OPTS += -w
RetainerSet_CC_OPTS += -Wno-format
-sm/Compact_CC_OPTS += -w
# On Windows:
win32/ConsoleHandler_CC_OPTS += -w
win32/ThrIOManager_CC_OPTS += -w
@@ -271,8 +272,8 @@ sm/Evac_thr_HC_OPTS += -optc-funroll-loops
# These files are just copies of sm/Evac.c and sm/Scav.c respectively,
# but compiled with -DPARALLEL_GC.
-sm/Evac_thr_HC_OPTS += -optc-DPARALLEL_GC
-sm/Scav_thr_HC_OPTS += -optc-DPARALLEL_GC
+sm/Evac_thr_HC_OPTS += -optc-DPARALLEL_GC -Irts/sm
+sm/Scav_thr_HC_OPTS += -optc-DPARALLEL_GC -Irts/sm
#-----------------------------------------------------------------------------
# Add PAPI library if needed
diff --git a/rts/hooks/FlagDefaults.c b/rts/hooks/FlagDefaults.c
index 393d39bc39..ce1666f06d 100644
--- a/rts/hooks/FlagDefaults.c
+++ b/rts/hooks/FlagDefaults.c
@@ -4,6 +4,7 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
void
diff --git a/rts/hooks/MallocFail.c b/rts/hooks/MallocFail.c
index 1218d1d8d0..41c0d2a855 100644
--- a/rts/hooks/MallocFail.c
+++ b/rts/hooks/MallocFail.c
@@ -4,6 +4,7 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
#include <stdio.h>
diff --git a/rts/hooks/OnExit.c b/rts/hooks/OnExit.c
index dd4c3b4bb0..e8019c046b 100644
--- a/rts/hooks/OnExit.c
+++ b/rts/hooks/OnExit.c
@@ -4,6 +4,7 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
/* Note: by the time this hook has been called, Haskell land
diff --git a/rts/hooks/OutOfHeap.c b/rts/hooks/OutOfHeap.c
index e998237764..1945c51802 100644
--- a/rts/hooks/OutOfHeap.c
+++ b/rts/hooks/OutOfHeap.c
@@ -4,6 +4,7 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
#include <stdio.h>
diff --git a/rts/hooks/RtsOpts.c b/rts/hooks/RtsOpts.c
index b934b05f1b..2aae37246e 100644
--- a/rts/hooks/RtsOpts.c
+++ b/rts/hooks/RtsOpts.c
@@ -4,6 +4,7 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
#include <stdlib.h>
diff --git a/rts/hooks/StackOverflow.c b/rts/hooks/StackOverflow.c
index a395a3a1a5..0a1a23a65b 100644
--- a/rts/hooks/StackOverflow.c
+++ b/rts/hooks/StackOverflow.c
@@ -4,6 +4,7 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
#include <stdio.h>
diff --git a/rts/parallel/GranSim.c b/rts/parallel/GranSim.c
index 1b26bb9dff..7f7ad4424f 100644
--- a/rts/parallel/GranSim.c
+++ b/rts/parallel/GranSim.c
@@ -1,5 +1,5 @@
/*
- Time-stamp: <2006-10-19 15:12:58 simonmar>
+ Time-stamp: <2009-07-06 21:48:36 simonmar>
Variables and functions specific to GranSim the parallelism simulator
for GPH.
@@ -40,6 +40,8 @@
//@node Includes, Prototypes and externs, GranSim specific code, GranSim specific code
//@subsection Includes
+#if defined(GRAN)
+
#include "Rts.h"
#include "RtsFlags.h"
#include "RtsUtils.h"
@@ -58,8 +60,6 @@
//@node Prototypes and externs, Constants and Variables, Includes, GranSim specific code
//@subsection Prototypes and externs
-#if defined(GRAN)
-
/* Prototypes */
static inline PEs ga_to_proc(StgWord);
static inline rtsBool any_idle(void);
diff --git a/rts/posix/FileLock.c b/rts/posix/FileLock.c
index 26e9de4dc2..a6052c7381 100644
--- a/rts/posix/FileLock.c
+++ b/rts/posix/FileLock.c
@@ -6,11 +6,12 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "Hash.h"
+
#include "FileLock.h"
+#include "Hash.h"
#include "RtsUtils.h"
-#include "OSThreads.h"
#include <unistd.h>
#include <sys/stat.h>
diff --git a/rts/posix/FileLock.h b/rts/posix/FileLock.h
new file mode 100644
index 0000000000..2edee5ba6e
--- /dev/null
+++ b/rts/posix/FileLock.h
@@ -0,0 +1,15 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 2007
+ *
+ * File locking support as required by Haskell 98
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef POSIX_FILELOCK_H
+#define POSIX_FILELOCK_H
+
+void initFileLocking(void);
+void freeFileLocking(void);
+
+#endif /* POSIX_FILELOCK_H */
diff --git a/rts/posix/Itimer.c b/rts/posix/Itimer.c
index eb26cd3699..3a09e804b5 100644
--- a/rts/posix/Itimer.c
+++ b/rts/posix/Itimer.c
@@ -16,15 +16,15 @@
* Hence, we use the old-fashioned @setitimer@ that just about everyone seems
* to support. So much for standards.
*/
+
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
-#include "Timer.h"
+
#include "Ticker.h"
-#include "posix/Itimer.h"
+#include "Itimer.h"
#include "Proftimer.h"
-#include "Storage.h"
#include "Schedule.h"
-#include "posix/Select.h"
+#include "Select.h"
/* As recommended in the autoconf manual */
# ifdef TIME_WITH_SYS_TIME
@@ -229,31 +229,6 @@ exitTicker(void)
#endif
}
-#if 0
-/* Currently unused */
-void
-block_vtalrm_signal(void)
-{
- sigset_t signals;
-
- sigemptyset(&signals);
- sigaddset(&signals, ITIMER_SIGNAL);
-
- (void) sigprocmask(SIG_BLOCK, &signals, NULL);
-}
-
-void
-unblock_vtalrm_signal(void)
-{
- sigset_t signals;
-
- sigemptyset(&signals);
- sigaddset(&signals, ITIMER_SIGNAL);
-
- (void) sigprocmask(SIG_UNBLOCK, &signals, NULL);
-}
-#endif
-
/* gettimeofday() takes around 1us on our 500MHz PIII. Since we're
* only calling it 50 times/s, it shouldn't have any great impact.
*/
diff --git a/rts/posix/Itimer.h b/rts/posix/Itimer.h
index 09d01bde54..4cae935710 100644
--- a/rts/posix/Itimer.h
+++ b/rts/posix/Itimer.h
@@ -10,10 +10,5 @@
#define ITIMER_H
extern lnat getourtimeofday ( void );
-#if 0
-/* unused */
-extern void block_vtalrm_signal ( void );
-extern void unblock_vtalrm_signal ( void );
-#endif
#endif /* ITIMER_H */
diff --git a/rts/posix/OSMem.c b/rts/posix/OSMem.c
index 51737ad650..0a37256022 100644
--- a/rts/posix/OSMem.c
+++ b/rts/posix/OSMem.c
@@ -6,12 +6,12 @@
*
* ---------------------------------------------------------------------------*/
-/* This is non-posix compliant. */
-/* #include "PosixSource.h" */
+// This is non-posix compliant.
+// #include "PosixSource.h"
#include "Rts.h"
-#include "OSMem.h"
-#include "RtsFlags.h"
+
+#include "sm/OSMem.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -138,7 +138,7 @@ static void *
gen_map_mblocks (lnat size)
{
int slop;
- void *ret;
+ StgWord8 *ret;
// Try to map a larger block, and take the aligned portion from
// it (unmap the rest).
diff --git a/rts/posix/OSThreads.c b/rts/posix/OSThreads.c
index 324701d40d..a813eebf9e 100644
--- a/rts/posix/OSThreads.c
+++ b/rts/posix/OSThreads.c
@@ -13,9 +13,10 @@
#define _GNU_SOURCE
#endif
+#include "PosixSource.h"
#include "Rts.h"
+
#if defined(THREADED_RTS)
-#include "OSThreads.h"
#include "RtsUtils.h"
#include "Task.h"
diff --git a/rts/posix/Select.c b/rts/posix/Select.c
index 32dca96cd8..46db4054bb 100644
--- a/rts/posix/Select.c
+++ b/rts/posix/Select.c
@@ -6,19 +6,16 @@
*
* ---------------------------------------------------------------------------*/
-/* we're outside the realms of POSIX here... */
-/* #include "PosixSource.h" */
-
+#include "PosixSource.h"
#include "Rts.h"
-#include "Storage.h"
+
+#include "Signals.h"
#include "Schedule.h"
#include "RtsUtils.h"
-#include "RtsFlags.h"
-#include "Timer.h"
#include "Itimer.h"
-#include "Signals.h"
#include "Capability.h"
-#include "posix/Select.h"
+#include "Select.h"
+#include "AwaitEvent.h"
# ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
diff --git a/rts/posix/Select.h b/rts/posix/Select.h
index 8825562974..e92a4bc889 100644
--- a/rts/posix/Select.h
+++ b/rts/posix/Select.h
@@ -6,21 +6,12 @@
*
* -------------------------------------------------------------------------*/
-#ifndef SELECT_H
-#define SELECT_H
+#ifndef POSIX_SELECT_H
+#define POSIX_SELECT_H
#if !defined(THREADED_RTS)
/* In Select.c */
-extern lnat RTS_VAR(timestamp);
-
-/* awaitEvent(rtsBool wait)
- *
- * Checks for blocked threads that need to be woken.
- *
- * Called from STG : NO
- * Locks assumed : sched_mutex
- */
-void awaitEvent(rtsBool wait); /* In Select.c */
+extern lnat timestamp;
#endif
-#endif /* SELECT_H */
+#endif /* POSIX_SELECT_H */
diff --git a/rts/posix/Signals.c b/rts/posix/Signals.c
index ace58c2f98..660065734b 100644
--- a/rts/posix/Signals.c
+++ b/rts/posix/Signals.c
@@ -6,18 +6,15 @@
*
* ---------------------------------------------------------------------------*/
-/* This is non-Posix-compliant.
- #include "PosixSource.h"
-*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "SchedAPI.h"
+
#include "Schedule.h"
#include "RtsSignals.h"
-#include "posix/Signals.h"
+#include "Signals.h"
#include "RtsUtils.h"
-#include "RtsFlags.h"
#include "Prelude.h"
-#include "ThrIOManager.h"
+#include "Stable.h"
#ifdef alpha_HOST_ARCH
# if defined(linux_HOST_OS)
diff --git a/rts/posix/TTY.c b/rts/posix/TTY.c
new file mode 100644
index 0000000000..d39ef37b86
--- /dev/null
+++ b/rts/posix/TTY.c
@@ -0,0 +1,65 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2009
+ *
+ * TTY-related functionality
+ *
+ * ---------------------------------------------------------------------------*/
+
+#include "PosixSource.h"
+#include "Rts.h"
+
+#include "RtsUtils.h" // __hscore_get/set prototypes
+#include "TTY.h"
+
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+// Here we save the terminal settings on the standard file
+// descriptors, if we need to change them (eg. to support NoBuffering
+// input).
+static void *saved_termios[3] = {NULL,NULL,NULL};
+
+void*
+__hscore_get_saved_termios(int fd)
+{
+ return (0 <= fd && fd < (int)(sizeof(saved_termios) / sizeof(*saved_termios))) ?
+ saved_termios[fd] : NULL;
+}
+
+void
+__hscore_set_saved_termios(int fd, void* ts)
+{
+ if (0 <= fd && fd < (int)(sizeof(saved_termios) / sizeof(*saved_termios))) {
+ saved_termios[fd] = ts;
+ }
+}
+
+void
+resetTerminalSettings (void)
+{
+#if HAVE_TERMIOS_H
+ // Reset the terminal settings on the standard file descriptors,
+ // if we changed them. See System.Posix.Internals.tcSetAttr for
+ // more details, including the reason we termporarily disable
+ // SIGTTOU here.
+ {
+ int fd;
+ sigset_t sigset, old_sigset;
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIGTTOU);
+ sigprocmask(SIG_BLOCK, &sigset, &old_sigset);
+ for (fd = 0; fd <= 2; fd++) {
+ struct termios* ts = (struct termios*)__hscore_get_saved_termios(fd);
+ if (ts != NULL) {
+ tcsetattr(fd,TCSANOW,ts);
+ }
+ }
+ sigprocmask(SIG_SETMASK, &old_sigset, NULL);
+ }
+#endif
+}
diff --git a/rts/posix/TTY.h b/rts/posix/TTY.h
new file mode 100644
index 0000000000..f291d30de4
--- /dev/null
+++ b/rts/posix/TTY.h
@@ -0,0 +1,15 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2009
+ *
+ * TTY-related functionality
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef POSIX_TTY_H
+#define POSIX_TTY_H
+
+void resetTerminalSettings (void);
+
+#endif /* POSIX_TTY_H */
+
diff --git a/rts/sm/BlockAlloc.c b/rts/sm/BlockAlloc.c
index 280ebfc7db..bf7a55e7a9 100644
--- a/rts/sm/BlockAlloc.c
+++ b/rts/sm/BlockAlloc.c
@@ -17,11 +17,10 @@
#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
+#include "Storage.h"
#include "RtsUtils.h"
#include "BlockAlloc.h"
-#include "MBlock.h"
-#include "Storage.h"
#include <string.h>
@@ -284,7 +283,7 @@ alloc_mega_group (nat mblocks)
{
// we take our chunk off the end here.
nat best_mblocks = BLOCKS_TO_MBLOCKS(best->blocks);
- bd = FIRST_BDESCR(MBLOCK_ROUND_DOWN(best) +
+ bd = FIRST_BDESCR((StgWord8*)MBLOCK_ROUND_DOWN(best) +
(best_mblocks-mblocks)*MBLOCK_SIZE);
best->blocks = MBLOCK_GROUP_BLOCKS(best_mblocks - mblocks);
@@ -415,7 +414,8 @@ coalesce_mblocks (bdescr *p)
q = p->link;
if (q != NULL &&
MBLOCK_ROUND_DOWN(q) ==
- MBLOCK_ROUND_DOWN(p) + BLOCKS_TO_MBLOCKS(p->blocks) * MBLOCK_SIZE) {
+ (StgWord8*)MBLOCK_ROUND_DOWN(p) +
+ BLOCKS_TO_MBLOCKS(p->blocks) * MBLOCK_SIZE) {
// can coalesce
p->blocks = MBLOCK_GROUP_BLOCKS(BLOCKS_TO_MBLOCKS(p->blocks) +
BLOCKS_TO_MBLOCKS(q->blocks));
@@ -610,20 +610,21 @@ splitBlockGroup (bdescr *bd, nat blocks)
static void
initMBlock(void *mblock)
{
- bdescr *bd;
- void *block;
-
- /* the first few Bdescr's in a block are unused, so we don't want to
- * put them all on the free list.
- */
- block = FIRST_BLOCK(mblock);
- bd = FIRST_BDESCR(mblock);
-
- /* Initialise the start field of each block descriptor
- */
- for (; block <= LAST_BLOCK(mblock); bd += 1, block += BLOCK_SIZE) {
- bd->start = block;
- }
+ bdescr *bd;
+ StgWord8 *block;
+
+ /* the first few Bdescr's in a block are unused, so we don't want to
+ * put them all on the free list.
+ */
+ block = FIRST_BLOCK(mblock);
+ bd = FIRST_BDESCR(mblock);
+
+ /* Initialise the start field of each block descriptor
+ */
+ for (; block <= (StgWord8*)LAST_BLOCK(mblock); bd += 1,
+ block += BLOCK_SIZE) {
+ bd->start = (void*)block;
+ }
}
/* -----------------------------------------------------------------------------
@@ -708,7 +709,7 @@ checkFreeListSanity(void)
if (bd->link != NULL)
{
ASSERT (MBLOCK_ROUND_DOWN(bd->link) !=
- MBLOCK_ROUND_DOWN(bd) +
+ (StgWord8*)MBLOCK_ROUND_DOWN(bd) +
BLOCKS_TO_MBLOCKS(bd->blocks) * MBLOCK_SIZE);
}
}
@@ -758,7 +759,8 @@ reportUnmarkedBlocks (void)
debugBelch(" %p\n",bd);
}
if (bd->blocks >= BLOCKS_PER_MBLOCK) {
- mblock += (BLOCKS_TO_MBLOCKS(bd->blocks) - 1) * MBLOCK_SIZE;
+ mblock = (StgWord8*)mblock +
+ (BLOCKS_TO_MBLOCKS(bd->blocks) - 1) * MBLOCK_SIZE;
break;
} else {
bd += bd->blocks;
diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c
index 9c13253c32..892364dfa5 100644
--- a/rts/sm/Compact.c
+++ b/rts/sm/Compact.c
@@ -13,16 +13,18 @@
#include "PosixSource.h"
#include "Rts.h"
+
+#include "Storage.h"
#include "RtsUtils.h"
-#include "RtsFlags.h"
-#include "OSThreads.h"
#include "BlockAlloc.h"
-#include "MBlock.h"
#include "GC.h"
#include "Compact.h"
#include "Schedule.h"
#include "Apply.h"
#include "Trace.h"
+#include "Weak.h"
+#include "MarkWeak.h"
+#include "Stable.h"
// Turn off inlining when debugging - it obfuscates things
#ifdef DEBUG
@@ -166,7 +168,7 @@ loop:
case 1:
{
StgWord r = *(StgPtr)(q-1);
- ASSERT(LOOKS_LIKE_INFO_PTR(UNTAG_CLOSURE((StgClosure *)r)));
+ ASSERT(LOOKS_LIKE_INFO_PTR((StgWord)UNTAG_CLOSURE((StgClosure *)r)));
return r;
}
case 2:
@@ -929,7 +931,7 @@ update_bkwd_compact( step *stp )
iptr = get_threaded_info(p);
unthread(p, (StgWord)free + GET_CLOSURE_TAG((StgClosure *)iptr));
- ASSERT(LOOKS_LIKE_INFO_PTR(((StgClosure *)p)->header.info));
+ ASSERT(LOOKS_LIKE_INFO_PTR((StgWord)((StgClosure *)p)->header.info));
info = get_itbl((StgClosure *)p);
size = closure_sizeW_((StgClosure *)p,info);
diff --git a/rts/sm/Compact.h b/rts/sm/Compact.h
index 40622c5682..7a237ac362 100644
--- a/rts/sm/Compact.h
+++ b/rts/sm/Compact.h
@@ -11,8 +11,8 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef GCCOMPACT_H
-#define GCCOMPACT_H
+#ifndef SM_COMPACT_H
+#define SM_COMPACT_H
INLINE_HEADER rtsBool
mark_stack_empty(void)
@@ -76,4 +76,4 @@ is_marked(StgPtr p, bdescr *bd)
extern void compact (StgClosure *static_objects);
-#endif /* GCCOMPACT_H */
+#endif /* SM_COMPACT_H */
diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c
index 5935f9069e..9e6d0f1783 100644
--- a/rts/sm/Evac.c
+++ b/rts/sm/Evac.c
@@ -11,16 +11,16 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "Storage.h"
-#include "MBlock.h"
+
#include "Evac.h"
+#include "Storage.h"
#include "GC.h"
#include "GCThread.h"
#include "GCUtils.h"
#include "Compact.h"
#include "Prelude.h"
-#include "LdvProfile.h"
#include "Trace.h"
#if defined(PROF_SPIN) && defined(THREADED_RTS) && defined(PARALLEL_GC)
diff --git a/rts/sm/Evac.h b/rts/sm/Evac.h
index e6ef02cfcc..78d024f3e9 100644
--- a/rts/sm/Evac.h
+++ b/rts/sm/Evac.h
@@ -11,6 +11,9 @@
*
* ---------------------------------------------------------------------------*/
+#ifndef SM_EVAC_H
+#define SM_EVAC_H
+
// Use a register argument for evacuate, if available.
// Earlier, the regparm attribute was used whenever __GNUC__ >= 2, but this
// generated warnings on PPC. So the use is restricted further.
@@ -31,3 +34,6 @@ REGPARM1 void evacuate (StgClosure **p);
REGPARM1 void evacuate1 (StgClosure **p);
extern lnat thunk_selector_depth;
+
+#endif /* SM_EVAC_H */
+
diff --git a/rts/sm/GC.c b/rts/sm/GC.c
index 88b11aae88..02fd6d9161 100644
--- a/rts/sm/GC.c
+++ b/rts/sm/GC.c
@@ -11,28 +11,23 @@
*
* ---------------------------------------------------------------------------*/
-// #include "PosixSource.h"
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+#include "HsFFI.h"
+
+#include "Storage.h"
#include "RtsUtils.h"
#include "Apply.h"
-#include "OSThreads.h"
-#include "LdvProfile.h"
#include "Updates.h"
#include "Stats.h"
#include "Schedule.h"
#include "Sanity.h"
#include "BlockAlloc.h"
-#include "MBlock.h"
#include "ProfHeap.h"
-#include "SchedAPI.h"
#include "Weak.h"
#include "Prelude.h"
-#include "ParTicky.h" // ToDo: move into Rts.h
#include "RtsSignals.h"
#include "STM.h"
-#include "HsFFI.h"
-#include "Linker.h"
#if defined(RTS_GTK_FRONTPANEL)
#include "FrontPanel.h"
#endif
@@ -40,6 +35,7 @@
#include "RetainerProfile.h"
#include "RaiseAsync.h"
#include "Papi.h"
+#include "Stable.h"
#include "GC.h"
#include "GCThread.h"
@@ -1112,10 +1108,11 @@ gcWorkerThread (Capability *cap)
#endif
+#if defined(THREADED_RTS)
+
void
waitForGcThreads (Capability *cap USED_IF_THREADS)
{
-#if defined(THREADED_RTS)
nat n_threads = RtsFlags.ParFlags.nNodes;
nat me = cap->no;
nat i, j;
@@ -1141,9 +1138,10 @@ waitForGcThreads (Capability *cap USED_IF_THREADS)
if (!retry) break;
}
}
-#endif
}
+#endif // THREADED_RTS
+
static void
start_gc_threads (void)
{
@@ -1185,10 +1183,10 @@ shutdown_gc_threads (nat n_threads USED_IF_THREADS, nat me USED_IF_THREADS)
#endif
}
+#if defined(THREADED_RTS)
void
releaseGCThreads (Capability *cap USED_IF_THREADS)
{
-#if defined(THREADED_RTS)
nat n_threads = RtsFlags.ParFlags.nNodes;
nat me = cap->no;
nat i;
@@ -1201,8 +1199,8 @@ releaseGCThreads (Capability *cap USED_IF_THREADS)
ACQUIRE_SPIN_LOCK(&gc_threads[i]->gc_spin);
RELEASE_SPIN_LOCK(&gc_threads[i]->mut_spin);
}
-#endif
}
+#endif
/* ----------------------------------------------------------------------------
Initialise a generation that is to be collected
diff --git a/rts/sm/GC.h b/rts/sm/GC.h
index fb4381dc0b..920b464bbb 100644
--- a/rts/sm/GC.h
+++ b/rts/sm/GC.h
@@ -11,8 +11,15 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef GC_H
-#define GC_H
+#ifndef SM_GC_H
+#define SM_GC_H
+
+void GarbageCollect(rtsBool force_major_gc, nat gc_type, Capability *cap);
+
+typedef void (*evac_fn)(void *user, StgClosure **root);
+
+StgClosure * isAlive ( StgClosure *p );
+void markCAFs ( evac_fn evac, void *user );
extern nat N;
extern rtsBool major_gc;
@@ -45,9 +52,12 @@ extern StgWord64 whitehole_spin;
void gcWorkerThread (Capability *cap);
void initGcThreads (void);
void freeGcThreads (void);
+
+#if defined(THREADED_RTS)
void waitForGcThreads (Capability *cap);
void releaseGCThreads (Capability *cap);
+#endif
#define WORK_UNIT_WORDS 128
-#endif /* GC_H */
+#endif /* SM_GC_H */
diff --git a/rts/sm/GCAux.c b/rts/sm/GCAux.c
index c1ff54123d..404e9bbcbc 100644
--- a/rts/sm/GCAux.c
+++ b/rts/sm/GCAux.c
@@ -7,10 +7,11 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "Storage.h"
-#include "MBlock.h"
+
#include "GC.h"
+#include "Storage.h"
#include "Compact.h"
#include "Task.h"
#include "Capability.h"
diff --git a/rts/sm/GCThread.h b/rts/sm/GCThread.h
index f91092b7ea..9188a20a9a 100644
--- a/rts/sm/GCThread.h
+++ b/rts/sm/GCThread.h
@@ -11,10 +11,9 @@
*
* ---------------------------------------------------------------------------*/
-#ifndef GCTHREAD_H
-#define GCTHREAD_H
+#ifndef SM_GCTHREAD_H
+#define SM_GCTHREAD_H
-#include "OSThreads.h"
#include "WSDeque.h"
/* -----------------------------------------------------------------------------
@@ -271,5 +270,5 @@ extern StgWord8 the_gc_thread[];
#endif
-#endif // GCTHREAD_H
+#endif // SM_GCTHREAD_H
diff --git a/rts/sm/GCUtils.c b/rts/sm/GCUtils.c
index 57cede7d43..6c6f10e01f 100644
--- a/rts/sm/GCUtils.c
+++ b/rts/sm/GCUtils.c
@@ -11,8 +11,9 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
#include "Storage.h"
#include "GC.h"
#include "GCThread.h"
@@ -101,6 +102,7 @@ grab_local_todo_block (step_workspace *ws)
return NULL;
}
+#if defined(THREADED_RTS)
bdescr *
steal_todo_block (nat s)
{
@@ -117,6 +119,7 @@ steal_todo_block (nat s)
}
return NULL;
}
+#endif
void
push_scanned_block (bdescr *bd, step_workspace *ws)
diff --git a/rts/sm/GCUtils.h b/rts/sm/GCUtils.h
index e71f4374fb..d68ce7876f 100644
--- a/rts/sm/GCUtils.h
+++ b/rts/sm/GCUtils.h
@@ -11,7 +11,8 @@
*
* --------------------------------------------------------------------------*/
-#include "SMP.h"
+#ifndef SM_GCUTILS_H
+#define SM_GCUTILS_H
bdescr *allocBlock_sync(void);
void freeChain_sync(bdescr *bd);
@@ -21,7 +22,9 @@ StgPtr todo_block_full (nat size, step_workspace *ws);
StgPtr alloc_todo_block (step_workspace *ws, nat size);
bdescr *grab_local_todo_block (step_workspace *ws);
+#if defined(THREADED_RTS)
bdescr *steal_todo_block (nat s);
+#endif
// Returns true if a block is partially full. This predicate is used to try
// to re-use partial blocks wherever possible, and to reduce wastage.
@@ -55,3 +58,5 @@ recordMutableGen_GC (StgClosure *p, nat gen_no)
}
*bd->free++ = (StgWord)p;
}
+
+#endif /* SM_GCUTILS_H */
diff --git a/rts/sm/MBlock.c b/rts/sm/MBlock.c
index b3fa13b0bc..996b2c9ae9 100644
--- a/rts/sm/MBlock.c
+++ b/rts/sm/MBlock.c
@@ -9,10 +9,9 @@
* ---------------------------------------------------------------------------*/
#include "PosixSource.h"
-
#include "Rts.h"
+
#include "RtsUtils.h"
-#include "MBlock.h"
#include "BlockAlloc.h"
#include "Trace.h"
#include "OSMem.h"
@@ -235,7 +234,7 @@ getMBlocks(nat n)
// fill in the table
for (i = 0; i < n; i++) {
- markHeapAlloced( ret + i * MBLOCK_SIZE );
+ markHeapAlloced( (StgWord8*)ret + i * MBLOCK_SIZE );
}
mblocks_allocated += n;
diff --git a/rts/sm/MarkWeak.c b/rts/sm/MarkWeak.c
index 78c84ed77a..4f0a7a451b 100644
--- a/rts/sm/MarkWeak.c
+++ b/rts/sm/MarkWeak.c
@@ -11,14 +11,16 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "Storage.h"
+
#include "MarkWeak.h"
#include "GC.h"
#include "GCThread.h"
#include "Evac.h"
#include "Trace.h"
#include "Schedule.h"
+#include "Weak.h"
/* -----------------------------------------------------------------------------
Weak Pointers
diff --git a/rts/sm/MarkWeak.h b/rts/sm/MarkWeak.h
index 7b3a806857..2647a22eec 100644
--- a/rts/sm/MarkWeak.h
+++ b/rts/sm/MarkWeak.h
@@ -11,6 +11,9 @@
*
* ---------------------------------------------------------------------------*/
+#ifndef SM_MARKWEAK_H
+#define SM_MARKWEAK_H
+
extern StgWeak *old_weak_ptr_list;
extern StgTSO *resurrected_threads;
extern StgTSO *exception_threads;
@@ -19,3 +22,5 @@ void initWeakForGC ( void );
rtsBool traverseWeakPtrList ( void );
void markWeakPtrList ( void );
rtsBool traverseBlackholeQueue ( void );
+
+#endif /* SM_MARKWEAK_H */
diff --git a/rts/sm/OSMem.h b/rts/sm/OSMem.h
index dcf8eb73df..3dbca23d11 100644
--- a/rts/sm/OSMem.h
+++ b/rts/sm/OSMem.h
@@ -6,8 +6,13 @@
*
* ---------------------------------------------------------------------------*/
+#ifndef SM_OSMEM_H
+#define SM_OSMEM_H
+
void osMemInit(void);
void *osGetMBlocks(nat n);
void osFreeAllMBlocks(void);
lnat getPageSize (void);
void setExecutable (void *p, lnat len, rtsBool exec);
+
+#endif /* SM_OSMEM_H */
diff --git a/rts/sm/README b/rts/sm/README
deleted file mode 100644
index 61cb7d2c06..0000000000
--- a/rts/sm/README
+++ /dev/null
@@ -1,11 +0,0 @@
-The Storage Manager
-===================
-
-This directory contains the storage manager and garbage collector.
-The interfaces exported from here are:
-
- Storage.h (in ../includes)
- Block.h (in ../includes)
- GC.h
- Arena.h
- BlockAlloc.h
diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c
index b850423244..9ebd4c5597 100644
--- a/rts/sm/Scav.c
+++ b/rts/sm/Scav.c
@@ -11,10 +11,10 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
-#include "RtsFlags.h"
+
#include "Storage.h"
-#include "MBlock.h"
#include "GC.h"
#include "GCThread.h"
#include "GCUtils.h"
@@ -23,7 +23,6 @@
#include "Scav.h"
#include "Apply.h"
#include "Trace.h"
-#include "LdvProfile.h"
#include "Sanity.h"
#include "Capability.h"
diff --git a/rts/sm/Scav.h b/rts/sm/Scav.h
index df774cd63d..10b9ffde40 100644
--- a/rts/sm/Scav.h
+++ b/rts/sm/Scav.h
@@ -11,6 +11,9 @@
*
* ---------------------------------------------------------------------------*/
+#ifndef SM_SCAV_H
+#define SM_SCAV_H
+
void scavenge_loop (void);
void scavenge_mutable_list (bdescr *bd, generation *gen);
void scavenge_capability_mut_lists (Capability *cap);
@@ -20,3 +23,6 @@ void scavenge_loop1 (void);
void scavenge_mutable_list1 (bdescr *bd, generation *gen);
void scavenge_capability_mut_Lists1 (Capability *cap);
#endif
+
+#endif /* SM_SCAV_H */
+
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c
index d14e58856f..97615e9d1b 100644
--- a/rts/sm/Storage.c
+++ b/rts/sm/Storage.c
@@ -13,18 +13,15 @@
#include "PosixSource.h"
#include "Rts.h"
+
+#include "Storage.h"
#include "RtsUtils.h"
-#include "RtsFlags.h"
#include "Stats.h"
-#include "Hooks.h"
#include "BlockAlloc.h"
-#include "MBlock.h"
#include "Weak.h"
#include "Sanity.h"
#include "Arena.h"
-#include "OSThreads.h"
#include "Capability.h"
-#include "Storage.h"
#include "Schedule.h"
#include "RetainerProfile.h" // for counting memory blocks (memInventory)
#include "OSMem.h"
@@ -32,7 +29,6 @@
#include "GC.h"
#include "Evac.h"
-#include <stdlib.h>
#include <string.h>
#include "ffi.h"
@@ -71,6 +67,7 @@ step *nurseries = NULL; /* array of nurseries, >1 only if THREADED_RTS *
Mutex sm_mutex;
#endif
+static void allocNurseries ( void );
static void
initStep (step *stp, int g, int s)
@@ -440,7 +437,7 @@ assignNurseriesToCapabilities (void)
#endif
}
-void
+static void
allocNurseries( void )
{
nat i;
diff --git a/rts/sm/Storage.h b/rts/sm/Storage.h
new file mode 100644
index 0000000000..c6aa45e162
--- /dev/null
+++ b/rts/sm/Storage.h
@@ -0,0 +1,169 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team, 1998-2009
+ *
+ * External Storage Manger Interface
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef SM_STORAGE_H
+#define SM_STORAGE_H
+
+/* -----------------------------------------------------------------------------
+ Initialisation / De-initialisation
+ -------------------------------------------------------------------------- */
+
+void initStorage(void);
+void exitStorage(void);
+void freeStorage(void);
+
+/* -----------------------------------------------------------------------------
+ Storage manager state
+ -------------------------------------------------------------------------- */
+
+extern bdescr * pinned_object_block;
+
+extern nat alloc_blocks;
+extern nat alloc_blocks_lim;
+
+INLINE_HEADER rtsBool
+doYouWantToGC( void )
+{
+ return (alloc_blocks >= alloc_blocks_lim);
+}
+
+/* for splitting blocks groups in two */
+bdescr * splitLargeBlock (bdescr *bd, nat blocks);
+
+/* -----------------------------------------------------------------------------
+ Generational garbage collection support
+
+ recordMutable(StgPtr p) Informs the garbage collector that a
+ previously immutable object has
+ become (permanently) mutable. Used
+ by thawArray and similar.
+
+ updateWithIndirection(p1,p2) Updates the object at p1 with an
+ indirection pointing to p2. This is
+ normally called for objects in an old
+ generation (>0) when they are updated.
+
+ updateWithPermIndirection(p1,p2) As above but uses a permanent indir.
+
+ -------------------------------------------------------------------------- */
+
+/*
+ * Storage manager mutex
+ */
+#if defined(THREADED_RTS)
+extern Mutex sm_mutex;
+#endif
+
+#if defined(THREADED_RTS)
+#define ACQUIRE_SM_LOCK ACQUIRE_LOCK(&sm_mutex);
+#define RELEASE_SM_LOCK RELEASE_LOCK(&sm_mutex);
+#define ASSERT_SM_LOCK() ASSERT_LOCK_HELD(&sm_mutex);
+#else
+#define ACQUIRE_SM_LOCK
+#define RELEASE_SM_LOCK
+#define ASSERT_SM_LOCK()
+#endif
+
+INLINE_HEADER void
+recordMutableGen(StgClosure *p, nat gen_no)
+{
+ bdescr *bd;
+
+ bd = generations[gen_no].mut_list;
+ if (bd->free >= bd->start + BLOCK_SIZE_W) {
+ bdescr *new_bd;
+ new_bd = allocBlock();
+ new_bd->link = bd;
+ bd = new_bd;
+ generations[gen_no].mut_list = bd;
+ }
+ *bd->free++ = (StgWord)p;
+
+}
+
+INLINE_HEADER void
+recordMutableGenLock(StgClosure *p, nat gen_no)
+{
+ ACQUIRE_SM_LOCK;
+ recordMutableGen(p,gen_no);
+ RELEASE_SM_LOCK;
+}
+
+INLINE_HEADER void
+recordMutable(StgClosure *p)
+{
+ bdescr *bd;
+ ASSERT(closure_MUTABLE(p));
+ bd = Bdescr((P_)p);
+ if (bd->gen_no > 0) recordMutableGen(p, bd->gen_no);
+}
+
+INLINE_HEADER void
+recordMutableLock(StgClosure *p)
+{
+ ACQUIRE_SM_LOCK;
+ recordMutable(p);
+ RELEASE_SM_LOCK;
+}
+
+/* -----------------------------------------------------------------------------
+ This is the write barrier for MUT_VARs, a.k.a. IORefs. A
+ MUT_VAR_CLEAN object is not on the mutable list; a MUT_VAR_DIRTY
+ is. When written to, a MUT_VAR_CLEAN turns into a MUT_VAR_DIRTY
+ and is put on the mutable list.
+ -------------------------------------------------------------------------- */
+
+void dirty_MUT_VAR(StgRegTable *reg, StgClosure *p);
+
+/* -----------------------------------------------------------------------------
+ Similarly, the write barrier for MVARs
+ -------------------------------------------------------------------------- */
+
+void dirty_MVAR(StgRegTable *reg, StgClosure *p);
+
+/* -----------------------------------------------------------------------------
+ Nursery manipulation
+ -------------------------------------------------------------------------- */
+
+void resetNurseries ( void );
+void resizeNurseries ( nat blocks );
+void resizeNurseriesFixed ( nat blocks );
+lnat countNurseryBlocks ( void );
+
+/* -----------------------------------------------------------------------------
+ Stats 'n' DEBUG stuff
+ -------------------------------------------------------------------------- */
+
+extern ullong total_allocated;
+
+lnat calcAllocated (void);
+lnat calcLiveBlocks (void);
+lnat calcLiveWords (void);
+lnat countOccupied (bdescr *bd);
+lnat calcNeeded (void);
+HsInt64 getAllocations (void);
+
+#if defined(DEBUG)
+void memInventory (rtsBool show);
+void checkSanity (void);
+nat countBlocks (bdescr *);
+void checkNurserySanity (step *stp);
+#endif
+
+/* ----------------------------------------------------------------------------
+ Storage manager internal APIs and globals
+ ------------------------------------------------------------------------- */
+
+#define END_OF_STATIC_LIST ((StgClosure*)1)
+
+void move_TSO (StgTSO *src, StgTSO *dest);
+
+extern StgClosure * caf_list;
+extern StgClosure * revertible_caf_list;
+
+#endif /* SM_STORAGE_H */
diff --git a/rts/sm/Sweep.c b/rts/sm/Sweep.c
index 444c3d5111..b6574024eb 100644
--- a/rts/sm/Sweep.c
+++ b/rts/sm/Sweep.c
@@ -11,9 +11,11 @@
*
* ---------------------------------------------------------------------------*/
+#include "PosixSource.h"
#include "Rts.h"
+
+#include "Storage.h"
#include "Sweep.h"
-#include "Block.h"
#include "Trace.h"
void
diff --git a/rts/sm/Sweep.h b/rts/sm/Sweep.h
index e7904a90a8..562a934faa 100644
--- a/rts/sm/Sweep.h
+++ b/rts/sm/Sweep.h
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team 2008
+ * (c) The GHC Team 2008
*
* Simple mark/sweep, collecting whole blocks.
*
@@ -11,4 +11,9 @@
*
* ---------------------------------------------------------------------------*/
+#ifndef SM_SWEEP_H
+#define SM_SWEEP_H
+
void sweep(step *gen);
+
+#endif /* SM_SWEEP_H */
diff --git a/rts/win32/AsyncIO.h b/rts/win32/AsyncIO.h
index ffbe71e1af..27669ce0b4 100644
--- a/rts/win32/AsyncIO.h
+++ b/rts/win32/AsyncIO.h
@@ -4,8 +4,10 @@
*
* (c) sof, 2002-2003.
*/
-#ifndef __ASYNCHIO_H__
-#define __ASYNCHIO_H__
+
+#ifndef WIN32_ASYNCHIO_H
+#define WIN32_ASYNCHIO_H
+
extern unsigned int
addIORequest(int fd,
int forWriting,
@@ -22,4 +24,4 @@ extern int awaitRequests(rtsBool wait);
extern void abandonRequestWait(void);
extern void resetAbandonRequestWait(void);
-#endif /* __ASYNCHIO_H__ */
+#endif /* WIN32_ASYNCHIO_H */
diff --git a/rts/win32/ConsoleHandler.h b/rts/win32/ConsoleHandler.h
index 33fa065733..0d09a67b94 100644
--- a/rts/win32/ConsoleHandler.h
+++ b/rts/win32/ConsoleHandler.h
@@ -2,8 +2,8 @@
* Console control handler support.
*
*/
-#ifndef __CONSOLEHANDLER_H__
-#define __CONSOLEHANDLER_H__
+#ifndef WIN32_CONSOLEHANDLER_H
+#define WIN32_CONSOLEHANDLER_H
/*
* Console control handlers lets an application handle Ctrl+C, Ctrl+Break etc.
@@ -52,14 +52,6 @@ extern StgInt stg_pending_events;
extern void startSignalHandlers(Capability *cap);
/*
- * Function: handleSignalsInThisThread()
- *
- * Have current (OS) thread assume responsibility of handling console events/signals.
- * Currently not used (by the console event handling code.)
- */
-extern void handleSignalsInThisThread(void);
-
-/*
* Function: rts_waitConsoleHandlerCompletion()
*
* Esoteric entry point used by worker thread that got woken
@@ -69,4 +61,4 @@ extern int rts_waitConsoleHandlerCompletion(void);
#endif /* THREADED_RTS */
-#endif /* __CONSOLEHANDLER_H__ */
+#endif /* Win32_CONSOLEHANDLER_H */
diff --git a/rts/win32/IOManager.h b/rts/win32/IOManager.h
index 7379ce3b16..145a1e549b 100644
--- a/rts/win32/IOManager.h
+++ b/rts/win32/IOManager.h
@@ -4,8 +4,9 @@
*
* (c) sof, 2002-2003
*/
-#ifndef __IOMANAGER_H__
-#define __IOMANAGER_H__
+
+#ifndef WIN32_IOMANAGER_H
+#define WIN32_IOMANAGER_H
#include <windows.h>
@@ -103,4 +104,4 @@ extern int AddProcRequest ( void* proc,
extern void abandonWorkRequest ( int reqID );
-#endif /* __IOMANAGER_H__ */
+#endif /* WIN32_IOMANAGER_H */
diff --git a/rts/win32/ThrIOManager.c b/rts/win32/ThrIOManager.c
index c52928c3a2..e62b33d9d3 100644
--- a/rts/win32/ThrIOManager.c
+++ b/rts/win32/ThrIOManager.c
@@ -8,7 +8,7 @@
* ---------------------------------------------------------------------------*/
#include "Rts.h"
-#include "ThrIOManager.h"
+#include "IOManager.h"
#include "Prelude.h"
#include <windows.h>
diff --git a/rts/win32/WorkQueue.h b/rts/win32/WorkQueue.h
index bde82a3a77..3ed2385ec9 100644
--- a/rts/win32/WorkQueue.h
+++ b/rts/win32/WorkQueue.h
@@ -5,8 +5,9 @@
* (c) sof, 2002-2003
*
*/
-#ifndef __WORKQUEUE_H__
-#define __WORKQUEUE_H__
+
+#ifndef WIN32_WORKQUEUE_H
+#define WIN32_WORKQUEUE_H
#include <windows.h>
/* This is a fixed-size queue. */
@@ -34,4 +35,4 @@ extern BOOL GetWork ( WorkQueue* pq, void** ppw );
extern BOOL FetchWork ( WorkQueue* pq, void** ppw );
extern int SubmitWork ( WorkQueue* pq, void* pw );
-#endif /* __WORKQUEUE_H__ */
+#endif /* WIN32_WORKQUEUE_H */
diff --git a/rts/win32/seh_excn.h b/rts/win32/seh_excn.h
index 410d430871..9d67fb405a 100644
--- a/rts/win32/seh_excn.h
+++ b/rts/win32/seh_excn.h
@@ -1,5 +1,6 @@
-#ifndef __SEH_EXCN_H__
-#define __SEH_EXCN_H__
+#ifndef WIN32_SEH_EXCN_H
+#define WIN32_SEH_EXCN_H
+
#include <stdio.h>
#include <stdlib.h>
@@ -87,5 +88,5 @@ catchDivZero(struct _EXCEPTION_RECORD*,
#error Don't know what sort of Windows system this is
#endif
-#endif /* __SEH_EXCN_H__ */
+#endif /* WIN32_SEH_EXCN_H */
diff --git a/utils/genapply/GenApply.hs b/utils/genapply/GenApply.hs
index eb29e2d4ef..765bfb3be6 100644
--- a/utils/genapply/GenApply.hs
+++ b/utils/genapply/GenApply.hs
@@ -8,8 +8,8 @@
module Main(main) where
#include "../../includes/ghcconfig.h"
-#include "../../includes/MachRegs.h"
-#include "../../includes/Constants.h"
+#include "../../includes/stg/MachRegs.h"
+#include "../../includes/rts/Constants.h"
-- Needed for TAG_BITS
#include "../../includes/MachDeps.h"