Loading...
  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
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
/*
 * Copyright (c) 2015 Apple Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apple Public Source License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://www.opensource.apple.com/apsl/ and read it before using this
 * file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 *
 * @APPLE_LICENSE_HEADER_END@
 */

#ifndef __MAGAZINE_MALLOC_H
#define __MAGAZINE_MALLOC_H

// MARK: magazine_malloc

MALLOC_NOEXPORT
malloc_zone_t *
create_scalable_zone(size_t initial_size, unsigned debug_flags);

MALLOC_NOEXPORT
szone_t *
create_scalable_szone(size_t initial_size, unsigned debug_flags);

// Allegedly exported for performance/debugging tools

MALLOC_EXPORT
boolean_t
scalable_zone_statistics(malloc_zone_t *zone, malloc_statistics_t *stats, unsigned subzone);

MALLOC_NOEXPORT
extern int max_magazines;

MALLOC_NOEXPORT
extern int max_medium_magazines;

MALLOC_NOEXPORT
extern int recirc_retained_regions;

MALLOC_NOEXPORT
extern bool magazine_medium_enabled;

MALLOC_NOEXPORT
extern uint64_t magazine_medium_active_threshold;

#if CONFIG_MEDIUM_ALLOCATOR
MALLOC_NOEXPORT
extern uint64_t magazine_medium_madvise_dram_scale_divisor;

MALLOC_NOEXPORT
extern uint64_t magazine_medium_madvise_window_scale_factor;
#endif // CONFIG_MEDIUM_ALLOCATOR


MALLOC_NOEXPORT
extern uint64_t magazine_large_expanded_cache_threshold;

#if CONFIG_AGGRESSIVE_MADVISE
MALLOC_NOEXPORT
extern bool aggressive_madvise_enabled;
#endif // CONFIG_AGGRESSIVE_MADVISE

#if CONFIG_LARGE_CACHE
MALLOC_NOEXPORT
extern bool large_cache_enabled;
#endif // CONFIG_LARGE_CACHE

// MARK: magazine_malloc utility functions

MALLOC_NOEXPORT
extern const
struct malloc_introspection_t szone_introspect;

MALLOC_NOEXPORT
void
szone_batch_free(szone_t *szone, void **to_be_freed, unsigned count);

MALLOC_NOEXPORT
unsigned
szone_batch_malloc(szone_t *szone, size_t size, void **results, unsigned count);

MALLOC_NOEXPORT
void *
szone_calloc(szone_t *szone, size_t num_items, size_t size);

MALLOC_NOEXPORT
void
szone_free(szone_t *szone, void *ptr);

MALLOC_NOEXPORT
void
szone_free_definite_size(szone_t *szone, void *ptr, size_t size);

MALLOC_NOEXPORT
size_t
szone_good_size(szone_t *szone, size_t size);

MALLOC_NOEXPORT
void *
szone_malloc(szone_t *szone, size_t size);

MALLOC_NOEXPORT
void *
szone_memalign(szone_t *szone, size_t alignment, size_t size);

MALLOC_NOEXPORT
size_t
szone_pressure_relief(szone_t *szone, size_t goal);

MALLOC_NOEXPORT
boolean_t
szone_claimed_address(szone_t *szone, void *ptr);

MALLOC_NOEXPORT
void *
szone_realloc(szone_t *szone, void *ptr, size_t new_size);

MALLOC_NOEXPORT
size_t
szone_size(szone_t *szone, const void *ptr);

MALLOC_NOEXPORT
size_t
szone_size_try_large(szone_t *szone, const void *ptr);

MALLOC_NOEXPORT
void *
szone_valloc(szone_t *szone, size_t size);

// MARK: tiny region allocator functions

MALLOC_NOEXPORT
boolean_t
tiny_check_region(rack_t *rack, region_t region, size_t region_index,
		unsigned counter);

MALLOC_NOEXPORT
void
tiny_finalize_region(rack_t *rack, magazine_t *tiny_mag_ptr);

MALLOC_NOEXPORT
int
tiny_free_detach_region(rack_t *rack, magazine_t *tiny_mag_ptr, region_t r);

MALLOC_NOEXPORT
boolean_t
tiny_free_list_check(rack_t *rack, grain_t slot, unsigned counter);

MALLOC_NOEXPORT
boolean_t
tiny_check(rack_t *rack, unsigned counter);

MALLOC_NOEXPORT
boolean_t
tiny_free_no_lock(rack_t *rack, magazine_t *tiny_mag_ptr, mag_index_t mag_index,
		region_t region, void *ptr, msize_t msize, uint32_t flags);

MALLOC_NOEXPORT
size_t
tiny_free_reattach_region(rack_t *rack, magazine_t *tiny_mag_ptr, region_t r);

