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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/*
* %CopyrightBegin%
*
* Copyright Ericsson AB 2013. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
* compliance with the License. You should have received a copy of the
* Erlang Public License along with this software. If not, it can be
* retrieved online at http://www.erlang.org/.
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* %CopyrightEnd%
*/
#ifndef ERL_MMAP_H__
#define ERL_MMAP_H__
#include "sys.h"
#define ERTS_MMAP_SUPERALIGNED_BITS (18)
/* Affects hard limits for sbct and lmbcs documented in erts_alloc.xml */
#define ERTS_MMAPFLG_OS_ONLY (((Uint32) 1) << 0)
#define ERTS_MMAPFLG_SUPERCARRIER_ONLY (((Uint32) 1) << 1)
#define ERTS_MMAPFLG_SUPERALIGNED (((Uint32) 1) << 2)
#define ERTS_HAVE_ERTS_OS_MMAP (1 << 0)
#define ERTS_HAVE_ERTS_SUPERCARRIER_MMAP (1 << 1)
extern int erts_have_erts_mmap;
extern UWord erts_page_inv_mask;
typedef struct {
struct {
char *start;
char *end;
} virtual_range;
struct {
char *start;
char *end;
} predefined_area;
UWord scs; /* super carrier size */
int sco; /* super carrier only? */
Uint scmgc; /* super carrier: max guaranteed (number of) carriers */
int scrpm;
}ErtsMMapInit;
#define ERTS_MMAP_INIT_DEFAULT_INITER \
{{NULL, NULL}, {NULL, NULL}, 0, 1, (1 << 16), 1}
void *erts_mmap(Uint32 flags, UWord *sizep);
void erts_munmap(Uint32 flags, void **ptrp, UWord *sizep);
void *erts_mremap(Uint32 flags, void *ptr, UWord old_size, UWord *sizep);
int erts_mmap_in_supercarrier(void *ptr);
void erts_mmap_init(ErtsMMapInit*);
#define ERTS_SUPERALIGNED_SIZE \
(1 << ERTS_MMAP_SUPERALIGNED_BITS)
#define ERTS_INV_SUPERALIGNED_MASK \
((UWord) (ERTS_SUPERALIGNED_SIZE - 1))
#define ERTS_SUPERALIGNED_MASK \
(~ERTS_INV_SUPERALIGNED_MASK)
#define ERTS_SUPERALIGNED_FLOOR(X) \
(((UWord) (X)) & ERTS_SUPERALIGNED_MASK)
#define ERTS_SUPERALIGNED_CEILING(X) \
ERTS_SUPERALIGNED_FLOOR((X) + ERTS_INV_SUPERALIGNED_MASK)
#define ERTS_IS_SUPERALIGNED(X) \
(((UWord) (X) & ERTS_INV_SUPERALIGNED_MASK) == 0)
#define ERTS_INV_PAGEALIGNED_MASK \
(erts_page_inv_mask)
#define ERTS_PAGEALIGNED_MASK \
(~ERTS_INV_PAGEALIGNED_MASK)
#define ERTS_PAGEALIGNED_FLOOR(X) \
(((UWord) (X)) & ERTS_PAGEALIGNED_MASK)
#define ERTS_PAGEALIGNED_CEILING(X) \
ERTS_PAGEALIGNED_FLOOR((X) + ERTS_INV_PAGEALIGNED_MASK)
#define ERTS_IS_PAGEALIGNED(X) \
(((UWord) (X) & ERTS_INV_PAGEALIGNED_MASK) == 0)
#define ERTS_PAGEALIGNED_SIZE \
(ERTS_INV_PAGEALIGNED_MASK + 1)
#ifndef HAVE_MMAP
# define HAVE_MMAP 0
#endif
#ifndef HAVE_MREMAP
# define HAVE_MREMAP 0
#endif
#if HAVE_MMAP
# define ERTS_HAVE_OS_MMAP 1
# define ERTS_HAVE_GENUINE_OS_MMAP 1
# if HAVE_MREMAP
# define ERTS_HAVE_OS_MREMAP 1
# endif
# if defined(MAP_FIXED) && defined(MAP_NORESERVE)
# define ERTS_HAVE_OS_PHYSICAL_MEMORY_RESERVATION 1
# endif
#endif
#ifndef HAVE_VIRTUALALLOC
# define HAVE_VIRTUALALLOC 0
#endif
#if HAVE_VIRTUALALLOC
# define ERTS_HAVE_OS_MMAP 1
#endif
#endif /* ERL_MMAP_H__ */
|