18
18
#ifndef __ERL_VM_H__
19
19
#define __ERL_VM_H__
22
/* # define CHECK_FOR_HOLES */
25
#if defined(DEBUG) && !defined(CHECK_FOR_HOLES)
26
# define CHECK_FOR_HOLES
21
30
/* #define HEAP_FRAG_ELIM_TEST 1 */
23
#if defined(HEAP_FRAG_ELIM_TEST) && (defined(HIPE) || defined(SHARED_HEAP))
24
# undef HEAP_FRAG_ELIM_TEST
33
/* # define INCREMENTAL 1 */ /* Incremental garbage collection */
34
/* # define INC_TIME_BASED 1 */ /* Time-based incremental GC (vs Work-based) */
37
#if defined(HEAP_FRAG_ELIM_TEST) && defined(HIPE)
38
#error Heap-fragment elimination (nofrag) cannot be combined with HIPE yet
28
42
#define EMULATOR "BEAM"
29
43
#define SEQ_TRACE 1
31
#define CONTEXT_REDS 1000 /* Swap process out after this number */
32
#define MAX_ARG 256 /* Max number of arguments allowed */
45
#define CONTEXT_REDS 2000 /* Swap process out after this number */
46
#define MAX_ARG 256 /* Max number of arguments allowed */
33
47
#define MAX_REG 1024 /* Max number of x(N) registers used */
35
#define INPUT_REDUCTIONS (2 * CONTEXT_REDS)
37
#define H_DEFAULT_SIZE 233 /* default (heap + stack) min size */
40
#define S_DEFAULT_SIZE 233 /* default stack size */
41
#define SH_DEFAULT_SIZE 121393 /* default shared heap min size */
50
* The new arithmetic operations need some extra X registers in the register array.
52
#define ERTS_X_REGS_ALLOCATED (MAX_REG+2)
55
#define INPUT_REDUCTIONS (2 * CONTEXT_REDS)
58
#define H_DEFAULT_SIZE 233 /* default (heap + stack) min size */
61
# define SH_DEFAULT_SIZE 2629425 /* default message area min size */
65
# define INC_NoPAGES 256 /* Number of pages in the old generation */
66
# define INC_PAGESIZE 32768 /* The size of each page */
67
# define INC_STORAGE_SIZE 1024 /* The size of gray stack and similar */
74
* Debug HAlloc that initialize all memory to bad things.
76
* To get information about where memory is allocated, insert the two
77
* lines below directly after the memset line and use the flag +va.
79
VERBOSE(DEBUG_ALLOCATION,("HAlloc @ 0x%08lx (%d) %s:%d\n", \
80
(unsigned long)HEAP_TOP(p),(sz),__FILE__,__LINE__)), \
82
#ifdef CHECK_FOR_HOLES
83
#define HAlloc(p, sz) \
84
(ASSERT_EXPR((sz) >= 0), \
85
((((HEAP_LIMIT(p) - HEAP_TOP(p)) < (sz))) \
86
? erts_heap_alloc((p),(sz)) \
87
: (erts_set_hole_marker(HEAP_TOP(p), (sz)), \
88
HEAP_TOP(p) = HEAP_TOP(p) + (sz), HEAP_TOP(p) - (sz))))
90
#define HAlloc(p, sz) \
91
(ASSERT_EXPR((sz) >= 0), \
92
((((HEAP_LIMIT(p) - HEAP_TOP(p)) < (sz))) \
93
? erts_heap_alloc((p),(sz)) \
94
: (memset(HEAP_TOP(p),DEBUG_BAD_BYTE,(sz)*sizeof(Eterm*)), \
95
HEAP_TOP(p) = HEAP_TOP(p) + (sz), HEAP_TOP(p) - (sz))))
47
100
* Allocate heap memory, first on the ordinary heap;
48
101
* failing that, in a heap fragment.
50
#define HAlloc(p, sz) \
51
(ASSERT_EXPR((sz) >= 0), \
52
((((HEAP_LIMIT(p) - HEAP_TOP(p)) <= (sz))) \
53
? erts_heap_alloc((p),(sz)) \
54
: (HEAP_TOP(p) = HEAP_TOP(p) + (sz), HEAP_TOP(p) - (sz))))
56
#define HRelease(p, ptr) \
57
if (HEAP_START(p) <= (ptr) && (ptr) < HEAP_TOP(p)) { \
58
HEAP_TOP(p) = (ptr); \
61
#define HeapWordsLeft(p) \
62
(HEAP_LIMIT(p) - HEAP_TOP(p))
65
# define ARITH_HEAP(p) erts_global_arith_heap
66
# define ARITH_AVAIL(p) erts_global_arith_avail
67
# define ARITH_LOWEST_HTOP(p) erts_global_arith_lowest_htop
68
# define ARITH_CHECK_ME(p) erts_global_arith_check_me
69
extern Eterm* erts_global_arith_heap;
70
extern Uint erts_global_arith_avail;
71
extern Eterm* erts_global_arith_lowest_htop;
73
extern Eterm* erts_global_arith_check_me;
76
# define ARITH_HEAP(p) (p)->arith_heap
77
# define ARITH_AVAIL(p) (p)->arith_avail
78
# define ARITH_LOWEST_HTOP(p) (p)->arith_lowest_htop
103
#define HAlloc(p, sz) \
104
(ASSERT_EXPR((sz) >= 0), \
105
((((HEAP_LIMIT(p) - HEAP_TOP(p)) < (sz))) \
106
? erts_heap_alloc((p),(sz)) \
107
: (HEAP_TOP(p) = HEAP_TOP(p) + (sz), HEAP_TOP(p) - (sz))))
111
#define HRelease(p, endp, ptr) \
112
if ((ptr) == (endp)) { \
114
} else if (HEAP_START(p) <= (ptr) && (ptr) < HEAP_TOP(p)) { \
115
HEAP_TOP(p) = (ptr); \
117
erts_arith_shrink(p, ptr); \
120
#define HeapWordsLeft(p) (HEAP_LIMIT(p) - HEAP_TOP(p))
122
#define ARITH_HEAP(p) (p)->arith_heap
123
#define ARITH_AVAIL(p) (p)->arith_avail
79
125
# define ARITH_CHECK_ME(p) (p)->arith_check_me
82
128
/* Allocate memory on secondary arithmetic heap. */
85
# define ARITH_MARKER 0xaf5e78cc
130
#if defined(DEBUG) || defined(CHECK_FOR_HOLES)
131
# define ERTS_HOLE_MARKER (((0xcafebabeUL << 24) << 8) | 0xaf5e78ccUL)
135
# define ARITH_MARKER (((0xcafebabeUL << 24) << 8) | 0xaf5e78ccUL)
138
#if !defined(HEAP_FRAG_ELIM_TEST)
86
140
# define ArithCheck(p) \
87
141
ASSERT(ARITH_CHECK_ME(p)[0] == ARITH_MARKER);
88
# define ArithAlloc(p, need) \
89
(ASSERT_EXPR((need) >= 0), \
90
((ARITH_AVAIL(p) < (need)) ? \
91
erts_arith_alloc((p), (p)->htop, (need)) : \
92
((ARITH_HEAP(p) += (need)), (ARITH_AVAIL(p) -= (need)), \
93
(ARITH_CHECK_ME(p) = ARITH_HEAP(p)), \
142
# define ArithAlloc(p, need) \
143
(ASSERT_EXPR((need) >= 0), \
144
((ARITH_AVAIL(p) < (need)) ? \
145
erts_heap_alloc((p), (need)) : \
146
((ARITH_HEAP(p) += (need)), (ARITH_AVAIL(p) -= (need)), \
147
(ARITH_CHECK_ME(p) = ARITH_HEAP(p)), \
94
148
(ARITH_HEAP(p) - (need)))))
96
150
# define ArithCheck(p)
97
# define ArithAlloc(p, need) \
98
((ARITH_AVAIL(p) < (need)) ? \
99
erts_arith_alloc((p), (p)->htop, (need)) : \
100
((ARITH_HEAP(p) += (need)), \
101
(ARITH_AVAIL(p) -= (need)), \
151
# define ArithAlloc(p, need) \
152
((ARITH_AVAIL(p) < (need)) ? \
153
erts_heap_alloc((p), (need)) : \
154
((ARITH_HEAP(p) += (need)), \
155
(ARITH_AVAIL(p) -= (need)), \
102
156
(ARITH_HEAP(p) - (need))))
106
161
* Description for each instruction (defined here because the name and