MALLOC_NOEXPORT
void
tiny_free_scan_madvise_free(rack_t *rack, magazine_t *depot_ptr, region_t r);

MALLOC_NOEXPORT
kern_return_t
tiny_in_use_enumerator(task_t task, void *context, unsigned type_mask, szone_t *szone, memory_reader_t reader,
		vm_range_recorder_t recorder);

MALLOC_NOEXPORT
void *
tiny_malloc_from_free_list(rack_t *rack, magazine_t *tiny_mag_ptr, mag_index_t mag_index, msize_t msize);

MALLOC_NOEXPORT
void *
tiny_malloc_should_clear(rack_t *rack, msize_t msize, boolean_t cleared_requested);

MALLOC_NOEXPORT
void *
tiny_memalign(szone_t *szone, size_t alignment, size_t size, size_t span);

MALLOC_NOEXPORT
boolean_t
tiny_claimed_address(rack_t *rack, void *ptr);

MALLOC_NOEXPORT
void *
tiny_try_shrink_in_place(rack_t *rack, void *ptr, size_t old_size, size_t new_good_size);

MALLOC_NOEXPORT
boolean_t
tiny_try_realloc_in_place(rack_t *rack, void *ptr, size_t old_size, size_t new_size);

MALLOC_NOEXPORT
void
free_tiny(rack_t *rack, void *ptr, region_t tiny_region, size_t known_size,
		boolean_t partial_free);

MALLOC_NOEXPORT
size_t
tiny_size(rack_t *rack, const void *ptr);

MALLOC_NOEXPORT
unsigned
tiny_batch_malloc(szone_t *szone, size_t size, void **results, unsigned count);

MALLOC_NOEXPORT
void
tiny_batch_free(szone_t *szone, void **to_be_freed, unsigned count);

MALLOC_NOEXPORT
void
print_tiny_free_list(task_t task, memory_reader_t reader,
		print_task_printer_t printer, rack_t *rack);

MALLOC_NOEXPORT
void
print_tiny_region(task_t task, memory_reader_t reader,
		print_task_printer_t printer, int level, region_t region,
		size_t bytes_at_start, size_t bytes_at_end);

#if CONFIG_MADVISE_PRESSURE_RELIEF
MALLOC_NOEXPORT
void
tiny_madvise_pressure_relief(rack_t *rack);
#endif // CONFIG_MADVISE_PRESSURE_RELIEF

// MARK: small region allocation functions

MALLOC_NOEXPORT
boolean_t
small_check_region(rack_t *rack, region_t region, size_t region_index,
		unsigned counter);

MALLOC_NOEXPORT
void
small_finalize_region(rack_t *rack, magazine_t *small_mag_ptr);

MALLOC_NOEXPORT
int
small_free_detach_region(rack_t *rack, magazine_t *small_mag_ptr, region_t r);

MALLOC_NOEXPORT
boolean_t
small_free_list_check(rack_t *rack, grain_t slot, unsigned counter);

MALLOC_NOEXPORT
size_t
small_free_reattach_region(rack_t *rack, magazine_t *small_mag_ptr, region_t r);

MALLOC_NOEXPORT
void
small_free_scan_madvise_free(rack_t *rack, magazine_t *depot_ptr, region_t r);

MALLOC_NOEXPORT
kern_return_t
small_in_use_enumerator(task_t task, void *context, unsigned type_mask, szone_t *szone, memory_reader_t reader,
		vm_range_recorder_t recorder);

MALLOC_NOEXPORT
void *
small_malloc_should_clear(rack_t *rack, msize_t msize, boolean_t cleared_requested);

MALLOC_NOEXPORT
void *
small_memalign(szone_t *szone, size_t alignment, size_t size, size_t span);

MALLOC_NOEXPORT
boolean_t
small_claimed_address(rack_t *rack, void *ptr);

MALLOC_NOEXPORT
void *
small_try_shrink_in_place(rack_t *rack, void *ptr, size_t old_size, size_t new_good_size);

MALLOC_NOEXPORT
boolean_t
small_try_realloc_in_place(rack_t *rack, void *ptr, size_t old_size, size_t new_size);

MALLOC_NOEXPORT
void
free_small(rack_t *rack, void *ptr, region_t small_region, size_t known_size);

MALLOC_NOEXPORT
size_t
small_size(rack_t *rack, const void *ptr);

MALLOC_NOEXPORT
void
print_small_free_list(task_t task, memory_reader_t reader,
		print_task_printer_t printer, rack_t *rack);

MALLOC_NOEXPORT
void
print_small_region(task_t task, memory_reader_t reader,
		print_task_printer_t printer, szone_t *szone, int level,
		region_t region, size_t bytes_at_start, size_t bytes_at_end);

