Commit 51af102e authored by Javran Cheng's avatar Javran Cheng Committed by Erik de Castro Lopo

Better hints when RTS options not available (Trac #9579)

This patch provides user with a better hint when most RTS options
are not available (not compiled with `-rtsopts`).

A new field "rtsOptsEnabled" is added into RtsFlags.MiscFlags to
tell the availablity of RTS options.

Some concerns:
* Unlike other flag fields in "libraries/base/GHC/RTS/Flags.hsc",
  "RtsOptsEnabled" is defined in "includes/RtsAPI.h" and lacks
  constant macros. Therefore In "GHC.RTS", "RtsOptsEnabled" simply
  derives Enum instance and reads as of type "CInt".

* There are other ways to change RTS options (e.g. `-with-rtsopts`),
  but it might be too verbose to mention.

Test Plan: validate

Reviewers: austin, hvr, thomie, simonmar

Reviewed By: thomie

Subscribers: thomie, rwbarton

Differential Revision: https://phabricator.haskell.org/D767

GHC Trac Issues: #9579
parent 3b90d8c8
......@@ -9,6 +9,7 @@
#include "PosixSource.h"
#include "Rts.h"
#include "RtsFlags.h"
#include "RtsUtils.h"
#include "Profiling.h"
#include "ProfHeap.h"
......@@ -279,7 +280,13 @@ nextEra( void )
era++;
if (era == max_era) {
errorBelch("maximum number of censuses reached; use +RTS -i to reduce");
if (rtsConfig.rts_opts_enabled == RtsOptsAll) {
errorBelch("maximum number of censuses reached;\n"
"use +RTS -i to reduce");
} else {
errorBelch("maximum number of censuses reached;\n"
"Relink with -rtsopts and use `+RTS -i` to reduce");
}
stg_exit(EXIT_FAILURE);
}
......
......@@ -7,19 +7,23 @@
#include "PosixSource.h"
#include "Rts.h"
#include "Hooks.h"
#include "RtsFlags.h"
#include <stdio.h>
void
OutOfHeapHook (W_ request_size, W_ heap_size) /* both sizes in bytes */
{
/* fprintf(stderr, "Heap exhausted;\nwhile trying to allocate %lu bytes in a %lu-byte heap;\nuse `+RTS -H<size>' to increase the total heap size.\n", */
(void)request_size; /* keep gcc -Wall happy */
if (heap_size > 0) {
errorBelch("Heap exhausted;\nCurrent maximum heap size is %" FMT_Word " bytes (%" FMT_Word " MB);\nuse `+RTS -M<size>' to increase it.",
heap_size, heap_size / (1024*1024));
errorBelch("Heap exhausted;\n"
"Current maximum heap size is %" FMT_Word
" bytes (%" FMT_Word " MB);\n"
"%s `+RTS -M<size>' to increase it.",
heap_size, heap_size / (1024*1024),
((rtsConfig.rts_opts_enabled == RtsOptsAll)
? "use"
: "relink with -rtsopts and use"));
} else {
errorBelch("out of memory");
}
}
......@@ -7,11 +7,19 @@
#include "PosixSource.h"
#include "Rts.h"
#include "Hooks.h"
#include "RtsFlags.h"
#include <stdio.h>
void
StackOverflowHook (W_ stack_size) /* in bytes */
{
fprintf(stderr, "Stack space overflow: current size %" FMT_Word " bytes.\nUse `+RTS -Ksize -RTS' to increase it.\n", stack_size);
fprintf(stderr,
"Stack space overflow: current size %" FMT_Word " bytes.\n"
"%s `+RTS -Ksize -RTS' to increase it.\n",
stack_size,
((rtsConfig.rts_opts_enabled == RtsOptsAll)
? "Use"
: "Relink with -rtsopts and use")
);
}
TOP=../../..
include $(TOP)/mk/boilerplate.mk
include $(TOP)/mk/test.mk
T9579_stackoverflow_rtsnone:
'$(TEST_HC)' $(TEST_HC_OPTS) -rtsopts=none -fforce-recomp -with-rtsopts -K1m \
StackOverflow.hs -o T9579_stackoverflow_rtsnone
T9579_stackoverflow_rtssome:
'$(TEST_HC)' $(TEST_HC_OPTS) -rtsopts=some -fforce-recomp -with-rtsopts -K1m \
StackOverflow.hs -o T9579_stackoverflow_rtssome
T9579_stackoverflow_rtsall:
'$(TEST_HC)' $(TEST_HC_OPTS) -rtsopts=all -fforce-recomp -with-rtsopts -K1m \
StackOverflow.hs -o T9579_stackoverflow_rtsall
T9579_outofheap_rtsnone:
'$(TEST_HC)' $(TEST_HC_OPTS) -rtsopts=none -fforce-recomp -with-rtsopts -M1m \
OutOfHeap.hs -o T9579_outofheap_rtsnone
T9579_outofheap_rtssome:
'$(TEST_HC)' $(TEST_HC_OPTS) -rtsopts=some -fforce-recomp -with-rtsopts -M1m \
OutOfHeap.hs -o T9579_outofheap_rtssome
T9579_outofheap_rtsall:
'$(TEST_HC)' $(TEST_HC_OPTS) -rtsopts=all -fforce-recomp -with-rtsopts -M1m \
OutOfHeap.hs -o T9579_outofheap_rtsall
import qualified Data.Array.Unboxed as UA
import Data.Word
main :: IO ()
main = print (UA.listArray (1, 2^(20::Int)) (repeat 0)
:: UA.UArray Int Word64)
-- this unboxed array should at least take:
-- 2^20 * 64 bits
-- = 8 * (2^20 bytes)
-- = 8 MiB (in heap)
main :: IO ()
main = main' ()
where
main' _ = main >> main' ()
T9579_outofheap_rtsall: Heap exhausted;
Current maximum heap size is 1048576 bytes (1 MB);
use `+RTS -M<size>' to increase it.
T9579_outofheap_rtsnone: Heap exhausted;
Current maximum heap size is 1048576 bytes (1 MB);
relink with -rtsopts and use `+RTS -M<size>' to increase it.
T9579_outofheap_rtssome: Heap exhausted;
Current maximum heap size is 1048576 bytes (1 MB);
relink with -rtsopts and use `+RTS -M<size>' to increase it.
Stack space overflow: current size 99136 bytes.
Use `+RTS -Ksize -RTS' to increase it.
Stack space overflow: current size 99136 bytes.
Relink with -rtsopts and use `+RTS -Ksize -RTS' to increase it.
Stack space overflow: current size 99136 bytes.
Relink with -rtsopts and use `+RTS -Ksize -RTS' to increase it.
test('T9579_stackoverflow_rtsnone',
[exit_code(2)],
run_command,
['$MAKE -s --no-print-directory T9579_stackoverflow_rtsnone && ./T9579_stackoverflow_rtsnone'])
test('T9579_stackoverflow_rtssome',
[exit_code(2)],
run_command,
['$MAKE -s --no-print-directory T9579_stackoverflow_rtssome && ./T9579_stackoverflow_rtssome'])
test('T9579_stackoverflow_rtsall',
[exit_code(2)],
run_command,
['$MAKE -s --no-print-directory T9579_stackoverflow_rtsall && ./T9579_stackoverflow_rtsall'])
test('T9579_outofheap_rtsnone',
[exit_code(251)],
run_command,
['$MAKE -s --no-print-directory T9579_outofheap_rtsnone && ./T9579_outofheap_rtsnone'])
test('T9579_outofheap_rtssome',
[exit_code(251)],
run_command,
['$MAKE -s --no-print-directory T9579_outofheap_rtssome && ./T9579_outofheap_rtssome'])
test('T9579_outofheap_rtsall',
[exit_code(251)],
run_command,
['$MAKE -s --no-print-directory T9579_outofheap_rtsall && ./T9579_outofheap_rtsall'])
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