projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ghc-cabal now adds the language flag being used
[ghc-hetmet.git]
/
rts
/
posix
/
OSMem.c
diff --git
a/rts/posix/OSMem.c
b/rts/posix/OSMem.c
index
9b71d1c
..
bfe1296
100644
(file)
--- a/
rts/posix/OSMem.c
+++ b/
rts/posix/OSMem.c
@@
-6,12
+6,13
@@
*
* ---------------------------------------------------------------------------*/
*
* ---------------------------------------------------------------------------*/
-/* This is non-posix compliant. */
-/* #include "PosixSource.h" */
+// This is non-posix compliant.
+// #include "PosixSource.h"
#include "Rts.h"
#include "Rts.h"
-#include "OSMem.h"
-#include "RtsFlags.h"
+
+#include "RtsUtils.h"
+#include "sm/OSMem.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@
-25,6
+26,9
@@
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
#include <errno.h>
#include <errno.h>
@@
-109,8
+113,8
@@
my_mmap (void *addr, lnat size)
vm_protect(mach_task_self(),(vm_address_t)ret,size,FALSE,VM_PROT_READ|VM_PROT_WRITE);
}
#else
vm_protect(mach_task_self(),(vm_address_t)ret,size,FALSE,VM_PROT_READ|VM_PROT_WRITE);
}
#else
- ret = mmap(addr, size, PROT_READ | PROT_WRITE | PROT_EXEC,
- MAP_ANON | MAP_PRIVATE, -1, 0);
+ ret = mmap(addr, size, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, -1, 0);
#endif
if (ret == (void *)-1) {
#endif
if (ret == (void *)-1) {
@@
-118,8
+122,8
@@
my_mmap (void *addr, lnat size)
(errno == EINVAL && sizeof(void*)==4 && size >= 0xc0000000)) {
// If we request more than 3Gig, then we get EINVAL
// instead of ENOMEM (at least on Linux).
(errno == EINVAL && sizeof(void*)==4 && size >= 0xc0000000)) {
// If we request more than 3Gig, then we get EINVAL
// instead of ENOMEM (at least on Linux).
- errorBelch("out of memory (requested %lu bytes)", size);
- stg_exit(EXIT_FAILURE);
+ errorBelch("out of memory (requested %lu bytes)", size);
+ stg_exit(EXIT_FAILURE);
} else {
barf("getMBlock: mmap: %s", strerror(errno));
}
} else {
barf("getMBlock: mmap: %s", strerror(errno));
}
@@
-135,7
+139,7
@@
static void *
gen_map_mblocks (lnat size)
{
int slop;
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).
// Try to map a larger block, and take the aligned portion from
// it (unmap the rest).
@@
-145,10
+149,10
@@
gen_map_mblocks (lnat size)
// unmap the slop bits around the chunk we allocated
slop = (W_)ret & MBLOCK_MASK;
// unmap the slop bits around the chunk we allocated
slop = (W_)ret & MBLOCK_MASK;
- if (munmap(ret, MBLOCK_SIZE - slop) == -1) {
+ if (munmap((void*)ret, MBLOCK_SIZE - slop) == -1) {
barf("gen_map_mblocks: munmap failed");
}
barf("gen_map_mblocks: munmap failed");
}
- if (slop > 0 && munmap(ret+size-slop, slop) == -1) {
+ if (slop > 0 && munmap((void*)(ret+size-slop), slop) == -1) {
barf("gen_map_mblocks: munmap failed");
}
barf("gen_map_mblocks: munmap failed");
}
@@
-173,8
+177,8
@@
void *
osGetMBlocks(nat n)
{
caddr_t ret;
osGetMBlocks(nat n)
{
caddr_t ret;
- lnat size = MBLOCK_SIZE * n;
-
+ lnat size = MBLOCK_SIZE * (lnat)n;
+
if (next_request == 0) {
// use gen_map_mblocks the first time.
ret = gen_map_mblocks(size);
if (next_request == 0) {
// use gen_map_mblocks the first time.
ret = gen_map_mblocks(size);
@@
-195,7
+199,6
@@
osGetMBlocks(nat n)
ret = gen_map_mblocks(size);
}
}
ret = gen_map_mblocks(size);
}
}
-
// Next time, we'll try to allocate right after the block we just got.
// ToDo: check that we haven't already grabbed the memory at next_request
next_request = ret + size;
// Next time, we'll try to allocate right after the block we just got.
// ToDo: check that we haven't already grabbed the memory at next_request
next_request = ret + size;
@@
-203,9
+206,24
@@
osGetMBlocks(nat n)
return ret;
}
return ret;
}
+void osFreeMBlocks(char *addr, nat n)
+{
+ munmap(addr, n * MBLOCK_SIZE);
+}
+
+void osReleaseFreeMemory(void) {
+ /* Nothing to do on POSIX */
+}
+
void osFreeAllMBlocks(void)
{
void osFreeAllMBlocks(void)
{
- /* XXX Do something here (bug #711) */
+ void *mblock;
+
+ for (mblock = getFirstMBlock();
+ mblock != NULL;
+ mblock = getNextMBlock(mblock)) {
+ munmap(mblock, MBLOCK_SIZE);
+ }
}
lnat getPageSize (void)
}
lnat getPageSize (void)
@@
-234,6
+252,6
@@
void setExecutable (void *p, lnat len, rtsBool exec)
StgWord size = startOfLastPage - startOfFirstPage + pageSize;
if (mprotect((void*)startOfFirstPage, (size_t)size,
(exec ? PROT_EXEC : 0) | PROT_READ | PROT_WRITE) != 0) {
StgWord size = startOfLastPage - startOfFirstPage + pageSize;
if (mprotect((void*)startOfFirstPage, (size_t)size,
(exec ? PROT_EXEC : 0) | PROT_READ | PROT_WRITE) != 0) {
- barf("makeExecutable: failed to protect 0x%p\n", p);
+ barf("setExecutable: failed to protect 0x%p\n", p);
}
}
}
}