1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
# Small test program to test for mmap() weirdnesses
import system/ansi_c
import posix
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)
discard munmap(p, size-1)
proc `+!!`(p: pointer, size: int): pointer {.inline.} =
result = cast[pointer](cast[int](p) + size)
const
PageShift = when defined(cpu16): 8 else: 12 # \
# my tests showed no improvements for using larger page sizes.
PageSize = 1 shl PageShift
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)
|