#if CONFIG_MADVISE_PRESSURE_RELIEF
MALLOC_NOEXPORT
void
small_madvise_pressure_relief(rack_t *rack);
#endif // CONFIG_MADVISE_PRESSURE_RELIEF

// MARK: medium region allocation functions

MALLOC_NOEXPORT
boolean_t
medium_check_region(rack_t *rack, region_t region, size_t region_index,
		unsigned counter);

MALLOC_NOEXPORT
void
medium_finalize_region(rack_t *rack, magazine_t *medium_mag_ptr);

MALLOC_NOEXPORT
int
medium_free_detach_region(rack_t *rack, magazine_t *medium_mag_ptr, region_t r);

MALLOC_NOEXPORT
boolean_t
medium_free_list_check(rack_t *rack, grain_t slot, unsigned counter);

MALLOC_NOEXPORT
size_t
medium_free_reattach_region(rack_t *rack, magazine_t *medium_mag_ptr, region_t r);

MALLOC_NOEXPORT
void
medium_free_scan_madvise_free(rack_t *rack, magazine_t *depot_ptr, region_t r);

MALLOC_NOEXPORT
kern_return_t
medium_in_use_enumerator(task_t task, void *context, unsigned type_mask, szone_t *szone, memory_reader_t reader,
		vm_range_recorder_t recorder);

MALLOC_NOEXPORT
void *
medium_malloc_should_clear(rack_t *rack, msize_t msize, boolean_t cleared_requested);

MALLOC_NOEXPORT
void *
medium_memalign(szone_t *szone, size_t alignment, size_t size, size_t span);

MALLOC_NOEXPORT
boolean_t
medium_claimed_address(rack_t *rack, void *ptr);

MALLOC_NOEXPORT
void *
medium_try_shrink_in_place(rack_t *rack, void *ptr, size_t old_size, size_t new_good_size);

MALLOC_NOEXPORT
boolean_t
medium_try_realloc_in_place(rack_t *rack, void *ptr, size_t old_size, size_t new_size);

MALLOC_NOEXPORT
void
free_medium(rack_t *rack, void *ptr, region_t medium_region, size_t known_size);

MALLOC_NOEXPORT
size_t
medium_size(rack_t *rack, const void *ptr);

MALLOC_NOEXPORT
void
print_medium_free_list(task_t task, memory_reader_t reader,
		print_task_printer_t printer, rack_t *rack);

MALLOC_NOEXPORT
void
print_medium_region(task_t task, memory_reader_t reader,
		print_task_printer_t printer, szone_t *szone, int level,
		region_t region, size_t bytes_at_start, size_t bytes_at_end);

MALLOC_NOEXPORT
void
print_medium_region_vis(szone_t *szone, region_t region);

#if CONFIG_MADVISE_PRESSURE_RELIEF
MALLOC_NOEXPORT
void
medium_madvise_pressure_relief(rack_t *rack);
#endif // CONFIG_MADVISE_PRESSURE_RELIEF

// MARK: large region allocator functions

MALLOC_NOEXPORT
bool
free_large(szone_t *szone, void *ptr, bool try);

MALLOC_NOEXPORT
void
large_entries_free_no_lock(szone_t *szone, large_entry_t *entries, unsigned num, vm_range_t *range_to_deallocate);

MALLOC_NOEXPORT
large_entry_t *
large_entry_for_pointer_no_lock(szone_t *szone, const void *ptr);

MALLOC_NOEXPORT
kern_return_t
large_in_use_enumerator(task_t task, void *context, unsigned type_mask, vm_address_t large_entries_address, unsigned num_entries,
		memory_reader_t reader, vm_range_recorder_t recorder);

MALLOC_NOEXPORT
int
large_try_realloc_in_place(szone_t *szone, void *ptr, size_t old_size, size_t new_size);

MALLOC_NOEXPORT
void *
large_try_shrink_in_place(szone_t *szone, void *ptr, size_t old_size, size_t new_good_size);

MALLOC_NOEXPORT
void *
large_malloc(szone_t *szone, size_t num_kernel_pages, unsigned char alignment, boolean_t cleared_requested);

MALLOC_NOEXPORT
boolean_t
large_claimed_address(szone_t *szone, void *ptr);

#if CONFIG_LARGE_CACHE
MALLOC_NOEXPORT
void
large_destroy_cache(szone_t *szone);
#endif // CONFIG_LARGE_CACHE


MALLOC_NOEXPORT
void
large_debug_print(task_t task, unsigned level, vm_address_t zone_address,
		memory_reader_t reader, print_task_printer_t printer);

MALLOC_NOEXPORT
void *
szone_malloc_should_clear(szone_t *szone, size_t size, boolean_t cleared_requested);

#endif // __MAGAZINE_MALLOC_H