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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
|
#
# %CopyrightBegin%
#
# Copyright Ericsson AB 2003-2009. 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%
#
#
# Rules:
# * Types, allocators, and classes can be declared.
# * Types, allocators, classes, and descriptions can only contain
# alphanumeric characters.
# * Allocators and classes have to be declared before they are used in
# type declarations.
# * Descriptions have only one name space (i.e. class descriptions,
# allocator descriptions, and type descriptions are all in the same
# name space).
# * Types, allocators, classes, and descriptions have different name
# spaces.
# * The type, allocator, and class names INVALID are reserved and can
# not be used.
# * The descriptions invalid_allocator, invalid_class, and invalid_type
# are reserved and can not be used.
# * Declarations can be done conditionally by use of a
# +if <boolean_variable>
#
# +else
#
# +endif
# or a
# +ifnot <boolean_variable>
#
# +else
#
# +endif
# construct (else branches are optional). The boolean variable X is
# true after a "+enable X" statement or if it has been passed as a
# command line argument to make_alloc_types. The variable X is false
# after a "+disable X" statement or if it has never been mentioned.
# --- Allocator declarations -------------------------------------------------
#
# If, and only if, the same thread performes *all* allocations,
# reallocations and deallocations of all memory types that are handled
# by a specific allocator (<ALLOCATOR> in type declaration), set
# <MULTI_THREAD> for this specific allocator to false; otherwise, set
# it to true.
#
# Syntax: allocator <ALLOCATOR> <MULTI_THREAD> <DESCRIPTION>
#
# <ALLOCATOR> <MULTI_THREAD> <DESCRIPTION>
allocator SYSTEM true sys_alloc
+if smp
allocator TEMPORARY true temp_alloc
allocator SHORT_LIVED true sl_alloc
allocator STANDARD true std_alloc
allocator LONG_LIVED true ll_alloc
allocator EHEAP true eheap_alloc
allocator ETS true ets_alloc
allocator FIXED_SIZE true fix_alloc
+else # Non smp build
allocator TEMPORARY false temp_alloc
allocator SHORT_LIVED false sl_alloc
allocator STANDARD false std_alloc
allocator LONG_LIVED false ll_alloc
allocator EHEAP false eheap_alloc
allocator ETS false ets_alloc
allocator FIXED_SIZE false fix_alloc
+endif
allocator BINARY true binary_alloc
allocator DRIVER true driver_alloc
# --- Class declarations -----------------------------------------------------
#
# Syntax: class <CLASS> <DESCRIPTION>
#
# <CLASS> <DESCRIPTION>
class PROCESSES process_data
class ATOM atom_data
class CODE code_data
class ETS ets_data
class BINARIES binary_data
class SYSTEM system_data
# --- Type declarations ------------------------------------------------------
#
# Syntax: type <TYPE> <ALLOCATOR> <CLASS> <DESCRIPTION>
#
# Use ERTS_ALC_T_<TYPE> as first parameter to erts_alloc(), erts_alloc_fnf(),
# erts_realloc(), erts_realloc_fnf() or erts_free() in order to allocate,
# reallocate or deallocate a memory block of type <TYPE>.
#
# NOTE: Only use temp_alloc for memory types that *really* are *temporarily*
# allocated. A good thumb rule: all memory allocated by temp_alloc
# should be deallocated before the emulator starts executing Erlang
# code again.
#
# NOTE: When adding or removing a type which uses the FIXED_SIZE allocator,
# also add or remove initialization of the type in erts_alloc_init()
# (erl_alloc.c).
#
# <TYPE> <ALLOCATOR> <CLASS> <DESCRIPTION>
type PROC FIXED_SIZE PROCESSES proc
type ATOM FIXED_SIZE ATOM atom_entry
type EXPORT FIXED_SIZE CODE export_entry
type MODULE FIXED_SIZE CODE module_entry
type REG_PROC FIXED_SIZE PROCESSES reg_proc
type LINK_LH STANDARD PROCESSES link_lh
type MONITOR_SH FIXED_SIZE PROCESSES monitor_sh
type MONITOR_LH STANDARD PROCESSES monitor_lh
type NLINK_SH FIXED_SIZE PROCESSES nlink_sh
type NLINK_LH STANDARD PROCESSES nlink_lh
type SUSPEND_MON STANDARD PROCESSES suspend_monitor
type PEND_SUSPEND SHORT_LIVED PROCESSES pending_suspend
type PROC_LIST SHORT_LIVED PROCESSES proc_list
type FUN_ENTRY FIXED_SIZE CODE fun_entry
type ATOM_TXT LONG_LIVED ATOM atom_text
type HEAP EHEAP PROCESSES heap
type OLD_HEAP EHEAP PROCESSES old_heap
type HEAP_FRAG EHEAP PROCESSES heap_frag
type TMP_HEAP TEMPORARY PROCESSES tmp_heap
type MSG_REF SHORT_LIVED PROCESSES msg_ref
type MSG_ROOTS TEMPORARY PROCESSES msg_roots
type ROOTSET TEMPORARY PROCESSES root_set
type LOADER_TMP TEMPORARY CODE loader_tmp
type BIF_TIMER_TABLE LONG_LIVED SYSTEM bif_timer_table
type SL_BIF_TIMER SHORT_LIVED PROCESSES bif_timer_sl
type LL_BIF_TIMER STANDARD PROCESSES bif_timer_ll
type REG_TABLE STANDARD SYSTEM reg_tab
type FUN_TABLE STANDARD CODE fun_tab
type DIST_TABLE STANDARD SYSTEM dist_tab
type NODE_TABLE STANDARD SYSTEM node_tab
type ATOM_TABLE LONG_LIVED ATOM atom_tab
type EXPORT_TABLE LONG_LIVED CODE export_tab
type MODULE_TABLE LONG_LIVED CODE module_tab
type TAINT LONG_LIVED CODE taint_list
type MODULE_REFS STANDARD CODE module_refs
type NC_TMP TEMPORARY SYSTEM nc_tmp
type TMP TEMPORARY SYSTEM tmp
type UNDEF SYSTEM SYSTEM undefined
type DCACHE STANDARD SYSTEM dcache
type DCTRL_BUF TEMPORARY SYSTEM dctrl_buf
type DIST_ENTRY STANDARD SYSTEM dist_entry
type NODE_ENTRY STANDARD SYSTEM node_entry
type PROC_TABLE LONG_LIVED PROCESSES proc_tab
type PORT_TABLE LONG_LIVED SYSTEM port_tab
type TIMER_WHEEL LONG_LIVED SYSTEM timer_wheel
type DRV DRIVER SYSTEM drv_internal
type DRV_BINARY BINARY BINARIES drv_binary
type DRIVER STANDARD SYSTEM driver
type NIF DRIVER SYSTEM nif_internal
type BINARY BINARY BINARIES binary
type NBIF_TABLE SYSTEM SYSTEM nbif_tab
type CODE LONG_LIVED CODE code
type ARG_REG STANDARD PROCESSES arg_reg
type PROC_DICT STANDARD PROCESSES proc_dict
type CALLS_BUF STANDARD PROCESSES calls_buf
type BPD STANDARD SYSTEM bpd
type PORT_NAME STANDARD SYSTEM port_name
type LINEBUF STANDARD SYSTEM line_buf
type IOQ STANDARD SYSTEM io_queue
type BITS_BUF STANDARD SYSTEM bits_buf
type TMP_DIST_BUF TEMPORARY SYSTEM tmp_dist_buf
type ASYNC_Q LONG_LIVED SYSTEM async_queue
type ESTACK TEMPORARY SYSTEM estack
type PORT_CALL_BUF TEMPORARY SYSTEM port_call_buf
type DB_TABLE FIXED_SIZE ETS db_tab
type DB_FIXATION SHORT_LIVED ETS db_fixation
type DB_FIX_DEL SHORT_LIVED ETS fixed_del
type DB_TABLES LONG_LIVED ETS db_tabs
type DB_NTAB_ENT STANDARD ETS db_named_table_entry
type DB_TMP TEMPORARY ETS db_tmp
type DB_MC_STK TEMPORARY ETS db_mc_stack
type DB_MS_PSDO_PROC LONG_LIVED ETS db_match_pseudo_proc
type DB_MS_RUN_HEAP SHORT_LIVED ETS db_match_spec_run_heap
type DB_MS_CMPL_HEAP TEMPORARY ETS db_match_spec_cmpl_heap
type DB_SEG ETS ETS db_segment
type DB_SEG_TAB ETS ETS db_segment_tab
type DB_STK ETS ETS db_stack
type DB_TRANS_TAB ETS ETS db_trans_tab
type DB_SEL_LIST ETS ETS db_select_list
type DB_DMC_ERROR ETS ETS db_dmc_error
type DB_DMC_ERR_INFO ETS ETS db_dmc_error_info
type DB_TERM ETS ETS db_term
type DB_PROC_CLEANUP SHORT_LIVED ETS db_proc_cleanup_state
type INSTR_INFO LONG_LIVED SYSTEM instr_info
type LOGGER_DSBUF TEMPORARY SYSTEM logger_dsbuf
type TMP_DSBUF TEMPORARY SYSTEM tmp_dsbuf
type INFO_DSBUF SYSTEM SYSTEM info_dsbuf
# INFO_DSBUF have to use the SYSTEM allocator; otherwise, a deadlock might occur
type SCHDLR_DATA LONG_LIVED PROCESSES scheduler_data
type RUNQS LONG_LIVED SYSTEM run_queues
type DDLL_PROCESS STANDARD SYSTEM ddll_processes
type DDLL_HANDLE STANDARD SYSTEM ddll_handle
type DDLL_ERRCODES LONG_LIVED SYSTEM ddll_errcodes
type DDLL_TMP_BUF TEMPORARY SYSTEM ddll_tmp_buf
type PORT_TASK SHORT_LIVED SYSTEM port_task
type PORT_TASKQ SHORT_LIVED SYSTEM port_task_queue
type MISC_OP_LIST SHORT_LIVED SYSTEM misc_op_list
type PORT_NAMES SHORT_LIVED SYSTEM port_names
type PORT_DATA_LOCK STANDARD SYSTEM port_data_lock
type NODES_MON STANDARD PROCESSES nodes_monitor
type PROCS_TPROC_EL SHORT_LIVED PROCESSES processes_term_proc_el
type PROCS_CNKINF SHORT_LIVED PROCESSES processes_chunk_info
type PROCS_PIDS SHORT_LIVED PROCESSES processes_pids
type RE_TMP_BUF TEMPORARY SYSTEM re_tmp_buf
type RE_SUBJECT SHORT_LIVED SYSTEM re_subject
type RE_HEAP STANDARD SYSTEM re_heap
type RE_STACK SHORT_LIVED SYSTEM re_stack
type UNICODE_BUFFER SHORT_LIVED SYSTEM unicode_buffer
type PRE_ALLOC_DATA LONG_LIVED SYSTEM pre_alloc_data
type DRV_THR_OPTS DRIVER SYSTEM driver_thread_opts
type DRV_TID DRIVER SYSTEM driver_tid
type DRV_MTX DRIVER SYSTEM driver_mutex
type DRV_CND DRIVER SYSTEM driver_cond
type DRV_RWLCK DRIVER SYSTEM driver_rwlock
type DRV_TSD DRIVER SYSTEM driver_tsd
type PSD STANDARD PROCESSES process_specific_data
type PRTSD STANDARD SYSTEM port_specific_data
type CPUDATA LONG_LIVED SYSTEM cpu_data
type TMP_CPU_IDS SHORT_LIVED SYSTEM tmp_cpu_ids
type EXT_TERM_DATA SHORT_LIVED PROCESSES external_term_data
type ZLIB STANDARD SYSTEM zlib
+if smp
type ASYNC SHORT_LIVED SYSTEM async
+else
# sl_alloc is not thread safe in non smp build; therefore, we use driver_alloc
type ASYNC DRIVER SYSTEM async
+endif
+if smp
type PORT_LOCK STANDARD SYSTEM port_lock
type DRIVER_LOCK STANDARD SYSTEM driver_lock
type XPORTS_LIST SHORT_LIVED SYSTEM extra_port_list
type PROC_LCK_WTR LONG_LIVED SYSTEM proc_lock_waiter
type PROC_LCK_QS LONG_LIVED SYSTEM proc_lock_queues
type RUNQ_BLNS LONG_LIVED SYSTEM run_queue_balancing
+endif
#
# Types used for special emulators
#
+if threads
type ETHR_INTERNAL SYSTEM SYSTEM ethread_internal
+ifnot smp
type ARCALLBACK LONG_LIVED SYSTEM async_ready_callback
+endif
+endif
+if shared_heap
type STACK STANDARD PROCESSES stack
type ACTIVE_PROCS STANDARD PROCESSES active_procs
+endif
+if hybrid
type ACTIVE_PROCS STANDARD PROCESSES active_procs
# Used for all memory involved in incremental gc of the message area
# that is, young (x2) and old generation, forwarding pointers and blackmap
type MESSAGE_AREA LONG_LIVED PROCESSES message_area
# Used in MA_STACK (global.h) and INC_STORAGE (erl_nmgc.h)
type OBJECT_STACK STANDARD PROCESSES object_stack
+endif
+if smp
type SL_PTIMER SHORT_LIVED SYSTEM ptimer_sl
type LL_PTIMER STANDARD SYSTEM ptimer_ll
type SYS_MSG_Q SHORT_LIVED PROCESSES system_messages_queue
type FP_EXCEPTION LONG_LIVED SYSTEM fp_exception
+endif
+if hipe
# Currently most hipe code use this type.
type HIPE SYSTEM SYSTEM hipe_data
+endif
+if heap_frag_elim_test
type SSB SHORT_LIVED PROCESSES ssb
+endif
#
# Types used by system specific code
#
type TEMP_TERM TEMPORARY SYSTEM temp_term
type LL_TEMP_TERM LONG_LIVED SYSTEM ll_temp_term
type DRV_TAB LONG_LIVED SYSTEM drv_tab
type DRV_EV_STATE LONG_LIVED SYSTEM driver_event_state
type DRV_EV_D_STATE FIXED_SIZE SYSTEM driver_event_data_state
type DRV_SEL_D_STATE FIXED_SIZE SYSTEM driver_select_data_state
type FD_LIST SHORT_LIVED SYSTEM fd_list
type POLLSET LONG_LIVED SYSTEM pollset
type POLLSET_UPDREQ SHORT_LIVED SYSTEM pollset_update_req
type POLL_FDS LONG_LIVED SYSTEM poll_fds
type POLL_RES_EVS LONG_LIVED SYSTEM poll_result_events
type FD_STATUS LONG_LIVED SYSTEM fd_status
+if unix
type SYS_READ_BUF TEMPORARY SYSTEM sys_read_buf
type FD_TAB LONG_LIVED SYSTEM fd_tab
type FD_ENTRY_BUF STANDARD SYSTEM fd_entry_buf
type CS_PROG_PATH LONG_LIVED SYSTEM cs_prog_path
type ENVIRONMENT TEMPORARY SYSTEM environment
type PUTENV_STR SYSTEM SYSTEM putenv_string
type PRT_REP_EXIT STANDARD SYSTEM port_report_exit
+endif
+if win32
type DRV_DATA_BUF SYSTEM SYSTEM drv_data_buf
type PRELOADED LONG_LIVED SYSTEM preloaded
type PUTENV_STR SYSTEM SYSTEM putenv_string
type WAITER_OBJ LONG_LIVED SYSTEM waiter_object
type ENVIRONMENT SYSTEM SYSTEM environment
type CON_VPRINTF_BUF TEMPORARY SYSTEM con_vprintf_buf
+endif
+if vxworks
type SYS_TMP_BUF LONG_LIVED SYSTEM sys_tmp_buf
type PEND_DATA SYSTEM SYSTEM pending_data
type FD_TAB LONG_LIVED SYSTEM fd_tab
type FD_ENTRY_BUF SYSTEM SYSTEM fd_entry_buf
+endif
+if ose
type SYS_TMP_BUF LONG_LIVED SYSTEM sys_tmp_buf
type PUTENV_STR SYSTEM SYSTEM putenv_string
type GETENV_STR SYSTEM SYSTEM getenv_string
type GETENV_STATE SYSTEM SYSTEM getenv_state
type SIG_ENTRY SYSTEM SYSTEM sig_entry
type DRIVER_DATA SYSTEM SYSTEM driver_data
type PGM_TAB SYSTEM SYSTEM pgm_tab
type PGM_ENTRY SYSTEM SYSTEM pgm_entry
type PRT_TAB SYSTEM SYSTEM prt_tab
type PRT_ENTRY SYSTEM SYSTEM prt_entry
+endif
# ----------------------------------------------------------------------------
|