Name | Executed | Routines | % | Executed | Lines | % | Unexecuted |
/home/matt/eu/rds/include/std/unix/mmap.e | 0 | 8 | 0.00% | 0 | 34 | 0.00% | 34 |
Routine | Executed | Lines | Unexecuted | |
mmap() | 0 | 6 | 0.00% | 6 |
get_page_size() | 0 | 2 | 0.00% | 2 |
is_page_aligned_address() | 0 | 2 | 0.00% | 2 |
is_valid_memory_protection_constant() | 0 | 2 | 0.00% | 2 |
mlock() | 0 | 2 | 0.00% | 2 |
mprotect() | 0 | 2 | 0.00% | 2 |
munlock() | 0 | 2 | 0.00% | 2 |
munmap() | 0 | 2 | 0.00% | 2 |
# | Executed | |
1 | -- (c) Copyright - See License.txt | |
2 | -- | |
3 | ||
4 | namespace mmap | |
5 | ||
6 | 0 | ifdef not UNIX then |
7 | include std/error.e | |
8 | crash("Only supported on Unix systems!") | |
9 | end ifdef | |
10 | ||
11 | include std/dll.e | |
12 | include std/machine.e | |
13 | ||
14 | public constant | |
15 | 0 | PROT_EXEC = 4, |
16 | 0 | PROT_READ = 1, |
17 | 0 | PROT_WRITE = 2, |
18 | 0 | PROT_NONE = 0 |
19 | ||
20 | 0 | public constant MAP_ANONYMOUS = #20, MAP_PRIVATE = #2 |
21 | 0 | ,MAP_SHARED = #1, MAP_TYPE = #F, MAP_FIXED = #10, |
22 | 0 | MAP_FILE = 0 |
23 | ||
24 | atom getpagesize_rid, mmap_rid, mprotect_rid, munmap_rid, | |
25 | mlock_rid, munlock_rid | |
26 | ||
27 | 0 | getpagesize_rid = define_c_func( -1, "getpagesize", { }, C_UINT ) |
28 | 0 | mmap_rid = define_c_func( -1, "mmap", { C_POINTER, C_UINT, C_INT, C_INT, C_INT, C_INT }, C_POINTER ) |
29 | 0 | mprotect_rid = define_c_func( -1, "mprotect", { C_POINTER, C_UINT, C_INT }, C_INT ) |
30 | 0 | munmap_rid = define_c_func( -1, "munmap", { C_POINTER, C_UINT }, C_INT ) |
31 | 0 | mlock_rid = define_c_func( -1, "mlock", { C_POINTER, C_UINT }, C_INT ) |
32 | 0 | munlock_rid = define_c_func( -1, "munlock", { C_POINTER, C_UINT }, C_INT ) |
33 | ||
34 | 0 | |
35 | 0 | return PAGE_SIZE |
36 | end function | |
37 | ||
38 | 0 | |
39 | valid_memory_protection_constant protection, | |
40 | integer flags, integer fd, integer offset ) | |
41 | atom pc | |
42 | 0 | if atom( start ) then |
43 | 0 | return c_func( mmap_rid, { start, length, protection, flags, fd, offset } ) |
44 | else | |
45 | 0 | pc = mmap( 0, length, protection, flags, fd, offset ) |
46 | 0 | poke( pc, start ) |
47 | 0 | return pc |
48 | end if | |
49 | end function | |
50 | ||
51 | 0 | |
52 | 0 | return c_func( munmap_rid, { addr, length } ) |
53 | end function | |
54 | ||
55 | 0 | |
56 | 0 | return c_func( mlock_rid, { addr, length } ) |
57 | end function | |
58 | ||
59 | 0 | |
60 | 0 | return c_func( munlock_rid, { addr, length } ) |
61 | end function | |
62 | ||
63 | 0 | |
64 | 0 | return c_func( mprotect_rid, { addr, length, protection } ) |
65 | end function | |
66 | ||
67 | 0 | |
68 | 0 | return 0 != valid_memory_protection_constant(x) |
69 | end function | |
70 | ||
71 | 0 | |
72 | 0 | return 0 != page_aligned_address(a) |
73 | end function | |
74 |