Commit d163845c authored by ian@well-typed.com's avatar ian@well-typed.com

Merge branch 'master' of darcs.haskell.org:/srv/darcs//ghc

parents 22932389 225172e6
......@@ -670,6 +670,8 @@ data DynFlags = DynFlags {
maxWorkerArgs :: Int,
ghciHistSize :: Int,
-- | MsgDoc output action: use "ErrUtils" instead of this if you can
log_action :: LogAction,
flushOut :: FlushOut,
......@@ -1227,6 +1229,8 @@ defaultDynFlags mySettings =
maxWorkerArgs = 10,
ghciHistSize = 50, -- keep a log of length 50 by default
log_action = defaultLogAction,
flushOut = defaultFlushOut,
flushErr = defaultFlushErr,
......@@ -2126,6 +2130,8 @@ dynamic_flags = [
, Flag "fmax-worker-args" (intSuffix (\n d -> d {maxWorkerArgs = n}))
, Flag "fghci-hist-size" (intSuffix (\n d -> d {ghciHistSize = n}))
------ Profiling ----------------------------------------------------
-- OLD profiling flags
......
......@@ -220,13 +220,15 @@ runStmtWithLocation source linenumber expr step =
let ic = hsc_IC hsc_env
bindings = (ic_tythings ic, ic_rn_gbl_env ic)
size = ghciHistSize idflags'
case step of
RunAndLogSteps ->
traceRunStatus expr bindings tyThings
breakMVar statusMVar status emptyHistory
breakMVar statusMVar status (emptyHistory size)
_other ->
handleRunStatus expr bindings tyThings
breakMVar statusMVar status emptyHistory
breakMVar statusMVar status (emptyHistory size)
runDecls :: GhcMonad m => String -> m [Name]
runDecls = runDeclsWithLocation "<interactive>" 1
......@@ -268,8 +270,8 @@ withVirtualCWD m = do
parseImportDecl :: GhcMonad m => String -> m (ImportDecl RdrName)
parseImportDecl expr = withSession $ \hsc_env -> liftIO $ hscImport hsc_env expr
emptyHistory :: BoundedList History
emptyHistory = nilBL 50 -- keep a log of length 50
emptyHistory :: Int -> BoundedList History
emptyHistory size = nilBL size
handleRunStatus :: GhcMonad m =>
String-> ([TyThing],GlobalRdrEnv) -> [Id]
......
......@@ -510,6 +510,12 @@
<entry>dynamic</entry>
<entry><option>-fno-break-on-error</option></entry>
</row>
<row>
<entry><option>-fghci-hist-size=<replaceable>n</replaceable></option></entry>
<entry><link linkend="ghci-debugger">Set the number of entries GHCi keeps for <literal>:history</literal></link></entry>
<entry>dynamic</entry>
<entry><option>(default is 50)</option></entry>
</row>
<row>
<entry><option>-fprint-evld-with-show</option></entry>
<entry><link linkend="breakpoints">Enable usage of Show instances in <literal>:print</literal></link></entry>
......
......@@ -1715,8 +1715,7 @@ a :: a
<para>The history is only available when
using <literal>:trace</literal>; the reason for this is we found that
logging each breakpoint in the history cuts performance by a factor of
2 or more. GHCi remembers the last 50 steps in the history (perhaps in
the future we'll make this configurable).</para>
2 or more. By default, GHCi remembers the last 50 steps in the history, but this can be changed with the <option>-fghci-hist-size=<replaceable>n</replaceable></option><indexterm><primary><option>&ndash;fghci-hist-size</option></primary></indexterm> option).</para>
</sect2>
<sect2 id="ghci-debugger-exceptions">
......@@ -2381,10 +2380,12 @@ Prelude> :. cmds.ghci
<indexterm><primary><literal>:history</literal></primary></indexterm>
</term>
<listitem>
<para>Display the history of evaluation steps. With a number,
displays that many steps (default: 20). For use with
<literal>:trace</literal>; see <xref
linkend="tracing" />.</para>
<para>Display the history of evaluation steps. With a
number, displays that many steps (default: 20). For use
with <literal>:trace</literal>; see <xref linkend="tracing"
/>. To set the number of history entries stored by GHCi,
use
<option>-fghci-hist-size=<replaceable>n</replaceable></option>.</para>
</listitem>
</varlistentry>
......
......@@ -306,6 +306,12 @@ TICK_VAR(2)
#define DEBUG_ONLY(s) doNothing()
#endif
#ifdef DEBUG
#define DEBUG_IS_ON 1
#else
#define DEBUG_IS_ON 0
#endif
/* -----------------------------------------------------------------------------
Useful macros and inline functions
-------------------------------------------------------------------------- */
......
......@@ -306,9 +306,7 @@ typedef struct {
StgHeader header;
StgClosure *volatile current_value;
StgTVarWatchQueue *volatile first_watch_queue_entry;
#if defined(THREADED_RTS)
StgInt volatile num_updates;
#endif
} StgTVar;
typedef struct {
......
......@@ -360,9 +360,11 @@ LAX_DEPENDENCIES = NO
# ----------------------------------------------------------------------------
# Options for GHC's RTS
# For an optimised RTS (you probably don't want to change these; we build
# a debugging RTS by default now. Use -debug to get it).
GhcRtsHcOpts=-optc-O2
# Build an optimised RTS. Remember that we need to turn on
# optimisation both for C code (-optc-O2) and .cmm code (-O2). For
# the debugging RTS flavour, rts/ghc.mk overrides these to turn off
# optimisation.
GhcRtsHcOpts=-optc-O2 -O2
GhcRtsCcOpts=-fomit-frame-pointer
# Include the front panel code? Needs GTK+.
......
......@@ -221,7 +221,11 @@ INFO_TABLE_RET ( stg_enter_checkbh, RET_SMALL,
{
foreign "C" checkBlockingQueues(MyCapability() "ptr",
CurrentTSO);
return (updatee);
// we need to return updatee now. Note that it might be a pointer
// to an indirection or a tagged value, we don't know which, so we
// need to ENTER() rather than return().
ENTER(updatee);
}
/* -----------------------------------------------------------------------------
......
......@@ -1070,8 +1070,8 @@ stg_newTVarzh (P_ init)
stg_readTVarzh (P_ tvar)
{
W_ trec;
W_ result;
P_ trec;
P_ result;
// Call to stmReadTVar may allocate
MAYBE_GC_P (stg_readTVarzh, tvar);
......
......@@ -127,7 +127,7 @@ INFO_TABLE_RET( stg_ctoi_R1n, RET_BCO )
{
Sp_adj(-2);
Sp(1) = R1;
Sp(0) = stg_ret_p_info;
Sp(0) = stg_ret_n_info;
jump stg_yield_to_interpreter [];
}
......
......@@ -130,7 +130,7 @@ ifneq "$$(BINDIST)" "YES"
# The per-way CC_OPTS
ifneq "$$(findstring debug, $1)" ""
rts_dist_$1_HC_OPTS =
rts_dist_$1_HC_OPTS = -O0
rts_dist_$1_CC_OPTS = -g -O0
else
rts_dist_$1_HC_OPTS = $$(GhcRtsHcOpts)
......
......@@ -404,7 +404,7 @@ GarbageCollect (nat collect_gen,
break;
}
if (n_gc_threads != 1) {
if (!DEBUG_IS_ON && n_gc_threads != 1) {
gct->allocated = clearNursery(cap);
}
......@@ -638,7 +638,7 @@ GarbageCollect (nat collect_gen,
}
// Reset the nursery: make the blocks empty
if (n_gc_threads == 1) {
if (DEBUG_IS_ON || n_gc_threads == 1) {
for (n = 0; n < n_capabilities; n++) {
allocated += clearNursery(&capabilities[n]);
}
......@@ -1074,7 +1074,9 @@ gcWorkerThread (Capability *cap)
scavenge_until_all_done();
gct->allocated = clearNursery(cap);
if (!DEBUG_IS_ON) {
gct->allocated = clearNursery(cap);
}
#ifdef THREADED_RTS
// Now that the whole heap is marked, we discard any sparks that
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment