summaryrefslogtreecommitdiff
path: root/rts/win32
diff options
context:
space:
mode:
authorFrancesco Mazzoli <f@mazzo.li>2016-09-09 18:15:49 +0100
committerTamar Christina <tamar@zhox.com>2016-09-09 18:24:30 +0100
commit1b5f9207a649a64a1bba20b0283253425f9208d7 (patch)
tree06b3373e9111c5061a578d1fe214a8d5810c852e /rts/win32
parent65d9597d98ead78198bb747aed4e1163ee0d60d3 (diff)
downloadhaskell-1b5f9207a649a64a1bba20b0283253425f9208d7.tar.gz
Make start address of `osReserveHeapMemory` tunable via command line -xb
Summary: We stumbled upon a case where an external library (OpenCL) does not work if a specific address (0x200000000) is taken. It so happens that `osReserveHeapMemory` starts trying to mmap at 0x200000000: ``` void *hint = (void*)((W_)8 * (1 << 30) + attempt * BLOCK_SIZE); at = osTryReserveHeapMemory(*len, hint); ``` This makes it impossible to use Haskell programs compiled with GHC 8 with C functions that use OpenCL. See this example ​https://github.com/chpatrick/oclwtf for a repro. This patch allows the user to work around this kind of behavior outside our control by letting the user override the starting address through an RTS command line flag. Reviewers: bgamari, Phyx, simonmar, erikd, austin Reviewed By: Phyx, simonmar Subscribers: rwbarton, thomie Differential Revision: https://phabricator.haskell.org/D2513
Diffstat (limited to 'rts/win32')
-rw-r--r--rts/win32/OSMem.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/rts/win32/OSMem.c b/rts/win32/OSMem.c
index 3450267d9c..3d9a304fda 100644
--- a/rts/win32/OSMem.c
+++ b/rts/win32/OSMem.c
@@ -430,19 +430,20 @@ void setExecutable (void *p, W_ len, rtsBool exec)
static void* heap_base = NULL;
-void *osReserveHeapMemory (W_ *len)
+void *osReserveHeapMemory (void *startAddress, W_ *len)
{
void *start;
- heap_base = VirtualAlloc(NULL, *len + MBLOCK_SIZE,
+ heap_base = VirtualAlloc(startAddress, *len + MBLOCK_SIZE,
MEM_RESERVE, PAGE_READWRITE);
if (heap_base == NULL) {
if (GetLastError() == ERROR_NOT_ENOUGH_MEMORY) {
errorBelch("out of memory");
} else {
sysErrorBelch(
- "osReserveHeapMemory: VirtualAlloc MEM_RESERVE %llu bytes failed",
- len + MBLOCK_SIZE);
+ "osReserveHeapMemory: VirtualAlloc MEM_RESERVE %llu bytes \
+ at address %p bytes failed",
+ len + MBLOCK_SIZE, startAddress);
}
stg_exit(EXIT_FAILURE);
}