From 7efe817ca3ad2323a8200b2f73539da4b9bfad24 Mon Sep 17 00:00:00 2001 From: Araq Date: Thu, 2 Feb 2012 00:16:33 +0100 Subject: bugfix: threading on PowerPC --- tests/mmaptest.nim | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/mmaptest.nim (limited to 'tests') diff --git a/tests/mmaptest.nim b/tests/mmaptest.nim new file mode 100644 index 000000000..c304920af --- /dev/null +++ b/tests/mmaptest.nim @@ -0,0 +1,48 @@ +# Small test program to test for mmap() weirdnesses + +include "lib/system/ansi_c" + +const + PageSize = 4096 + PROT_READ = 1 # page can be read + PROT_WRITE = 2 # page can be written + MAP_PRIVATE = 2 # Changes are private + +when defined(macosx) or defined(bsd): + const MAP_ANONYMOUS = 0x1000 +elif defined(solaris): + const MAP_ANONYMOUS = 0x100 +else: + var + MAP_ANONYMOUS {.importc: "MAP_ANONYMOUS", header: "".}: cint + +proc mmap(adr: pointer, len: int, prot, flags, fildes: cint, + off: int): pointer {.header: "".} + +proc munmap(adr: pointer, len: int) {.header: "".} + +proc osAllocPages(size: int): pointer {.inline.} = + result = mmap(nil, size, PROT_READ or PROT_WRITE, + MAP_PRIVATE or MAP_ANONYMOUS, -1, 0) + if result == nil or result == cast[pointer](-1): + quit 1 + cfprintf(c_stdout, "allocated pages %p..%p\n", result, + cast[int](result) + size) + +proc osDeallocPages(p: pointer, size: int) {.inline} = + cfprintf(c_stdout, "freed pages %p..%p\n", p, cast[int](p) + size) + munmap(p, size-1) + +proc `+!!`(p: pointer, size: int): pointer {.inline.} = + result = cast[pointer](cast[int](p) + size) + +var p = osAllocPages(3 * PageSize) + +osDeallocPages(p, PageSize) +# If this fails the OS has freed the whole block starting at 'p': +echo(cast[ptr int](p +!! (pageSize*2))[]) + +osDeallocPages(p +!! PageSize*2, PageSize) +osDeallocPages(p +!! PageSize, PageSize) + + -- cgit 1.4.1-2-gfad0