summary refs log tree commit diff stats
path: root/tests
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2012-02-02 00:16:33 +0100
committerAraq <rumpf_a@web.de>2012-02-02 00:16:33 +0100
commit7efe817ca3ad2323a8200b2f73539da4b9bfad24 (patch)
tree47c2f30bd4354d24f9e80389bcd1dbb8a5ca1905 /tests
parent4203aef827f44b86f399ee6bd2733f29028f4d16 (diff)
downloadNim-7efe817ca3ad2323a8200b2f73539da4b9bfad24.tar.gz
bugfix: threading on PowerPC
Diffstat (limited to 'tests')
-rw-r--r--tests/mmaptest.nim48
1 files changed, 48 insertions, 0 deletions
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: "<sys/mman.h>".}: cint
+  
+proc mmap(adr: pointer, len: int, prot, flags, fildes: cint,
+          off: int): pointer {.header: "<sys/mman.h>".}
+
+proc munmap(adr: pointer, len: int) {.header: "<sys/mman.h>".}
+
+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)
+
+