[commit: ghc] master: Per-thread allocation counters and limits (b0534f7)
git at git.haskell.org
git at git.haskell.org
Fri May 2 13:50:22 UTC 2014
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/b0534f78a73f972e279eed4447a5687bd6a8308e/ghc
>---------------------------------------------------------------
commit b0534f78a73f972e279eed4447a5687bd6a8308e
Author: Simon Marlow <marlowsd at gmail.com>
Date: Mon Apr 28 16:55:47 2014 +0100
Per-thread allocation counters and limits
This tracks the amount of memory allocation by each thread in a
counter stored in the TSO. Optionally, when the counter drops below
zero (it counts down), the thread can be sent an asynchronous
exception: AllocationLimitExceeded. When this happens, given a small
additional limit so that it can handle the exception. See
documentation in GHC.Conc for more details.
Allocation limits are similar to timeouts, but
- timeouts use real time, not CPU time. Allocation limits do not
count anything while the thread is blocked or in foreign code.
- timeouts don't re-trigger if the thread catches the exception,
allocation limits do.
- timeouts can catch non-allocating loops, if you use
-fno-omit-yields. This doesn't work for allocation limits.
I couldn't measure any impact on benchmarks with these changes, even
for nofib/smp.
>---------------------------------------------------------------
b0534f78a73f972e279eed4447a5687bd6a8308e
compiler/cmm/CmmLayoutStack.hs | 9 +-
compiler/codeGen/StgCmmForeign.hs | 268 ++++++++++++++------
includes/CodeGen.Platform.hs | 4 +-
includes/rts/Constants.h | 6 +
includes/rts/Flags.h | 8 +
includes/rts/Threads.h | 8 +-
includes/rts/storage/TSO.h | 31 ++-
libraries/base/Control/Exception.hs | 1 +
libraries/base/Control/Exception/Base.hs | 1 +
libraries/base/GHC/Conc.lhs | 6 +
libraries/base/GHC/Conc/Sync.lhs | 92 ++++++-
libraries/base/GHC/IO/Exception.hs | 21 +-
rts/HeapStackCheck.cmm | 4 +-
rts/Linker.c | 4 +
rts/Prelude.h | 2 +
rts/RaiseAsync.c | 54 ++++
rts/RaiseAsync.h | 4 +
rts/RtsFlags.c | 10 +
rts/RtsStartup.c | 1 +
rts/Schedule.c | 19 ++
rts/Threads.c | 77 +++---
rts/package.conf.in | 2 +
rts/sm/Storage.c | 6 +
testsuite/tests/concurrent/should_run/all.T | 7 +
.../tests/concurrent/should_run/allocLimit1.hs | 9 +
.../tests/concurrent/should_run/allocLimit1.stderr | 1 +
.../tests/concurrent/should_run/allocLimit2.hs | 17 ++
.../tests/concurrent/should_run/allocLimit3.hs | 15 ++
.../tests/concurrent/should_run/allocLimit3.stderr | 1 +
.../should_run/allocLimit3.stdout} | 1 -
.../tests/concurrent/should_run/allocLimit4.hs | 31 +++
utils/deriveConstants/DeriveConstants.hs | 1 +
32 files changed, 576 insertions(+), 145 deletions(-)
Diff suppressed because of size. To see it, use:
git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc b0534f78a73f972e279eed4447a5687bd6a8308e
More information about the ghc-commits
mailing list