Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
allendowney
GitHub Repository: allendowney/cpython
Path: blob/main/Objects/obmalloc.c
12 views
1
/* Python's malloc wrappers (see pymem.h) */
2
3
#include "Python.h"
4
#include "pycore_code.h" // stats
5
#include "pycore_pystate.h" // _PyInterpreterState_GET
6
7
#include "pycore_obmalloc.h"
8
#include "pycore_pymem.h"
9
10
#include <stdlib.h> // malloc()
11
#include <stdbool.h>
12
13
#undef uint
14
#define uint pymem_uint
15
16
17
/* Defined in tracemalloc.c */
18
extern void _PyMem_DumpTraceback(int fd, const void *ptr);
19
20
static void _PyObject_DebugDumpAddress(const void *p);
21
static void _PyMem_DebugCheckAddress(const char *func, char api_id, const void *p);
22
23
24
static void set_up_debug_hooks_domain_unlocked(PyMemAllocatorDomain domain);
25
static void set_up_debug_hooks_unlocked(void);
26
static void get_allocator_unlocked(PyMemAllocatorDomain, PyMemAllocatorEx *);
27
static void set_allocator_unlocked(PyMemAllocatorDomain, PyMemAllocatorEx *);
28
29
30
/***************************************/
31
/* low-level allocator implementations */
32
/***************************************/
33
34
/* the default raw allocator (wraps malloc) */
35
36
void *
37
_PyMem_RawMalloc(void *Py_UNUSED(ctx), size_t size)
38
{
39
/* PyMem_RawMalloc(0) means malloc(1). Some systems would return NULL
40
for malloc(0), which would be treated as an error. Some platforms would
41
return a pointer with no memory behind it, which would break pymalloc.
42
To solve these problems, allocate an extra byte. */
43
if (size == 0)
44
size = 1;
45
return malloc(size);
46
}
47
48
void *
49
_PyMem_RawCalloc(void *Py_UNUSED(ctx), size_t nelem, size_t elsize)
50
{
51
/* PyMem_RawCalloc(0, 0) means calloc(1, 1). Some systems would return NULL
52
for calloc(0, 0), which would be treated as an error. Some platforms
53
would return a pointer with no memory behind it, which would break
54
pymalloc. To solve these problems, allocate an extra byte. */
55
if (nelem == 0 || elsize == 0) {
56
nelem = 1;
57
elsize = 1;
58
}
59
return calloc(nelem, elsize);
60
}
61
62
void *
63
_PyMem_RawRealloc(void *Py_UNUSED(ctx), void *ptr, size_t size)
64
{
65
if (size == 0)
66
size = 1;
67
return realloc(ptr, size);
68
}
69
70
void
71
_PyMem_RawFree(void *Py_UNUSED(ctx), void *ptr)
72
{
73
free(ptr);
74
}
75
76
#define MALLOC_ALLOC {NULL, _PyMem_RawMalloc, _PyMem_RawCalloc, _PyMem_RawRealloc, _PyMem_RawFree}
77
#define PYRAW_ALLOC MALLOC_ALLOC
78
79
/* the default object allocator */
80
81
// The actual implementation is further down.
82
83
#ifdef WITH_PYMALLOC
84
void* _PyObject_Malloc(void *ctx, size_t size);
85
void* _PyObject_Calloc(void *ctx, size_t nelem, size_t elsize);
86
void _PyObject_Free(void *ctx, void *p);
87
void* _PyObject_Realloc(void *ctx, void *ptr, size_t size);
88
# define PYMALLOC_ALLOC {NULL, _PyObject_Malloc, _PyObject_Calloc, _PyObject_Realloc, _PyObject_Free}
89
# define PYOBJ_ALLOC PYMALLOC_ALLOC
90
#else
91
# define PYOBJ_ALLOC MALLOC_ALLOC
92
#endif // WITH_PYMALLOC
93
94
#define PYMEM_ALLOC PYOBJ_ALLOC
95
96
/* the default debug allocators */
97
98
// The actual implementation is further down.
99
100
void* _PyMem_DebugRawMalloc(void *ctx, size_t size);
101
void* _PyMem_DebugRawCalloc(void *ctx, size_t nelem, size_t elsize);
102
void* _PyMem_DebugRawRealloc(void *ctx, void *ptr, size_t size);
103
void _PyMem_DebugRawFree(void *ctx, void *ptr);
104
105
void* _PyMem_DebugMalloc(void *ctx, size_t size);
106
void* _PyMem_DebugCalloc(void *ctx, size_t nelem, size_t elsize);
107
void* _PyMem_DebugRealloc(void *ctx, void *ptr, size_t size);
108
void _PyMem_DebugFree(void *ctx, void *p);
109
110
#define PYDBGRAW_ALLOC \
111
{&_PyRuntime.allocators.debug.raw, _PyMem_DebugRawMalloc, _PyMem_DebugRawCalloc, _PyMem_DebugRawRealloc, _PyMem_DebugRawFree}
112
#define PYDBGMEM_ALLOC \
113
{&_PyRuntime.allocators.debug.mem, _PyMem_DebugMalloc, _PyMem_DebugCalloc, _PyMem_DebugRealloc, _PyMem_DebugFree}
114
#define PYDBGOBJ_ALLOC \
115
{&_PyRuntime.allocators.debug.obj, _PyMem_DebugMalloc, _PyMem_DebugCalloc, _PyMem_DebugRealloc, _PyMem_DebugFree}
116
117
/* the low-level virtual memory allocator */
118
119
#ifdef WITH_PYMALLOC
120
# ifdef MS_WINDOWS
121
# include <windows.h>
122
# elif defined(HAVE_MMAP)
123
# include <sys/mman.h>
124
# ifdef MAP_ANONYMOUS
125
# define ARENAS_USE_MMAP
126
# endif
127
# endif
128
#endif
129
130
void *
131
_PyMem_ArenaAlloc(void *Py_UNUSED(ctx), size_t size)
132
{
133
#ifdef MS_WINDOWS
134
return VirtualAlloc(NULL, size,
135
MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
136
#elif defined(ARENAS_USE_MMAP)
137
void *ptr;
138
ptr = mmap(NULL, size, PROT_READ|PROT_WRITE,
139
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
140
if (ptr == MAP_FAILED)
141
return NULL;
142
assert(ptr != NULL);
143
return ptr;
144
#else
145
return malloc(size);
146
#endif
147
}
148
149
void
150
_PyMem_ArenaFree(void *Py_UNUSED(ctx), void *ptr,
151
#if defined(ARENAS_USE_MMAP)
152
size_t size
153
#else
154
size_t Py_UNUSED(size)
155
#endif
156
)
157
{
158
#ifdef MS_WINDOWS
159
VirtualFree(ptr, 0, MEM_RELEASE);
160
#elif defined(ARENAS_USE_MMAP)
161
munmap(ptr, size);
162
#else
163
free(ptr);
164
#endif
165
}
166
167
/*******************************************/
168
/* end low-level allocator implementations */
169
/*******************************************/
170
171
172
#if defined(__has_feature) /* Clang */
173
# if __has_feature(address_sanitizer) /* is ASAN enabled? */
174
# define _Py_NO_SANITIZE_ADDRESS \
175
__attribute__((no_sanitize("address")))
176
# endif
177
# if __has_feature(thread_sanitizer) /* is TSAN enabled? */
178
# define _Py_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
179
# endif
180
# if __has_feature(memory_sanitizer) /* is MSAN enabled? */
181
# define _Py_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
182
# endif
183
#elif defined(__GNUC__)
184
# if defined(__SANITIZE_ADDRESS__) /* GCC 4.8+, is ASAN enabled? */
185
# define _Py_NO_SANITIZE_ADDRESS \
186
__attribute__((no_sanitize_address))
187
# endif
188
// TSAN is supported since GCC 5.1, but __SANITIZE_THREAD__ macro
189
// is provided only since GCC 7.
190
# if __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
191
# define _Py_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
192
# endif
193
#endif
194
195
#ifndef _Py_NO_SANITIZE_ADDRESS
196
# define _Py_NO_SANITIZE_ADDRESS
197
#endif
198
#ifndef _Py_NO_SANITIZE_THREAD
199
# define _Py_NO_SANITIZE_THREAD
200
#endif
201
#ifndef _Py_NO_SANITIZE_MEMORY
202
# define _Py_NO_SANITIZE_MEMORY
203
#endif
204
205
206
#define ALLOCATORS_MUTEX (_PyRuntime.allocators.mutex)
207
#define _PyMem_Raw (_PyRuntime.allocators.standard.raw)
208
#define _PyMem (_PyRuntime.allocators.standard.mem)
209
#define _PyObject (_PyRuntime.allocators.standard.obj)
210
#define _PyMem_Debug (_PyRuntime.allocators.debug)
211
#define _PyObject_Arena (_PyRuntime.allocators.obj_arena)
212
213
214
/***************************/
215
/* managing the allocators */
216
/***************************/
217
218
static int
219
set_default_allocator_unlocked(PyMemAllocatorDomain domain, int debug,
220
PyMemAllocatorEx *old_alloc)
221
{
222
if (old_alloc != NULL) {
223
get_allocator_unlocked(domain, old_alloc);
224
}
225
226
227
PyMemAllocatorEx new_alloc;
228
switch(domain)
229
{
230
case PYMEM_DOMAIN_RAW:
231
new_alloc = (PyMemAllocatorEx)PYRAW_ALLOC;
232
break;
233
case PYMEM_DOMAIN_MEM:
234
new_alloc = (PyMemAllocatorEx)PYMEM_ALLOC;
235
break;
236
case PYMEM_DOMAIN_OBJ:
237
new_alloc = (PyMemAllocatorEx)PYOBJ_ALLOC;
238
break;
239
default:
240
/* unknown domain */
241
return -1;
242
}
243
set_allocator_unlocked(domain, &new_alloc);
244
if (debug) {
245
set_up_debug_hooks_domain_unlocked(domain);
246
}
247
return 0;
248
}
249
250
251
#ifdef Py_DEBUG
252
static const int pydebug = 1;
253
#else
254
static const int pydebug = 0;
255
#endif
256
257
int
258
_PyMem_SetDefaultAllocator(PyMemAllocatorDomain domain,
259
PyMemAllocatorEx *old_alloc)
260
{
261
if (ALLOCATORS_MUTEX == NULL) {
262
/* The runtime must be initializing. */
263
return set_default_allocator_unlocked(domain, pydebug, old_alloc);
264
}
265
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
266
int res = set_default_allocator_unlocked(domain, pydebug, old_alloc);
267
PyThread_release_lock(ALLOCATORS_MUTEX);
268
return res;
269
}
270
271
272
int
273
_PyMem_GetAllocatorName(const char *name, PyMemAllocatorName *allocator)
274
{
275
if (name == NULL || *name == '\0') {
276
/* PYTHONMALLOC is empty or is not set or ignored (-E/-I command line
277
nameions): use default memory allocators */
278
*allocator = PYMEM_ALLOCATOR_DEFAULT;
279
}
280
else if (strcmp(name, "default") == 0) {
281
*allocator = PYMEM_ALLOCATOR_DEFAULT;
282
}
283
else if (strcmp(name, "debug") == 0) {
284
*allocator = PYMEM_ALLOCATOR_DEBUG;
285
}
286
#ifdef WITH_PYMALLOC
287
else if (strcmp(name, "pymalloc") == 0) {
288
*allocator = PYMEM_ALLOCATOR_PYMALLOC;
289
}
290
else if (strcmp(name, "pymalloc_debug") == 0) {
291
*allocator = PYMEM_ALLOCATOR_PYMALLOC_DEBUG;
292
}
293
#endif
294
else if (strcmp(name, "malloc") == 0) {
295
*allocator = PYMEM_ALLOCATOR_MALLOC;
296
}
297
else if (strcmp(name, "malloc_debug") == 0) {
298
*allocator = PYMEM_ALLOCATOR_MALLOC_DEBUG;
299
}
300
else {
301
/* unknown allocator */
302
return -1;
303
}
304
return 0;
305
}
306
307
308
static int
309
set_up_allocators_unlocked(PyMemAllocatorName allocator)
310
{
311
switch (allocator) {
312
case PYMEM_ALLOCATOR_NOT_SET:
313
/* do nothing */
314
break;
315
316
case PYMEM_ALLOCATOR_DEFAULT:
317
(void)set_default_allocator_unlocked(PYMEM_DOMAIN_RAW, pydebug, NULL);
318
(void)set_default_allocator_unlocked(PYMEM_DOMAIN_MEM, pydebug, NULL);
319
(void)set_default_allocator_unlocked(PYMEM_DOMAIN_OBJ, pydebug, NULL);
320
break;
321
322
case PYMEM_ALLOCATOR_DEBUG:
323
(void)set_default_allocator_unlocked(PYMEM_DOMAIN_RAW, 1, NULL);
324
(void)set_default_allocator_unlocked(PYMEM_DOMAIN_MEM, 1, NULL);
325
(void)set_default_allocator_unlocked(PYMEM_DOMAIN_OBJ, 1, NULL);
326
break;
327
328
#ifdef WITH_PYMALLOC
329
case PYMEM_ALLOCATOR_PYMALLOC:
330
case PYMEM_ALLOCATOR_PYMALLOC_DEBUG:
331
{
332
PyMemAllocatorEx malloc_alloc = MALLOC_ALLOC;
333
set_allocator_unlocked(PYMEM_DOMAIN_RAW, &malloc_alloc);
334
335
PyMemAllocatorEx pymalloc = PYMALLOC_ALLOC;
336
set_allocator_unlocked(PYMEM_DOMAIN_MEM, &pymalloc);
337
set_allocator_unlocked(PYMEM_DOMAIN_OBJ, &pymalloc);
338
339
if (allocator == PYMEM_ALLOCATOR_PYMALLOC_DEBUG) {
340
set_up_debug_hooks_unlocked();
341
}
342
break;
343
}
344
#endif
345
346
case PYMEM_ALLOCATOR_MALLOC:
347
case PYMEM_ALLOCATOR_MALLOC_DEBUG:
348
{
349
PyMemAllocatorEx malloc_alloc = MALLOC_ALLOC;
350
set_allocator_unlocked(PYMEM_DOMAIN_RAW, &malloc_alloc);
351
set_allocator_unlocked(PYMEM_DOMAIN_MEM, &malloc_alloc);
352
set_allocator_unlocked(PYMEM_DOMAIN_OBJ, &malloc_alloc);
353
354
if (allocator == PYMEM_ALLOCATOR_MALLOC_DEBUG) {
355
set_up_debug_hooks_unlocked();
356
}
357
break;
358
}
359
360
default:
361
/* unknown allocator */
362
return -1;
363
}
364
365
return 0;
366
}
367
368
int
369
_PyMem_SetupAllocators(PyMemAllocatorName allocator)
370
{
371
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
372
int res = set_up_allocators_unlocked(allocator);
373
PyThread_release_lock(ALLOCATORS_MUTEX);
374
return res;
375
}
376
377
378
static int
379
pymemallocator_eq(PyMemAllocatorEx *a, PyMemAllocatorEx *b)
380
{
381
return (memcmp(a, b, sizeof(PyMemAllocatorEx)) == 0);
382
}
383
384
385
static const char*
386
get_current_allocator_name_unlocked(void)
387
{
388
PyMemAllocatorEx malloc_alloc = MALLOC_ALLOC;
389
#ifdef WITH_PYMALLOC
390
PyMemAllocatorEx pymalloc = PYMALLOC_ALLOC;
391
#endif
392
393
if (pymemallocator_eq(&_PyMem_Raw, &malloc_alloc) &&
394
pymemallocator_eq(&_PyMem, &malloc_alloc) &&
395
pymemallocator_eq(&_PyObject, &malloc_alloc))
396
{
397
return "malloc";
398
}
399
#ifdef WITH_PYMALLOC
400
if (pymemallocator_eq(&_PyMem_Raw, &malloc_alloc) &&
401
pymemallocator_eq(&_PyMem, &pymalloc) &&
402
pymemallocator_eq(&_PyObject, &pymalloc))
403
{
404
return "pymalloc";
405
}
406
#endif
407
408
PyMemAllocatorEx dbg_raw = PYDBGRAW_ALLOC;
409
PyMemAllocatorEx dbg_mem = PYDBGMEM_ALLOC;
410
PyMemAllocatorEx dbg_obj = PYDBGOBJ_ALLOC;
411
412
if (pymemallocator_eq(&_PyMem_Raw, &dbg_raw) &&
413
pymemallocator_eq(&_PyMem, &dbg_mem) &&
414
pymemallocator_eq(&_PyObject, &dbg_obj))
415
{
416
/* Debug hooks installed */
417
if (pymemallocator_eq(&_PyMem_Debug.raw.alloc, &malloc_alloc) &&
418
pymemallocator_eq(&_PyMem_Debug.mem.alloc, &malloc_alloc) &&
419
pymemallocator_eq(&_PyMem_Debug.obj.alloc, &malloc_alloc))
420
{
421
return "malloc_debug";
422
}
423
#ifdef WITH_PYMALLOC
424
if (pymemallocator_eq(&_PyMem_Debug.raw.alloc, &malloc_alloc) &&
425
pymemallocator_eq(&_PyMem_Debug.mem.alloc, &pymalloc) &&
426
pymemallocator_eq(&_PyMem_Debug.obj.alloc, &pymalloc))
427
{
428
return "pymalloc_debug";
429
}
430
#endif
431
}
432
return NULL;
433
}
434
435
const char*
436
_PyMem_GetCurrentAllocatorName(void)
437
{
438
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
439
const char *name = get_current_allocator_name_unlocked();
440
PyThread_release_lock(ALLOCATORS_MUTEX);
441
return name;
442
}
443
444
445
#ifdef WITH_PYMALLOC
446
static int
447
_PyMem_DebugEnabled(void)
448
{
449
return (_PyObject.malloc == _PyMem_DebugMalloc);
450
}
451
452
static int
453
_PyMem_PymallocEnabled(void)
454
{
455
if (_PyMem_DebugEnabled()) {
456
return (_PyMem_Debug.obj.alloc.malloc == _PyObject_Malloc);
457
}
458
else {
459
return (_PyObject.malloc == _PyObject_Malloc);
460
}
461
}
462
#endif
463
464
465
static void
466
set_up_debug_hooks_domain_unlocked(PyMemAllocatorDomain domain)
467
{
468
PyMemAllocatorEx alloc;
469
470
if (domain == PYMEM_DOMAIN_RAW) {
471
if (_PyMem_Raw.malloc == _PyMem_DebugRawMalloc) {
472
return;
473
}
474
475
get_allocator_unlocked(domain, &_PyMem_Debug.raw.alloc);
476
alloc.ctx = &_PyMem_Debug.raw;
477
alloc.malloc = _PyMem_DebugRawMalloc;
478
alloc.calloc = _PyMem_DebugRawCalloc;
479
alloc.realloc = _PyMem_DebugRawRealloc;
480
alloc.free = _PyMem_DebugRawFree;
481
set_allocator_unlocked(domain, &alloc);
482
}
483
else if (domain == PYMEM_DOMAIN_MEM) {
484
if (_PyMem.malloc == _PyMem_DebugMalloc) {
485
return;
486
}
487
488
get_allocator_unlocked(domain, &_PyMem_Debug.mem.alloc);
489
alloc.ctx = &_PyMem_Debug.mem;
490
alloc.malloc = _PyMem_DebugMalloc;
491
alloc.calloc = _PyMem_DebugCalloc;
492
alloc.realloc = _PyMem_DebugRealloc;
493
alloc.free = _PyMem_DebugFree;
494
set_allocator_unlocked(domain, &alloc);
495
}
496
else if (domain == PYMEM_DOMAIN_OBJ) {
497
if (_PyObject.malloc == _PyMem_DebugMalloc) {
498
return;
499
}
500
501
get_allocator_unlocked(domain, &_PyMem_Debug.obj.alloc);
502
alloc.ctx = &_PyMem_Debug.obj;
503
alloc.malloc = _PyMem_DebugMalloc;
504
alloc.calloc = _PyMem_DebugCalloc;
505
alloc.realloc = _PyMem_DebugRealloc;
506
alloc.free = _PyMem_DebugFree;
507
set_allocator_unlocked(domain, &alloc);
508
}
509
}
510
511
512
static void
513
set_up_debug_hooks_unlocked(void)
514
{
515
set_up_debug_hooks_domain_unlocked(PYMEM_DOMAIN_RAW);
516
set_up_debug_hooks_domain_unlocked(PYMEM_DOMAIN_MEM);
517
set_up_debug_hooks_domain_unlocked(PYMEM_DOMAIN_OBJ);
518
}
519
520
void
521
PyMem_SetupDebugHooks(void)
522
{
523
if (ALLOCATORS_MUTEX == NULL) {
524
/* The runtime must not be completely initialized yet. */
525
set_up_debug_hooks_unlocked();
526
return;
527
}
528
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
529
set_up_debug_hooks_unlocked();
530
PyThread_release_lock(ALLOCATORS_MUTEX);
531
}
532
533
static void
534
get_allocator_unlocked(PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)
535
{
536
switch(domain)
537
{
538
case PYMEM_DOMAIN_RAW: *allocator = _PyMem_Raw; break;
539
case PYMEM_DOMAIN_MEM: *allocator = _PyMem; break;
540
case PYMEM_DOMAIN_OBJ: *allocator = _PyObject; break;
541
default:
542
/* unknown domain: set all attributes to NULL */
543
allocator->ctx = NULL;
544
allocator->malloc = NULL;
545
allocator->calloc = NULL;
546
allocator->realloc = NULL;
547
allocator->free = NULL;
548
}
549
}
550
551
static void
552
set_allocator_unlocked(PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)
553
{
554
switch(domain)
555
{
556
case PYMEM_DOMAIN_RAW: _PyMem_Raw = *allocator; break;
557
case PYMEM_DOMAIN_MEM: _PyMem = *allocator; break;
558
case PYMEM_DOMAIN_OBJ: _PyObject = *allocator; break;
559
/* ignore unknown domain */
560
}
561
}
562
563
void
564
PyMem_GetAllocator(PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)
565
{
566
if (ALLOCATORS_MUTEX == NULL) {
567
/* The runtime must not be completely initialized yet. */
568
get_allocator_unlocked(domain, allocator);
569
return;
570
}
571
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
572
get_allocator_unlocked(domain, allocator);
573
PyThread_release_lock(ALLOCATORS_MUTEX);
574
}
575
576
void
577
PyMem_SetAllocator(PyMemAllocatorDomain domain, PyMemAllocatorEx *allocator)
578
{
579
if (ALLOCATORS_MUTEX == NULL) {
580
/* The runtime must not be completely initialized yet. */
581
set_allocator_unlocked(domain, allocator);
582
return;
583
}
584
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
585
set_allocator_unlocked(domain, allocator);
586
PyThread_release_lock(ALLOCATORS_MUTEX);
587
}
588
589
void
590
PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator)
591
{
592
if (ALLOCATORS_MUTEX == NULL) {
593
/* The runtime must not be completely initialized yet. */
594
*allocator = _PyObject_Arena;
595
return;
596
}
597
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
598
*allocator = _PyObject_Arena;
599
PyThread_release_lock(ALLOCATORS_MUTEX);
600
}
601
602
void
603
PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator)
604
{
605
if (ALLOCATORS_MUTEX == NULL) {
606
/* The runtime must not be completely initialized yet. */
607
_PyObject_Arena = *allocator;
608
return;
609
}
610
PyThread_acquire_lock(ALLOCATORS_MUTEX, WAIT_LOCK);
611
_PyObject_Arena = *allocator;
612
PyThread_release_lock(ALLOCATORS_MUTEX);
613
}
614
615
616
/* Note that there is a possible, but very unlikely, race in any place
617
* below where we call one of the allocator functions. We access two
618
* fields in each case: "malloc", etc. and "ctx".
619
*
620
* It is unlikely that the allocator will be changed while one of those
621
* calls is happening, much less in that very narrow window.
622
* Furthermore, the likelihood of a race is drastically reduced by the
623
* fact that the allocator may not be changed after runtime init
624
* (except with a wrapper).
625
*
626
* With the above in mind, we currently don't worry about locking
627
* around these uses of the runtime-global allocators state. */
628
629
630
/*************************/
631
/* the "arena" allocator */
632
/*************************/
633
634
void *
635
_PyObject_VirtualAlloc(size_t size)
636
{
637
return _PyObject_Arena.alloc(_PyObject_Arena.ctx, size);
638
}
639
640
void
641
_PyObject_VirtualFree(void *obj, size_t size)
642
{
643
_PyObject_Arena.free(_PyObject_Arena.ctx, obj, size);
644
}
645
646
647
/***********************/
648
/* the "raw" allocator */
649
/***********************/
650
651
void *
652
PyMem_RawMalloc(size_t size)
653
{
654
/*
655
* Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
656
* Most python internals blindly use a signed Py_ssize_t to track
657
* things without checking for overflows or negatives.
658
* As size_t is unsigned, checking for size < 0 is not required.
659
*/
660
if (size > (size_t)PY_SSIZE_T_MAX)
661
return NULL;
662
return _PyMem_Raw.malloc(_PyMem_Raw.ctx, size);
663
}
664
665
void *
666
PyMem_RawCalloc(size_t nelem, size_t elsize)
667
{
668
/* see PyMem_RawMalloc() */
669
if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize)
670
return NULL;
671
return _PyMem_Raw.calloc(_PyMem_Raw.ctx, nelem, elsize);
672
}
673
674
void*
675
PyMem_RawRealloc(void *ptr, size_t new_size)
676
{
677
/* see PyMem_RawMalloc() */
678
if (new_size > (size_t)PY_SSIZE_T_MAX)
679
return NULL;
680
return _PyMem_Raw.realloc(_PyMem_Raw.ctx, ptr, new_size);
681
}
682
683
void PyMem_RawFree(void *ptr)
684
{
685
_PyMem_Raw.free(_PyMem_Raw.ctx, ptr);
686
}
687
688
689
/***********************/
690
/* the "mem" allocator */
691
/***********************/
692
693
void *
694
PyMem_Malloc(size_t size)
695
{
696
/* see PyMem_RawMalloc() */
697
if (size > (size_t)PY_SSIZE_T_MAX)
698
return NULL;
699
OBJECT_STAT_INC_COND(allocations512, size < 512);
700
OBJECT_STAT_INC_COND(allocations4k, size >= 512 && size < 4094);
701
OBJECT_STAT_INC_COND(allocations_big, size >= 4094);
702
OBJECT_STAT_INC(allocations);
703
return _PyMem.malloc(_PyMem.ctx, size);
704
}
705
706
void *
707
PyMem_Calloc(size_t nelem, size_t elsize)
708
{
709
/* see PyMem_RawMalloc() */
710
if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize)
711
return NULL;
712
OBJECT_STAT_INC_COND(allocations512, elsize < 512);
713
OBJECT_STAT_INC_COND(allocations4k, elsize >= 512 && elsize < 4094);
714
OBJECT_STAT_INC_COND(allocations_big, elsize >= 4094);
715
OBJECT_STAT_INC(allocations);
716
return _PyMem.calloc(_PyMem.ctx, nelem, elsize);
717
}
718
719
void *
720
PyMem_Realloc(void *ptr, size_t new_size)
721
{
722
/* see PyMem_RawMalloc() */
723
if (new_size > (size_t)PY_SSIZE_T_MAX)
724
return NULL;
725
return _PyMem.realloc(_PyMem.ctx, ptr, new_size);
726
}
727
728
void
729
PyMem_Free(void *ptr)
730
{
731
OBJECT_STAT_INC(frees);
732
_PyMem.free(_PyMem.ctx, ptr);
733
}
734
735
736
/***************************/
737
/* pymem utility functions */
738
/***************************/
739
740
wchar_t*
741
_PyMem_RawWcsdup(const wchar_t *str)
742
{
743
assert(str != NULL);
744
745
size_t len = wcslen(str);
746
if (len > (size_t)PY_SSIZE_T_MAX / sizeof(wchar_t) - 1) {
747
return NULL;
748
}
749
750
size_t size = (len + 1) * sizeof(wchar_t);
751
wchar_t *str2 = PyMem_RawMalloc(size);
752
if (str2 == NULL) {
753
return NULL;
754
}
755
756
memcpy(str2, str, size);
757
return str2;
758
}
759
760
char *
761
_PyMem_RawStrdup(const char *str)
762
{
763
assert(str != NULL);
764
size_t size = strlen(str) + 1;
765
char *copy = PyMem_RawMalloc(size);
766
if (copy == NULL) {
767
return NULL;
768
}
769
memcpy(copy, str, size);
770
return copy;
771
}
772
773
char *
774
_PyMem_Strdup(const char *str)
775
{
776
assert(str != NULL);
777
size_t size = strlen(str) + 1;
778
char *copy = PyMem_Malloc(size);
779
if (copy == NULL) {
780
return NULL;
781
}
782
memcpy(copy, str, size);
783
return copy;
784
}
785
786
787
/**************************/
788
/* the "object" allocator */
789
/**************************/
790
791
void *
792
PyObject_Malloc(size_t size)
793
{
794
/* see PyMem_RawMalloc() */
795
if (size > (size_t)PY_SSIZE_T_MAX)
796
return NULL;
797
OBJECT_STAT_INC_COND(allocations512, size < 512);
798
OBJECT_STAT_INC_COND(allocations4k, size >= 512 && size < 4094);
799
OBJECT_STAT_INC_COND(allocations_big, size >= 4094);
800
OBJECT_STAT_INC(allocations);
801
return _PyObject.malloc(_PyObject.ctx, size);
802
}
803
804
void *
805
PyObject_Calloc(size_t nelem, size_t elsize)
806
{
807
/* see PyMem_RawMalloc() */
808
if (elsize != 0 && nelem > (size_t)PY_SSIZE_T_MAX / elsize)
809
return NULL;
810
OBJECT_STAT_INC_COND(allocations512, elsize < 512);
811
OBJECT_STAT_INC_COND(allocations4k, elsize >= 512 && elsize < 4094);
812
OBJECT_STAT_INC_COND(allocations_big, elsize >= 4094);
813
OBJECT_STAT_INC(allocations);
814
return _PyObject.calloc(_PyObject.ctx, nelem, elsize);
815
}
816
817
void *
818
PyObject_Realloc(void *ptr, size_t new_size)
819
{
820
/* see PyMem_RawMalloc() */
821
if (new_size > (size_t)PY_SSIZE_T_MAX)
822
return NULL;
823
return _PyObject.realloc(_PyObject.ctx, ptr, new_size);
824
}
825
826
void
827
PyObject_Free(void *ptr)
828
{
829
OBJECT_STAT_INC(frees);
830
_PyObject.free(_PyObject.ctx, ptr);
831
}
832
833
834
/* If we're using GCC, use __builtin_expect() to reduce overhead of
835
the valgrind checks */
836
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
837
# define UNLIKELY(value) __builtin_expect((value), 0)
838
# define LIKELY(value) __builtin_expect((value), 1)
839
#else
840
# define UNLIKELY(value) (value)
841
# define LIKELY(value) (value)
842
#endif
843
844
#ifdef WITH_PYMALLOC
845
846
#ifdef WITH_VALGRIND
847
#include <valgrind/valgrind.h>
848
849
/* -1 indicates that we haven't checked that we're running on valgrind yet. */
850
static int running_on_valgrind = -1;
851
#endif
852
853
typedef struct _obmalloc_state OMState;
854
855
static inline int
856
has_own_state(PyInterpreterState *interp)
857
{
858
return (_Py_IsMainInterpreter(interp) ||
859
!(interp->feature_flags & Py_RTFLAGS_USE_MAIN_OBMALLOC) ||
860
_Py_IsMainInterpreterFinalizing(interp));
861
}
862
863
static inline OMState *
864
get_state(void)
865
{
866
PyInterpreterState *interp = _PyInterpreterState_GET();
867
if (!has_own_state(interp)) {
868
interp = _PyInterpreterState_Main();
869
}
870
return &interp->obmalloc;
871
}
872
873
// These macros all rely on a local "state" variable.
874
#define usedpools (state->pools.used)
875
#define allarenas (state->mgmt.arenas)
876
#define maxarenas (state->mgmt.maxarenas)
877
#define unused_arena_objects (state->mgmt.unused_arena_objects)
878
#define usable_arenas (state->mgmt.usable_arenas)
879
#define nfp2lasta (state->mgmt.nfp2lasta)
880
#define narenas_currently_allocated (state->mgmt.narenas_currently_allocated)
881
#define ntimes_arena_allocated (state->mgmt.ntimes_arena_allocated)
882
#define narenas_highwater (state->mgmt.narenas_highwater)
883
#define raw_allocated_blocks (state->mgmt.raw_allocated_blocks)
884
885
Py_ssize_t
886
_PyInterpreterState_GetAllocatedBlocks(PyInterpreterState *interp)
887
{
888
#ifdef Py_DEBUG
889
assert(has_own_state(interp));
890
#else
891
if (!has_own_state(interp)) {
892
_Py_FatalErrorFunc(__func__,
893
"the interpreter doesn't have its own allocator");
894
}
895
#endif
896
OMState *state = &interp->obmalloc;
897
898
Py_ssize_t n = raw_allocated_blocks;
899
/* add up allocated blocks for used pools */
900
for (uint i = 0; i < maxarenas; ++i) {
901
/* Skip arenas which are not allocated. */
902
if (allarenas[i].address == 0) {
903
continue;
904
}
905
906
uintptr_t base = (uintptr_t)_Py_ALIGN_UP(allarenas[i].address, POOL_SIZE);
907
908
/* visit every pool in the arena */
909
assert(base <= (uintptr_t) allarenas[i].pool_address);
910
for (; base < (uintptr_t) allarenas[i].pool_address; base += POOL_SIZE) {
911
poolp p = (poolp)base;
912
n += p->ref.count;
913
}
914
}
915
return n;
916
}
917
918
void
919
_PyInterpreterState_FinalizeAllocatedBlocks(PyInterpreterState *interp)
920
{
921
if (has_own_state(interp)) {
922
Py_ssize_t leaked = _PyInterpreterState_GetAllocatedBlocks(interp);
923
assert(has_own_state(interp) || leaked == 0);
924
interp->runtime->obmalloc.interpreter_leaks += leaked;
925
}
926
}
927
928
static Py_ssize_t get_num_global_allocated_blocks(_PyRuntimeState *);
929
930
/* We preserve the number of blockss leaked during runtime finalization,
931
so they can be reported if the runtime is initialized again. */
932
// XXX We don't lose any information by dropping this,
933
// so we should consider doing so.
934
static Py_ssize_t last_final_leaks = 0;
935
936
void
937
_Py_FinalizeAllocatedBlocks(_PyRuntimeState *runtime)
938
{
939
last_final_leaks = get_num_global_allocated_blocks(runtime);
940
runtime->obmalloc.interpreter_leaks = 0;
941
}
942
943
static Py_ssize_t
944
get_num_global_allocated_blocks(_PyRuntimeState *runtime)
945
{
946
Py_ssize_t total = 0;
947
if (_PyRuntimeState_GetFinalizing(runtime) != NULL) {
948
PyInterpreterState *interp = _PyInterpreterState_Main();
949
if (interp == NULL) {
950
/* We are at the very end of runtime finalization.
951
We can't rely on finalizing->interp since that thread
952
state is probably already freed, so we don't worry
953
about it. */
954
assert(PyInterpreterState_Head() == NULL);
955
}
956
else {
957
assert(interp != NULL);
958
/* It is probably the last interpreter but not necessarily. */
959
assert(PyInterpreterState_Next(interp) == NULL);
960
total += _PyInterpreterState_GetAllocatedBlocks(interp);
961
}
962
}
963
else {
964
HEAD_LOCK(runtime);
965
PyInterpreterState *interp = PyInterpreterState_Head();
966
assert(interp != NULL);
967
#ifdef Py_DEBUG
968
int got_main = 0;
969
#endif
970
for (; interp != NULL; interp = PyInterpreterState_Next(interp)) {
971
#ifdef Py_DEBUG
972
if (_Py_IsMainInterpreter(interp)) {
973
assert(!got_main);
974
got_main = 1;
975
assert(has_own_state(interp));
976
}
977
#endif
978
if (has_own_state(interp)) {
979
total += _PyInterpreterState_GetAllocatedBlocks(interp);
980
}
981
}
982
HEAD_UNLOCK(runtime);
983
#ifdef Py_DEBUG
984
assert(got_main);
985
#endif
986
}
987
total += runtime->obmalloc.interpreter_leaks;
988
total += last_final_leaks;
989
return total;
990
}
991
992
Py_ssize_t
993
_Py_GetGlobalAllocatedBlocks(void)
994
{
995
return get_num_global_allocated_blocks(&_PyRuntime);
996
}
997
998
#if WITH_PYMALLOC_RADIX_TREE
999
/*==========================================================================*/
1000
/* radix tree for tracking arena usage. */
1001
1002
#define arena_map_root (state->usage.arena_map_root)
1003
#ifdef USE_INTERIOR_NODES
1004
#define arena_map_mid_count (state->usage.arena_map_mid_count)
1005
#define arena_map_bot_count (state->usage.arena_map_bot_count)
1006
#endif
1007
1008
/* Return a pointer to a bottom tree node, return NULL if it doesn't exist or
1009
* it cannot be created */
1010
static inline Py_ALWAYS_INLINE arena_map_bot_t *
1011
arena_map_get(OMState *state, pymem_block *p, int create)
1012
{
1013
#ifdef USE_INTERIOR_NODES
1014
/* sanity check that IGNORE_BITS is correct */
1015
assert(HIGH_BITS(p) == HIGH_BITS(&arena_map_root));
1016
int i1 = MAP_TOP_INDEX(p);
1017
if (arena_map_root.ptrs[i1] == NULL) {
1018
if (!create) {
1019
return NULL;
1020
}
1021
arena_map_mid_t *n = PyMem_RawCalloc(1, sizeof(arena_map_mid_t));
1022
if (n == NULL) {
1023
return NULL;
1024
}
1025
arena_map_root.ptrs[i1] = n;
1026
arena_map_mid_count++;
1027
}
1028
int i2 = MAP_MID_INDEX(p);
1029
if (arena_map_root.ptrs[i1]->ptrs[i2] == NULL) {
1030
if (!create) {
1031
return NULL;
1032
}
1033
arena_map_bot_t *n = PyMem_RawCalloc(1, sizeof(arena_map_bot_t));
1034
if (n == NULL) {
1035
return NULL;
1036
}
1037
arena_map_root.ptrs[i1]->ptrs[i2] = n;
1038
arena_map_bot_count++;
1039
}
1040
return arena_map_root.ptrs[i1]->ptrs[i2];
1041
#else
1042
return &arena_map_root;
1043
#endif
1044
}
1045
1046
1047
/* The radix tree only tracks arenas. So, for 16 MiB arenas, we throw
1048
* away 24 bits of the address. That reduces the space requirement of
1049
* the tree compared to similar radix tree page-map schemes. In
1050
* exchange for slashing the space requirement, it needs more
1051
* computation to check an address.
1052
*
1053
* Tracking coverage is done by "ideal" arena address. It is easier to
1054
* explain in decimal so let's say that the arena size is 100 bytes.
1055
* Then, ideal addresses are 100, 200, 300, etc. For checking if a
1056
* pointer address is inside an actual arena, we have to check two ideal
1057
* arena addresses. E.g. if pointer is 357, we need to check 200 and
1058
* 300. In the rare case that an arena is aligned in the ideal way
1059
* (e.g. base address of arena is 200) then we only have to check one
1060
* ideal address.
1061
*
1062
* The tree nodes for 200 and 300 both store the address of arena.
1063
* There are two cases: the arena starts at a lower ideal arena and
1064
* extends to this one, or the arena starts in this arena and extends to
1065
* the next ideal arena. The tail_lo and tail_hi members correspond to
1066
* these two cases.
1067
*/
1068
1069
1070
/* mark or unmark addresses covered by arena */
1071
static int
1072
arena_map_mark_used(OMState *state, uintptr_t arena_base, int is_used)
1073
{
1074
/* sanity check that IGNORE_BITS is correct */
1075
assert(HIGH_BITS(arena_base) == HIGH_BITS(&arena_map_root));
1076
arena_map_bot_t *n_hi = arena_map_get(
1077
state, (pymem_block *)arena_base, is_used);
1078
if (n_hi == NULL) {
1079
assert(is_used); /* otherwise node should already exist */
1080
return 0; /* failed to allocate space for node */
1081
}
1082
int i3 = MAP_BOT_INDEX((pymem_block *)arena_base);
1083
int32_t tail = (int32_t)(arena_base & ARENA_SIZE_MASK);
1084
if (tail == 0) {
1085
/* is ideal arena address */
1086
n_hi->arenas[i3].tail_hi = is_used ? -1 : 0;
1087
}
1088
else {
1089
/* arena_base address is not ideal (aligned to arena size) and
1090
* so it potentially covers two MAP_BOT nodes. Get the MAP_BOT node
1091
* for the next arena. Note that it might be in different MAP_TOP
1092
* and MAP_MID nodes as well so we need to call arena_map_get()
1093
* again (do the full tree traversal).
1094
*/
1095
n_hi->arenas[i3].tail_hi = is_used ? tail : 0;
1096
uintptr_t arena_base_next = arena_base + ARENA_SIZE;
1097
/* If arena_base is a legit arena address, so is arena_base_next - 1
1098
* (last address in arena). If arena_base_next overflows then it
1099
* must overflow to 0. However, that would mean arena_base was
1100
* "ideal" and we should not be in this case. */
1101
assert(arena_base < arena_base_next);
1102
arena_map_bot_t *n_lo = arena_map_get(
1103
state, (pymem_block *)arena_base_next, is_used);
1104
if (n_lo == NULL) {
1105
assert(is_used); /* otherwise should already exist */
1106
n_hi->arenas[i3].tail_hi = 0;
1107
return 0; /* failed to allocate space for node */
1108
}
1109
int i3_next = MAP_BOT_INDEX(arena_base_next);
1110
n_lo->arenas[i3_next].tail_lo = is_used ? tail : 0;
1111
}
1112
return 1;
1113
}
1114
1115
/* Return true if 'p' is a pointer inside an obmalloc arena.
1116
* _PyObject_Free() calls this so it needs to be very fast. */
1117
static int
1118
arena_map_is_used(OMState *state, pymem_block *p)
1119
{
1120
arena_map_bot_t *n = arena_map_get(state, p, 0);
1121
if (n == NULL) {
1122
return 0;
1123
}
1124
int i3 = MAP_BOT_INDEX(p);
1125
/* ARENA_BITS must be < 32 so that the tail is a non-negative int32_t. */
1126
int32_t hi = n->arenas[i3].tail_hi;
1127
int32_t lo = n->arenas[i3].tail_lo;
1128
int32_t tail = (int32_t)(AS_UINT(p) & ARENA_SIZE_MASK);
1129
return (tail < lo) || (tail >= hi && hi != 0);
1130
}
1131
1132
/* end of radix tree logic */
1133
/*==========================================================================*/
1134
#endif /* WITH_PYMALLOC_RADIX_TREE */
1135
1136
1137
/* Allocate a new arena. If we run out of memory, return NULL. Else
1138
* allocate a new arena, and return the address of an arena_object
1139
* describing the new arena. It's expected that the caller will set
1140
* `usable_arenas` to the return value.
1141
*/
1142
static struct arena_object*
1143
new_arena(OMState *state)
1144
{
1145
struct arena_object* arenaobj;
1146
uint excess; /* number of bytes above pool alignment */
1147
void *address;
1148
1149
int debug_stats = _PyRuntime.obmalloc.dump_debug_stats;
1150
if (debug_stats == -1) {
1151
const char *opt = Py_GETENV("PYTHONMALLOCSTATS");
1152
debug_stats = (opt != NULL && *opt != '\0');
1153
_PyRuntime.obmalloc.dump_debug_stats = debug_stats;
1154
}
1155
if (debug_stats) {
1156
_PyObject_DebugMallocStats(stderr);
1157
}
1158
1159
if (unused_arena_objects == NULL) {
1160
uint i;
1161
uint numarenas;
1162
size_t nbytes;
1163
1164
/* Double the number of arena objects on each allocation.
1165
* Note that it's possible for `numarenas` to overflow.
1166
*/
1167
numarenas = maxarenas ? maxarenas << 1 : INITIAL_ARENA_OBJECTS;
1168
if (numarenas <= maxarenas)
1169
return NULL; /* overflow */
1170
#if SIZEOF_SIZE_T <= SIZEOF_INT
1171
if (numarenas > SIZE_MAX / sizeof(*allarenas))
1172
return NULL; /* overflow */
1173
#endif
1174
nbytes = numarenas * sizeof(*allarenas);
1175
arenaobj = (struct arena_object *)PyMem_RawRealloc(allarenas, nbytes);
1176
if (arenaobj == NULL)
1177
return NULL;
1178
allarenas = arenaobj;
1179
1180
/* We might need to fix pointers that were copied. However,
1181
* new_arena only gets called when all the pages in the
1182
* previous arenas are full. Thus, there are *no* pointers
1183
* into the old array. Thus, we don't have to worry about
1184
* invalid pointers. Just to be sure, some asserts:
1185
*/
1186
assert(usable_arenas == NULL);
1187
assert(unused_arena_objects == NULL);
1188
1189
/* Put the new arenas on the unused_arena_objects list. */
1190
for (i = maxarenas; i < numarenas; ++i) {
1191
allarenas[i].address = 0; /* mark as unassociated */
1192
allarenas[i].nextarena = i < numarenas - 1 ?
1193
&allarenas[i+1] : NULL;
1194
}
1195
1196
/* Update globals. */
1197
unused_arena_objects = &allarenas[maxarenas];
1198
maxarenas = numarenas;
1199
}
1200
1201
/* Take the next available arena object off the head of the list. */
1202
assert(unused_arena_objects != NULL);
1203
arenaobj = unused_arena_objects;
1204
unused_arena_objects = arenaobj->nextarena;
1205
assert(arenaobj->address == 0);
1206
address = _PyObject_Arena.alloc(_PyObject_Arena.ctx, ARENA_SIZE);
1207
#if WITH_PYMALLOC_RADIX_TREE
1208
if (address != NULL) {
1209
if (!arena_map_mark_used(state, (uintptr_t)address, 1)) {
1210
/* marking arena in radix tree failed, abort */
1211
_PyObject_Arena.free(_PyObject_Arena.ctx, address, ARENA_SIZE);
1212
address = NULL;
1213
}
1214
}
1215
#endif
1216
if (address == NULL) {
1217
/* The allocation failed: return NULL after putting the
1218
* arenaobj back.
1219
*/
1220
arenaobj->nextarena = unused_arena_objects;
1221
unused_arena_objects = arenaobj;
1222
return NULL;
1223
}
1224
arenaobj->address = (uintptr_t)address;
1225
1226
++narenas_currently_allocated;
1227
++ntimes_arena_allocated;
1228
if (narenas_currently_allocated > narenas_highwater)
1229
narenas_highwater = narenas_currently_allocated;
1230
arenaobj->freepools = NULL;
1231
/* pool_address <- first pool-aligned address in the arena
1232
nfreepools <- number of whole pools that fit after alignment */
1233
arenaobj->pool_address = (pymem_block*)arenaobj->address;
1234
arenaobj->nfreepools = MAX_POOLS_IN_ARENA;
1235
excess = (uint)(arenaobj->address & POOL_SIZE_MASK);
1236
if (excess != 0) {
1237
--arenaobj->nfreepools;
1238
arenaobj->pool_address += POOL_SIZE - excess;
1239
}
1240
arenaobj->ntotalpools = arenaobj->nfreepools;
1241
1242
return arenaobj;
1243
}
1244
1245
1246
1247
#if WITH_PYMALLOC_RADIX_TREE
1248
/* Return true if and only if P is an address that was allocated by
1249
pymalloc. When the radix tree is used, 'poolp' is unused.
1250
*/
1251
static bool
1252
address_in_range(OMState *state, void *p, poolp Py_UNUSED(pool))
1253
{
1254
return arena_map_is_used(state, p);
1255
}
1256
#else
1257
/*
1258
address_in_range(P, POOL)
1259
1260
Return true if and only if P is an address that was allocated by pymalloc.
1261
POOL must be the pool address associated with P, i.e., POOL = POOL_ADDR(P)
1262
(the caller is asked to compute this because the macro expands POOL more than
1263
once, and for efficiency it's best for the caller to assign POOL_ADDR(P) to a
1264
variable and pass the latter to the macro; because address_in_range is
1265
called on every alloc/realloc/free, micro-efficiency is important here).
1266
1267
Tricky: Let B be the arena base address associated with the pool, B =
1268
arenas[(POOL)->arenaindex].address. Then P belongs to the arena if and only if
1269
1270
B <= P < B + ARENA_SIZE
1271
1272
Subtracting B throughout, this is true iff
1273
1274
0 <= P-B < ARENA_SIZE
1275
1276
By using unsigned arithmetic, the "0 <=" half of the test can be skipped.
1277
1278
Obscure: A PyMem "free memory" function can call the pymalloc free or realloc
1279
before the first arena has been allocated. `arenas` is still NULL in that
1280
case. We're relying on that maxarenas is also 0 in that case, so that
1281
(POOL)->arenaindex < maxarenas must be false, saving us from trying to index
1282
into a NULL arenas.
1283
1284
Details: given P and POOL, the arena_object corresponding to P is AO =
1285
arenas[(POOL)->arenaindex]. Suppose obmalloc controls P. Then (barring wild
1286
stores, etc), POOL is the correct address of P's pool, AO.address is the
1287
correct base address of the pool's arena, and P must be within ARENA_SIZE of
1288
AO.address. In addition, AO.address is not 0 (no arena can start at address 0
1289
(NULL)). Therefore address_in_range correctly reports that obmalloc
1290
controls P.
1291
1292
Now suppose obmalloc does not control P (e.g., P was obtained via a direct
1293
call to the system malloc() or realloc()). (POOL)->arenaindex may be anything
1294
in this case -- it may even be uninitialized trash. If the trash arenaindex
1295
is >= maxarenas, the macro correctly concludes at once that obmalloc doesn't
1296
control P.
1297
1298
Else arenaindex is < maxarena, and AO is read up. If AO corresponds to an
1299
allocated arena, obmalloc controls all the memory in slice AO.address :
1300
AO.address+ARENA_SIZE. By case assumption, P is not controlled by obmalloc,
1301
so P doesn't lie in that slice, so the macro correctly reports that P is not
1302
controlled by obmalloc.
1303
1304
Finally, if P is not controlled by obmalloc and AO corresponds to an unused
1305
arena_object (one not currently associated with an allocated arena),
1306
AO.address is 0, and the second test in the macro reduces to:
1307
1308
P < ARENA_SIZE
1309
1310
If P >= ARENA_SIZE (extremely likely), the macro again correctly concludes
1311
that P is not controlled by obmalloc. However, if P < ARENA_SIZE, this part
1312
of the test still passes, and the third clause (AO.address != 0) is necessary
1313
to get the correct result: AO.address is 0 in this case, so the macro
1314
correctly reports that P is not controlled by obmalloc (despite that P lies in
1315
slice AO.address : AO.address + ARENA_SIZE).
1316
1317
Note: The third (AO.address != 0) clause was added in Python 2.5. Before
1318
2.5, arenas were never free()'ed, and an arenaindex < maxarena always
1319
corresponded to a currently-allocated arena, so the "P is not controlled by
1320
obmalloc, AO corresponds to an unused arena_object, and P < ARENA_SIZE" case
1321
was impossible.
1322
1323
Note that the logic is excruciating, and reading up possibly uninitialized
1324
memory when P is not controlled by obmalloc (to get at (POOL)->arenaindex)
1325
creates problems for some memory debuggers. The overwhelming advantage is
1326
that this test determines whether an arbitrary address is controlled by
1327
obmalloc in a small constant time, independent of the number of arenas
1328
obmalloc controls. Since this test is needed at every entry point, it's
1329
extremely desirable that it be this fast.
1330
*/
1331
1332
static bool _Py_NO_SANITIZE_ADDRESS
1333
_Py_NO_SANITIZE_THREAD
1334
_Py_NO_SANITIZE_MEMORY
1335
address_in_range(OMState *state, void *p, poolp pool)
1336
{
1337
// Since address_in_range may be reading from memory which was not allocated
1338
// by Python, it is important that pool->arenaindex is read only once, as
1339
// another thread may be concurrently modifying the value without holding
1340
// the GIL. The following dance forces the compiler to read pool->arenaindex
1341
// only once.
1342
uint arenaindex = *((volatile uint *)&pool->arenaindex);
1343
return arenaindex < maxarenas &&
1344
(uintptr_t)p - allarenas[arenaindex].address < ARENA_SIZE &&
1345
allarenas[arenaindex].address != 0;
1346
}
1347
1348
#endif /* !WITH_PYMALLOC_RADIX_TREE */
1349
1350
/*==========================================================================*/
1351
1352
// Called when freelist is exhausted. Extend the freelist if there is
1353
// space for a block. Otherwise, remove this pool from usedpools.
1354
static void
1355
pymalloc_pool_extend(poolp pool, uint size)
1356
{
1357
if (UNLIKELY(pool->nextoffset <= pool->maxnextoffset)) {
1358
/* There is room for another block. */
1359
pool->freeblock = (pymem_block*)pool + pool->nextoffset;
1360
pool->nextoffset += INDEX2SIZE(size);
1361
*(pymem_block **)(pool->freeblock) = NULL;
1362
return;
1363
}
1364
1365
/* Pool is full, unlink from used pools. */
1366
poolp next;
1367
next = pool->nextpool;
1368
pool = pool->prevpool;
1369
next->prevpool = pool;
1370
pool->nextpool = next;
1371
}
1372
1373
/* called when pymalloc_alloc can not allocate a block from usedpool.
1374
* This function takes new pool and allocate a block from it.
1375
*/
1376
static void*
1377
allocate_from_new_pool(OMState *state, uint size)
1378
{
1379
/* There isn't a pool of the right size class immediately
1380
* available: use a free pool.
1381
*/
1382
if (UNLIKELY(usable_arenas == NULL)) {
1383
/* No arena has a free pool: allocate a new arena. */
1384
#ifdef WITH_MEMORY_LIMITS
1385
if (narenas_currently_allocated >= MAX_ARENAS) {
1386
return NULL;
1387
}
1388
#endif
1389
usable_arenas = new_arena(state);
1390
if (usable_arenas == NULL) {
1391
return NULL;
1392
}
1393
usable_arenas->nextarena = usable_arenas->prevarena = NULL;
1394
assert(nfp2lasta[usable_arenas->nfreepools] == NULL);
1395
nfp2lasta[usable_arenas->nfreepools] = usable_arenas;
1396
}
1397
assert(usable_arenas->address != 0);
1398
1399
/* This arena already had the smallest nfreepools value, so decreasing
1400
* nfreepools doesn't change that, and we don't need to rearrange the
1401
* usable_arenas list. However, if the arena becomes wholly allocated,
1402
* we need to remove its arena_object from usable_arenas.
1403
*/
1404
assert(usable_arenas->nfreepools > 0);
1405
if (nfp2lasta[usable_arenas->nfreepools] == usable_arenas) {
1406
/* It's the last of this size, so there won't be any. */
1407
nfp2lasta[usable_arenas->nfreepools] = NULL;
1408
}
1409
/* If any free pools will remain, it will be the new smallest. */
1410
if (usable_arenas->nfreepools > 1) {
1411
assert(nfp2lasta[usable_arenas->nfreepools - 1] == NULL);
1412
nfp2lasta[usable_arenas->nfreepools - 1] = usable_arenas;
1413
}
1414
1415
/* Try to get a cached free pool. */
1416
poolp pool = usable_arenas->freepools;
1417
if (LIKELY(pool != NULL)) {
1418
/* Unlink from cached pools. */
1419
usable_arenas->freepools = pool->nextpool;
1420
usable_arenas->nfreepools--;
1421
if (UNLIKELY(usable_arenas->nfreepools == 0)) {
1422
/* Wholly allocated: remove. */
1423
assert(usable_arenas->freepools == NULL);
1424
assert(usable_arenas->nextarena == NULL ||
1425
usable_arenas->nextarena->prevarena ==
1426
usable_arenas);
1427
usable_arenas = usable_arenas->nextarena;
1428
if (usable_arenas != NULL) {
1429
usable_arenas->prevarena = NULL;
1430
assert(usable_arenas->address != 0);
1431
}
1432
}
1433
else {
1434
/* nfreepools > 0: it must be that freepools
1435
* isn't NULL, or that we haven't yet carved
1436
* off all the arena's pools for the first
1437
* time.
1438
*/
1439
assert(usable_arenas->freepools != NULL ||
1440
usable_arenas->pool_address <=
1441
(pymem_block*)usable_arenas->address +
1442
ARENA_SIZE - POOL_SIZE);
1443
}
1444
}
1445
else {
1446
/* Carve off a new pool. */
1447
assert(usable_arenas->nfreepools > 0);
1448
assert(usable_arenas->freepools == NULL);
1449
pool = (poolp)usable_arenas->pool_address;
1450
assert((pymem_block*)pool <= (pymem_block*)usable_arenas->address +
1451
ARENA_SIZE - POOL_SIZE);
1452
pool->arenaindex = (uint)(usable_arenas - allarenas);
1453
assert(&allarenas[pool->arenaindex] == usable_arenas);
1454
pool->szidx = DUMMY_SIZE_IDX;
1455
usable_arenas->pool_address += POOL_SIZE;
1456
--usable_arenas->nfreepools;
1457
1458
if (usable_arenas->nfreepools == 0) {
1459
assert(usable_arenas->nextarena == NULL ||
1460
usable_arenas->nextarena->prevarena ==
1461
usable_arenas);
1462
/* Unlink the arena: it is completely allocated. */
1463
usable_arenas = usable_arenas->nextarena;
1464
if (usable_arenas != NULL) {
1465
usable_arenas->prevarena = NULL;
1466
assert(usable_arenas->address != 0);
1467
}
1468
}
1469
}
1470
1471
/* Frontlink to used pools. */
1472
pymem_block *bp;
1473
poolp next = usedpools[size + size]; /* == prev */
1474
pool->nextpool = next;
1475
pool->prevpool = next;
1476
next->nextpool = pool;
1477
next->prevpool = pool;
1478
pool->ref.count = 1;
1479
if (pool->szidx == size) {
1480
/* Luckily, this pool last contained blocks
1481
* of the same size class, so its header
1482
* and free list are already initialized.
1483
*/
1484
bp = pool->freeblock;
1485
assert(bp != NULL);
1486
pool->freeblock = *(pymem_block **)bp;
1487
return bp;
1488
}
1489
/*
1490
* Initialize the pool header, set up the free list to
1491
* contain just the second block, and return the first
1492
* block.
1493
*/
1494
pool->szidx = size;
1495
size = INDEX2SIZE(size);
1496
bp = (pymem_block *)pool + POOL_OVERHEAD;
1497
pool->nextoffset = POOL_OVERHEAD + (size << 1);
1498
pool->maxnextoffset = POOL_SIZE - size;
1499
pool->freeblock = bp + size;
1500
*(pymem_block **)(pool->freeblock) = NULL;
1501
return bp;
1502
}
1503
1504
/* pymalloc allocator
1505
1506
Return a pointer to newly allocated memory if pymalloc allocated memory.
1507
1508
Return NULL if pymalloc failed to allocate the memory block: on bigger
1509
requests, on error in the code below (as a last chance to serve the request)
1510
or when the max memory limit has been reached.
1511
*/
1512
static inline void*
1513
pymalloc_alloc(OMState *state, void *Py_UNUSED(ctx), size_t nbytes)
1514
{
1515
#ifdef WITH_VALGRIND
1516
if (UNLIKELY(running_on_valgrind == -1)) {
1517
running_on_valgrind = RUNNING_ON_VALGRIND;
1518
}
1519
if (UNLIKELY(running_on_valgrind)) {
1520
return NULL;
1521
}
1522
#endif
1523
1524
if (UNLIKELY(nbytes == 0)) {
1525
return NULL;
1526
}
1527
if (UNLIKELY(nbytes > SMALL_REQUEST_THRESHOLD)) {
1528
return NULL;
1529
}
1530
1531
uint size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT;
1532
poolp pool = usedpools[size + size];
1533
pymem_block *bp;
1534
1535
if (LIKELY(pool != pool->nextpool)) {
1536
/*
1537
* There is a used pool for this size class.
1538
* Pick up the head block of its free list.
1539
*/
1540
++pool->ref.count;
1541
bp = pool->freeblock;
1542
assert(bp != NULL);
1543
1544
if (UNLIKELY((pool->freeblock = *(pymem_block **)bp) == NULL)) {
1545
// Reached the end of the free list, try to extend it.
1546
pymalloc_pool_extend(pool, size);
1547
}
1548
}
1549
else {
1550
/* There isn't a pool of the right size class immediately
1551
* available: use a free pool.
1552
*/
1553
bp = allocate_from_new_pool(state, size);
1554
}
1555
1556
return (void *)bp;
1557
}
1558
1559
1560
void *
1561
_PyObject_Malloc(void *ctx, size_t nbytes)
1562
{
1563
OMState *state = get_state();
1564
void* ptr = pymalloc_alloc(state, ctx, nbytes);
1565
if (LIKELY(ptr != NULL)) {
1566
return ptr;
1567
}
1568
1569
ptr = PyMem_RawMalloc(nbytes);
1570
if (ptr != NULL) {
1571
raw_allocated_blocks++;
1572
}
1573
return ptr;
1574
}
1575
1576
1577
void *
1578
_PyObject_Calloc(void *ctx, size_t nelem, size_t elsize)
1579
{
1580
assert(elsize == 0 || nelem <= (size_t)PY_SSIZE_T_MAX / elsize);
1581
size_t nbytes = nelem * elsize;
1582
1583
OMState *state = get_state();
1584
void* ptr = pymalloc_alloc(state, ctx, nbytes);
1585
if (LIKELY(ptr != NULL)) {
1586
memset(ptr, 0, nbytes);
1587
return ptr;
1588
}
1589
1590
ptr = PyMem_RawCalloc(nelem, elsize);
1591
if (ptr != NULL) {
1592
raw_allocated_blocks++;
1593
}
1594
return ptr;
1595
}
1596
1597
1598
static void
1599
insert_to_usedpool(OMState *state, poolp pool)
1600
{
1601
assert(pool->ref.count > 0); /* else the pool is empty */
1602
1603
uint size = pool->szidx;
1604
poolp next = usedpools[size + size];
1605
poolp prev = next->prevpool;
1606
1607
/* insert pool before next: prev <-> pool <-> next */
1608
pool->nextpool = next;
1609
pool->prevpool = prev;
1610
next->prevpool = pool;
1611
prev->nextpool = pool;
1612
}
1613
1614
static void
1615
insert_to_freepool(OMState *state, poolp pool)
1616
{
1617
poolp next = pool->nextpool;
1618
poolp prev = pool->prevpool;
1619
next->prevpool = prev;
1620
prev->nextpool = next;
1621
1622
/* Link the pool to freepools. This is a singly-linked
1623
* list, and pool->prevpool isn't used there.
1624
*/
1625
struct arena_object *ao = &allarenas[pool->arenaindex];
1626
pool->nextpool = ao->freepools;
1627
ao->freepools = pool;
1628
uint nf = ao->nfreepools;
1629
/* If this is the rightmost arena with this number of free pools,
1630
* nfp2lasta[nf] needs to change. Caution: if nf is 0, there
1631
* are no arenas in usable_arenas with that value.
1632
*/
1633
struct arena_object* lastnf = nfp2lasta[nf];
1634
assert((nf == 0 && lastnf == NULL) ||
1635
(nf > 0 &&
1636
lastnf != NULL &&
1637
lastnf->nfreepools == nf &&
1638
(lastnf->nextarena == NULL ||
1639
nf < lastnf->nextarena->nfreepools)));
1640
if (lastnf == ao) { /* it is the rightmost */
1641
struct arena_object* p = ao->prevarena;
1642
nfp2lasta[nf] = (p != NULL && p->nfreepools == nf) ? p : NULL;
1643
}
1644
ao->nfreepools = ++nf;
1645
1646
/* All the rest is arena management. We just freed
1647
* a pool, and there are 4 cases for arena mgmt:
1648
* 1. If all the pools are free, return the arena to
1649
* the system free(). Except if this is the last
1650
* arena in the list, keep it to avoid thrashing:
1651
* keeping one wholly free arena in the list avoids
1652
* pathological cases where a simple loop would
1653
* otherwise provoke needing to allocate and free an
1654
* arena on every iteration. See bpo-37257.
1655
* 2. If this is the only free pool in the arena,
1656
* add the arena back to the `usable_arenas` list.
1657
* 3. If the "next" arena has a smaller count of free
1658
* pools, we have to "slide this arena right" to
1659
* restore that usable_arenas is sorted in order of
1660
* nfreepools.
1661
* 4. Else there's nothing more to do.
1662
*/
1663
if (nf == ao->ntotalpools && ao->nextarena != NULL) {
1664
/* Case 1. First unlink ao from usable_arenas.
1665
*/
1666
assert(ao->prevarena == NULL ||
1667
ao->prevarena->address != 0);
1668
assert(ao ->nextarena == NULL ||
1669
ao->nextarena->address != 0);
1670
1671
/* Fix the pointer in the prevarena, or the
1672
* usable_arenas pointer.
1673
*/
1674
if (ao->prevarena == NULL) {
1675
usable_arenas = ao->nextarena;
1676
assert(usable_arenas == NULL ||
1677
usable_arenas->address != 0);
1678
}
1679
else {
1680
assert(ao->prevarena->nextarena == ao);
1681
ao->prevarena->nextarena =
1682
ao->nextarena;
1683
}
1684
/* Fix the pointer in the nextarena. */
1685
if (ao->nextarena != NULL) {
1686
assert(ao->nextarena->prevarena == ao);
1687
ao->nextarena->prevarena =
1688
ao->prevarena;
1689
}
1690
/* Record that this arena_object slot is
1691
* available to be reused.
1692
*/
1693
ao->nextarena = unused_arena_objects;
1694
unused_arena_objects = ao;
1695
1696
#if WITH_PYMALLOC_RADIX_TREE
1697
/* mark arena region as not under control of obmalloc */
1698
arena_map_mark_used(state, ao->address, 0);
1699
#endif
1700
1701
/* Free the entire arena. */
1702
_PyObject_Arena.free(_PyObject_Arena.ctx,
1703
(void *)ao->address, ARENA_SIZE);
1704
ao->address = 0; /* mark unassociated */
1705
--narenas_currently_allocated;
1706
1707
return;
1708
}
1709
1710
if (nf == 1) {
1711
/* Case 2. Put ao at the head of
1712
* usable_arenas. Note that because
1713
* ao->nfreepools was 0 before, ao isn't
1714
* currently on the usable_arenas list.
1715
*/
1716
ao->nextarena = usable_arenas;
1717
ao->prevarena = NULL;
1718
if (usable_arenas)
1719
usable_arenas->prevarena = ao;
1720
usable_arenas = ao;
1721
assert(usable_arenas->address != 0);
1722
if (nfp2lasta[1] == NULL) {
1723
nfp2lasta[1] = ao;
1724
}
1725
1726
return;
1727
}
1728
1729
/* If this arena is now out of order, we need to keep
1730
* the list sorted. The list is kept sorted so that
1731
* the "most full" arenas are used first, which allows
1732
* the nearly empty arenas to be completely freed. In
1733
* a few un-scientific tests, it seems like this
1734
* approach allowed a lot more memory to be freed.
1735
*/
1736
/* If this is the only arena with nf, record that. */
1737
if (nfp2lasta[nf] == NULL) {
1738
nfp2lasta[nf] = ao;
1739
} /* else the rightmost with nf doesn't change */
1740
/* If this was the rightmost of the old size, it remains in place. */
1741
if (ao == lastnf) {
1742
/* Case 4. Nothing to do. */
1743
return;
1744
}
1745
/* If ao were the only arena in the list, the last block would have
1746
* gotten us out.
1747
*/
1748
assert(ao->nextarena != NULL);
1749
1750
/* Case 3: We have to move the arena towards the end of the list,
1751
* because it has more free pools than the arena to its right. It needs
1752
* to move to follow lastnf.
1753
* First unlink ao from usable_arenas.
1754
*/
1755
if (ao->prevarena != NULL) {
1756
/* ao isn't at the head of the list */
1757
assert(ao->prevarena->nextarena == ao);
1758
ao->prevarena->nextarena = ao->nextarena;
1759
}
1760
else {
1761
/* ao is at the head of the list */
1762
assert(usable_arenas == ao);
1763
usable_arenas = ao->nextarena;
1764
}
1765
ao->nextarena->prevarena = ao->prevarena;
1766
/* And insert after lastnf. */
1767
ao->prevarena = lastnf;
1768
ao->nextarena = lastnf->nextarena;
1769
if (ao->nextarena != NULL) {
1770
ao->nextarena->prevarena = ao;
1771
}
1772
lastnf->nextarena = ao;
1773
/* Verify that the swaps worked. */
1774
assert(ao->nextarena == NULL || nf <= ao->nextarena->nfreepools);
1775
assert(ao->prevarena == NULL || nf > ao->prevarena->nfreepools);
1776
assert(ao->nextarena == NULL || ao->nextarena->prevarena == ao);
1777
assert((usable_arenas == ao && ao->prevarena == NULL)
1778
|| ao->prevarena->nextarena == ao);
1779
}
1780
1781
/* Free a memory block allocated by pymalloc_alloc().
1782
Return 1 if it was freed.
1783
Return 0 if the block was not allocated by pymalloc_alloc(). */
1784
static inline int
1785
pymalloc_free(OMState *state, void *Py_UNUSED(ctx), void *p)
1786
{
1787
assert(p != NULL);
1788
1789
#ifdef WITH_VALGRIND
1790
if (UNLIKELY(running_on_valgrind > 0)) {
1791
return 0;
1792
}
1793
#endif
1794
1795
poolp pool = POOL_ADDR(p);
1796
if (UNLIKELY(!address_in_range(state, p, pool))) {
1797
return 0;
1798
}
1799
/* We allocated this address. */
1800
1801
/* Link p to the start of the pool's freeblock list. Since
1802
* the pool had at least the p block outstanding, the pool
1803
* wasn't empty (so it's already in a usedpools[] list, or
1804
* was full and is in no list -- it's not in the freeblocks
1805
* list in any case).
1806
*/
1807
assert(pool->ref.count > 0); /* else it was empty */
1808
pymem_block *lastfree = pool->freeblock;
1809
*(pymem_block **)p = lastfree;
1810
pool->freeblock = (pymem_block *)p;
1811
pool->ref.count--;
1812
1813
if (UNLIKELY(lastfree == NULL)) {
1814
/* Pool was full, so doesn't currently live in any list:
1815
* link it to the front of the appropriate usedpools[] list.
1816
* This mimics LRU pool usage for new allocations and
1817
* targets optimal filling when several pools contain
1818
* blocks of the same size class.
1819
*/
1820
insert_to_usedpool(state, pool);
1821
return 1;
1822
}
1823
1824
/* freeblock wasn't NULL, so the pool wasn't full,
1825
* and the pool is in a usedpools[] list.
1826
*/
1827
if (LIKELY(pool->ref.count != 0)) {
1828
/* pool isn't empty: leave it in usedpools */
1829
return 1;
1830
}
1831
1832
/* Pool is now empty: unlink from usedpools, and
1833
* link to the front of freepools. This ensures that
1834
* previously freed pools will be allocated later
1835
* (being not referenced, they are perhaps paged out).
1836
*/
1837
insert_to_freepool(state, pool);
1838
return 1;
1839
}
1840
1841
1842
void
1843
_PyObject_Free(void *ctx, void *p)
1844
{
1845
/* PyObject_Free(NULL) has no effect */
1846
if (p == NULL) {
1847
return;
1848
}
1849
1850
OMState *state = get_state();
1851
if (UNLIKELY(!pymalloc_free(state, ctx, p))) {
1852
/* pymalloc didn't allocate this address */
1853
PyMem_RawFree(p);
1854
raw_allocated_blocks--;
1855
}
1856
}
1857
1858
1859
/* pymalloc realloc.
1860
1861
If nbytes==0, then as the Python docs promise, we do not treat this like
1862
free(p), and return a non-NULL result.
1863
1864
Return 1 if pymalloc reallocated memory and wrote the new pointer into
1865
newptr_p.
1866
1867
Return 0 if pymalloc didn't allocated p. */
1868
static int
1869
pymalloc_realloc(OMState *state, void *ctx,
1870
void **newptr_p, void *p, size_t nbytes)
1871
{
1872
void *bp;
1873
poolp pool;
1874
size_t size;
1875
1876
assert(p != NULL);
1877
1878
#ifdef WITH_VALGRIND
1879
/* Treat running_on_valgrind == -1 the same as 0 */
1880
if (UNLIKELY(running_on_valgrind > 0)) {
1881
return 0;
1882
}
1883
#endif
1884
1885
pool = POOL_ADDR(p);
1886
if (!address_in_range(state, p, pool)) {
1887
/* pymalloc is not managing this block.
1888
1889
If nbytes <= SMALL_REQUEST_THRESHOLD, it's tempting to try to take
1890
over this block. However, if we do, we need to copy the valid data
1891
from the C-managed block to one of our blocks, and there's no
1892
portable way to know how much of the memory space starting at p is
1893
valid.
1894
1895
As bug 1185883 pointed out the hard way, it's possible that the
1896
C-managed block is "at the end" of allocated VM space, so that a
1897
memory fault can occur if we try to copy nbytes bytes starting at p.
1898
Instead we punt: let C continue to manage this block. */
1899
return 0;
1900
}
1901
1902
/* pymalloc is in charge of this block */
1903
size = INDEX2SIZE(pool->szidx);
1904
if (nbytes <= size) {
1905
/* The block is staying the same or shrinking.
1906
1907
If it's shrinking, there's a tradeoff: it costs cycles to copy the
1908
block to a smaller size class, but it wastes memory not to copy it.
1909
1910
The compromise here is to copy on shrink only if at least 25% of
1911
size can be shaved off. */
1912
if (4 * nbytes > 3 * size) {
1913
/* It's the same, or shrinking and new/old > 3/4. */
1914
*newptr_p = p;
1915
return 1;
1916
}
1917
size = nbytes;
1918
}
1919
1920
bp = _PyObject_Malloc(ctx, nbytes);
1921
if (bp != NULL) {
1922
memcpy(bp, p, size);
1923
_PyObject_Free(ctx, p);
1924
}
1925
*newptr_p = bp;
1926
return 1;
1927
}
1928
1929
1930
void *
1931
_PyObject_Realloc(void *ctx, void *ptr, size_t nbytes)
1932
{
1933
void *ptr2;
1934
1935
if (ptr == NULL) {
1936
return _PyObject_Malloc(ctx, nbytes);
1937
}
1938
1939
OMState *state = get_state();
1940
if (pymalloc_realloc(state, ctx, &ptr2, ptr, nbytes)) {
1941
return ptr2;
1942
}
1943
1944
return PyMem_RawRealloc(ptr, nbytes);
1945
}
1946
1947
#else /* ! WITH_PYMALLOC */
1948
1949
/*==========================================================================*/
1950
/* pymalloc not enabled: Redirect the entry points to malloc. These will
1951
* only be used by extensions that are compiled with pymalloc enabled. */
1952
1953
Py_ssize_t
1954
_PyInterpreterState_GetAllocatedBlocks(PyInterpreterState *Py_UNUSED(interp))
1955
{
1956
return 0;
1957
}
1958
1959
Py_ssize_t
1960
_Py_GetGlobalAllocatedBlocks(void)
1961
{
1962
return 0;
1963
}
1964
1965
void
1966
_PyInterpreterState_FinalizeAllocatedBlocks(PyInterpreterState *Py_UNUSED(interp))
1967
{
1968
return;
1969
}
1970
1971
void
1972
_Py_FinalizeAllocatedBlocks(_PyRuntimeState *Py_UNUSED(runtime))
1973
{
1974
return;
1975
}
1976
1977
#endif /* WITH_PYMALLOC */
1978
1979
1980
/*==========================================================================*/
1981
/* A x-platform debugging allocator. This doesn't manage memory directly,
1982
* it wraps a real allocator, adding extra debugging info to the memory blocks.
1983
*/
1984
1985
/* Uncomment this define to add the "serialno" field */
1986
/* #define PYMEM_DEBUG_SERIALNO */
1987
1988
#ifdef PYMEM_DEBUG_SERIALNO
1989
static size_t serialno = 0; /* incremented on each debug {m,re}alloc */
1990
1991
/* serialno is always incremented via calling this routine. The point is
1992
* to supply a single place to set a breakpoint.
1993
*/
1994
static void
1995
bumpserialno(void)
1996
{
1997
++serialno;
1998
}
1999
#endif
2000
2001
#define SST SIZEOF_SIZE_T
2002
2003
#ifdef PYMEM_DEBUG_SERIALNO
2004
# define PYMEM_DEBUG_EXTRA_BYTES 4 * SST
2005
#else
2006
# define PYMEM_DEBUG_EXTRA_BYTES 3 * SST
2007
#endif
2008
2009
/* Read sizeof(size_t) bytes at p as a big-endian size_t. */
2010
static size_t
2011
read_size_t(const void *p)
2012
{
2013
const uint8_t *q = (const uint8_t *)p;
2014
size_t result = *q++;
2015
int i;
2016
2017
for (i = SST; --i > 0; ++q)
2018
result = (result << 8) | *q;
2019
return result;
2020
}
2021
2022
/* Write n as a big-endian size_t, MSB at address p, LSB at
2023
* p + sizeof(size_t) - 1.
2024
*/
2025
static void
2026
write_size_t(void *p, size_t n)
2027
{
2028
uint8_t *q = (uint8_t *)p + SST - 1;
2029
int i;
2030
2031
for (i = SST; --i >= 0; --q) {
2032
*q = (uint8_t)(n & 0xff);
2033
n >>= 8;
2034
}
2035
}
2036
2037
/* Let S = sizeof(size_t). The debug malloc asks for 4 * S extra bytes and
2038
fills them with useful stuff, here calling the underlying malloc's result p:
2039
2040
p[0: S]
2041
Number of bytes originally asked for. This is a size_t, big-endian (easier
2042
to read in a memory dump).
2043
p[S]
2044
API ID. See PEP 445. This is a character, but seems undocumented.
2045
p[S+1: 2*S]
2046
Copies of PYMEM_FORBIDDENBYTE. Used to catch under- writes and reads.
2047
p[2*S: 2*S+n]
2048
The requested memory, filled with copies of PYMEM_CLEANBYTE.
2049
Used to catch reference to uninitialized memory.
2050
&p[2*S] is returned. Note that this is 8-byte aligned if pymalloc
2051
handled the request itself.
2052
p[2*S+n: 2*S+n+S]
2053
Copies of PYMEM_FORBIDDENBYTE. Used to catch over- writes and reads.
2054
p[2*S+n+S: 2*S+n+2*S]
2055
A serial number, incremented by 1 on each call to _PyMem_DebugMalloc
2056
and _PyMem_DebugRealloc.
2057
This is a big-endian size_t.
2058
If "bad memory" is detected later, the serial number gives an
2059
excellent way to set a breakpoint on the next run, to capture the
2060
instant at which this block was passed out.
2061
2062
If PYMEM_DEBUG_SERIALNO is not defined (default), the debug malloc only asks
2063
for 3 * S extra bytes, and omits the last serialno field.
2064
*/
2065
2066
static void *
2067
_PyMem_DebugRawAlloc(int use_calloc, void *ctx, size_t nbytes)
2068
{
2069
debug_alloc_api_t *api = (debug_alloc_api_t *)ctx;
2070
uint8_t *p; /* base address of malloc'ed pad block */
2071
uint8_t *data; /* p + 2*SST == pointer to data bytes */
2072
uint8_t *tail; /* data + nbytes == pointer to tail pad bytes */
2073
size_t total; /* nbytes + PYMEM_DEBUG_EXTRA_BYTES */
2074
2075
if (nbytes > (size_t)PY_SSIZE_T_MAX - PYMEM_DEBUG_EXTRA_BYTES) {
2076
/* integer overflow: can't represent total as a Py_ssize_t */
2077
return NULL;
2078
}
2079
total = nbytes + PYMEM_DEBUG_EXTRA_BYTES;
2080
2081
/* Layout: [SSSS IFFF CCCC...CCCC FFFF NNNN]
2082
^--- p ^--- data ^--- tail
2083
S: nbytes stored as size_t
2084
I: API identifier (1 byte)
2085
F: Forbidden bytes (size_t - 1 bytes before, size_t bytes after)
2086
C: Clean bytes used later to store actual data
2087
N: Serial number stored as size_t
2088
2089
If PYMEM_DEBUG_SERIALNO is not defined (default), the last NNNN field
2090
is omitted. */
2091
2092
if (use_calloc) {
2093
p = (uint8_t *)api->alloc.calloc(api->alloc.ctx, 1, total);
2094
}
2095
else {
2096
p = (uint8_t *)api->alloc.malloc(api->alloc.ctx, total);
2097
}
2098
if (p == NULL) {
2099
return NULL;
2100
}
2101
data = p + 2*SST;
2102
2103
#ifdef PYMEM_DEBUG_SERIALNO
2104
bumpserialno();
2105
#endif
2106
2107
/* at p, write size (SST bytes), id (1 byte), pad (SST-1 bytes) */
2108
write_size_t(p, nbytes);
2109
p[SST] = (uint8_t)api->api_id;
2110
memset(p + SST + 1, PYMEM_FORBIDDENBYTE, SST-1);
2111
2112
if (nbytes > 0 && !use_calloc) {
2113
memset(data, PYMEM_CLEANBYTE, nbytes);
2114
}
2115
2116
/* at tail, write pad (SST bytes) and serialno (SST bytes) */
2117
tail = data + nbytes;
2118
memset(tail, PYMEM_FORBIDDENBYTE, SST);
2119
#ifdef PYMEM_DEBUG_SERIALNO
2120
write_size_t(tail + SST, serialno);
2121
#endif
2122
2123
return data;
2124
}
2125
2126
void *
2127
_PyMem_DebugRawMalloc(void *ctx, size_t nbytes)
2128
{
2129
return _PyMem_DebugRawAlloc(0, ctx, nbytes);
2130
}
2131
2132
void *
2133
_PyMem_DebugRawCalloc(void *ctx, size_t nelem, size_t elsize)
2134
{
2135
size_t nbytes;
2136
assert(elsize == 0 || nelem <= (size_t)PY_SSIZE_T_MAX / elsize);
2137
nbytes = nelem * elsize;
2138
return _PyMem_DebugRawAlloc(1, ctx, nbytes);
2139
}
2140
2141
2142
/* The debug free first checks the 2*SST bytes on each end for sanity (in
2143
particular, that the FORBIDDENBYTEs with the api ID are still intact).
2144
Then fills the original bytes with PYMEM_DEADBYTE.
2145
Then calls the underlying free.
2146
*/
2147
void
2148
_PyMem_DebugRawFree(void *ctx, void *p)
2149
{
2150
/* PyMem_Free(NULL) has no effect */
2151
if (p == NULL) {
2152
return;
2153
}
2154
2155
debug_alloc_api_t *api = (debug_alloc_api_t *)ctx;
2156
uint8_t *q = (uint8_t *)p - 2*SST; /* address returned from malloc */
2157
size_t nbytes;
2158
2159
_PyMem_DebugCheckAddress(__func__, api->api_id, p);
2160
nbytes = read_size_t(q);
2161
nbytes += PYMEM_DEBUG_EXTRA_BYTES;
2162
memset(q, PYMEM_DEADBYTE, nbytes);
2163
api->alloc.free(api->alloc.ctx, q);
2164
}
2165
2166
2167
void *
2168
_PyMem_DebugRawRealloc(void *ctx, void *p, size_t nbytes)
2169
{
2170
if (p == NULL) {
2171
return _PyMem_DebugRawAlloc(0, ctx, nbytes);
2172
}
2173
2174
debug_alloc_api_t *api = (debug_alloc_api_t *)ctx;
2175
uint8_t *head; /* base address of malloc'ed pad block */
2176
uint8_t *data; /* pointer to data bytes */
2177
uint8_t *r;
2178
uint8_t *tail; /* data + nbytes == pointer to tail pad bytes */
2179
size_t total; /* 2 * SST + nbytes + 2 * SST */
2180
size_t original_nbytes;
2181
#define ERASED_SIZE 64
2182
uint8_t save[2*ERASED_SIZE]; /* A copy of erased bytes. */
2183
2184
_PyMem_DebugCheckAddress(__func__, api->api_id, p);
2185
2186
data = (uint8_t *)p;
2187
head = data - 2*SST;
2188
original_nbytes = read_size_t(head);
2189
if (nbytes > (size_t)PY_SSIZE_T_MAX - PYMEM_DEBUG_EXTRA_BYTES) {
2190
/* integer overflow: can't represent total as a Py_ssize_t */
2191
return NULL;
2192
}
2193
total = nbytes + PYMEM_DEBUG_EXTRA_BYTES;
2194
2195
tail = data + original_nbytes;
2196
#ifdef PYMEM_DEBUG_SERIALNO
2197
size_t block_serialno = read_size_t(tail + SST);
2198
#endif
2199
/* Mark the header, the trailer, ERASED_SIZE bytes at the begin and
2200
ERASED_SIZE bytes at the end as dead and save the copy of erased bytes.
2201
*/
2202
if (original_nbytes <= sizeof(save)) {
2203
memcpy(save, data, original_nbytes);
2204
memset(data - 2 * SST, PYMEM_DEADBYTE,
2205
original_nbytes + PYMEM_DEBUG_EXTRA_BYTES);
2206
}
2207
else {
2208
memcpy(save, data, ERASED_SIZE);
2209
memset(head, PYMEM_DEADBYTE, ERASED_SIZE + 2 * SST);
2210
memcpy(&save[ERASED_SIZE], tail - ERASED_SIZE, ERASED_SIZE);
2211
memset(tail - ERASED_SIZE, PYMEM_DEADBYTE,
2212
ERASED_SIZE + PYMEM_DEBUG_EXTRA_BYTES - 2 * SST);
2213
}
2214
2215
/* Resize and add decorations. */
2216
r = (uint8_t *)api->alloc.realloc(api->alloc.ctx, head, total);
2217
if (r == NULL) {
2218
/* if realloc() failed: rewrite header and footer which have
2219
just been erased */
2220
nbytes = original_nbytes;
2221
}
2222
else {
2223
head = r;
2224
#ifdef PYMEM_DEBUG_SERIALNO
2225
bumpserialno();
2226
block_serialno = serialno;
2227
#endif
2228
}
2229
data = head + 2*SST;
2230
2231
write_size_t(head, nbytes);
2232
head[SST] = (uint8_t)api->api_id;
2233
memset(head + SST + 1, PYMEM_FORBIDDENBYTE, SST-1);
2234
2235
tail = data + nbytes;
2236
memset(tail, PYMEM_FORBIDDENBYTE, SST);
2237
#ifdef PYMEM_DEBUG_SERIALNO
2238
write_size_t(tail + SST, block_serialno);
2239
#endif
2240
2241
/* Restore saved bytes. */
2242
if (original_nbytes <= sizeof(save)) {
2243
memcpy(data, save, Py_MIN(nbytes, original_nbytes));
2244
}
2245
else {
2246
size_t i = original_nbytes - ERASED_SIZE;
2247
memcpy(data, save, Py_MIN(nbytes, ERASED_SIZE));
2248
if (nbytes > i) {
2249
memcpy(data + i, &save[ERASED_SIZE],
2250
Py_MIN(nbytes - i, ERASED_SIZE));
2251
}
2252
}
2253
2254
if (r == NULL) {
2255
return NULL;
2256
}
2257
2258
if (nbytes > original_nbytes) {
2259
/* growing: mark new extra memory clean */
2260
memset(data + original_nbytes, PYMEM_CLEANBYTE,
2261
nbytes - original_nbytes);
2262
}
2263
2264
return data;
2265
}
2266
2267
static inline void
2268
_PyMem_DebugCheckGIL(const char *func)
2269
{
2270
if (!PyGILState_Check()) {
2271
_Py_FatalErrorFunc(func,
2272
"Python memory allocator called "
2273
"without holding the GIL");
2274
}
2275
}
2276
2277
void *
2278
_PyMem_DebugMalloc(void *ctx, size_t nbytes)
2279
{
2280
_PyMem_DebugCheckGIL(__func__);
2281
return _PyMem_DebugRawMalloc(ctx, nbytes);
2282
}
2283
2284
void *
2285
_PyMem_DebugCalloc(void *ctx, size_t nelem, size_t elsize)
2286
{
2287
_PyMem_DebugCheckGIL(__func__);
2288
return _PyMem_DebugRawCalloc(ctx, nelem, elsize);
2289
}
2290
2291
2292
void
2293
_PyMem_DebugFree(void *ctx, void *ptr)
2294
{
2295
_PyMem_DebugCheckGIL(__func__);
2296
_PyMem_DebugRawFree(ctx, ptr);
2297
}
2298
2299
2300
void *
2301
_PyMem_DebugRealloc(void *ctx, void *ptr, size_t nbytes)
2302
{
2303
_PyMem_DebugCheckGIL(__func__);
2304
return _PyMem_DebugRawRealloc(ctx, ptr, nbytes);
2305
}
2306
2307
/* Check the forbidden bytes on both ends of the memory allocated for p.
2308
* If anything is wrong, print info to stderr via _PyObject_DebugDumpAddress,
2309
* and call Py_FatalError to kill the program.
2310
* The API id, is also checked.
2311
*/
2312
static void
2313
_PyMem_DebugCheckAddress(const char *func, char api, const void *p)
2314
{
2315
assert(p != NULL);
2316
2317
const uint8_t *q = (const uint8_t *)p;
2318
size_t nbytes;
2319
const uint8_t *tail;
2320
int i;
2321
char id;
2322
2323
/* Check the API id */
2324
id = (char)q[-SST];
2325
if (id != api) {
2326
_PyObject_DebugDumpAddress(p);
2327
_Py_FatalErrorFormat(func,
2328
"bad ID: Allocated using API '%c', "
2329
"verified using API '%c'",
2330
id, api);
2331
}
2332
2333
/* Check the stuff at the start of p first: if there's underwrite
2334
* corruption, the number-of-bytes field may be nuts, and checking
2335
* the tail could lead to a segfault then.
2336
*/
2337
for (i = SST-1; i >= 1; --i) {
2338
if (*(q-i) != PYMEM_FORBIDDENBYTE) {
2339
_PyObject_DebugDumpAddress(p);
2340
_Py_FatalErrorFunc(func, "bad leading pad byte");
2341
}
2342
}
2343
2344
nbytes = read_size_t(q - 2*SST);
2345
tail = q + nbytes;
2346
for (i = 0; i < SST; ++i) {
2347
if (tail[i] != PYMEM_FORBIDDENBYTE) {
2348
_PyObject_DebugDumpAddress(p);
2349
_Py_FatalErrorFunc(func, "bad trailing pad byte");
2350
}
2351
}
2352
}
2353
2354
/* Display info to stderr about the memory block at p. */
2355
static void
2356
_PyObject_DebugDumpAddress(const void *p)
2357
{
2358
const uint8_t *q = (const uint8_t *)p;
2359
const uint8_t *tail;
2360
size_t nbytes;
2361
int i;
2362
int ok;
2363
char id;
2364
2365
fprintf(stderr, "Debug memory block at address p=%p:", p);
2366
if (p == NULL) {
2367
fprintf(stderr, "\n");
2368
return;
2369
}
2370
id = (char)q[-SST];
2371
fprintf(stderr, " API '%c'\n", id);
2372
2373
nbytes = read_size_t(q - 2*SST);
2374
fprintf(stderr, " %zu bytes originally requested\n", nbytes);
2375
2376
/* In case this is nuts, check the leading pad bytes first. */
2377
fprintf(stderr, " The %d pad bytes at p-%d are ", SST-1, SST-1);
2378
ok = 1;
2379
for (i = 1; i <= SST-1; ++i) {
2380
if (*(q-i) != PYMEM_FORBIDDENBYTE) {
2381
ok = 0;
2382
break;
2383
}
2384
}
2385
if (ok)
2386
fputs("FORBIDDENBYTE, as expected.\n", stderr);
2387
else {
2388
fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",
2389
PYMEM_FORBIDDENBYTE);
2390
for (i = SST-1; i >= 1; --i) {
2391
const uint8_t byte = *(q-i);
2392
fprintf(stderr, " at p-%d: 0x%02x", i, byte);
2393
if (byte != PYMEM_FORBIDDENBYTE)
2394
fputs(" *** OUCH", stderr);
2395
fputc('\n', stderr);
2396
}
2397
2398
fputs(" Because memory is corrupted at the start, the "
2399
"count of bytes requested\n"
2400
" may be bogus, and checking the trailing pad "
2401
"bytes may segfault.\n", stderr);
2402
}
2403
2404
tail = q + nbytes;
2405
fprintf(stderr, " The %d pad bytes at tail=%p are ", SST, (void *)tail);
2406
ok = 1;
2407
for (i = 0; i < SST; ++i) {
2408
if (tail[i] != PYMEM_FORBIDDENBYTE) {
2409
ok = 0;
2410
break;
2411
}
2412
}
2413
if (ok)
2414
fputs("FORBIDDENBYTE, as expected.\n", stderr);
2415
else {
2416
fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",
2417
PYMEM_FORBIDDENBYTE);
2418
for (i = 0; i < SST; ++i) {
2419
const uint8_t byte = tail[i];
2420
fprintf(stderr, " at tail+%d: 0x%02x",
2421
i, byte);
2422
if (byte != PYMEM_FORBIDDENBYTE)
2423
fputs(" *** OUCH", stderr);
2424
fputc('\n', stderr);
2425
}
2426
}
2427
2428
#ifdef PYMEM_DEBUG_SERIALNO
2429
size_t serial = read_size_t(tail + SST);
2430
fprintf(stderr,
2431
" The block was made by call #%zu to debug malloc/realloc.\n",
2432
serial);
2433
#endif
2434
2435
if (nbytes > 0) {
2436
i = 0;
2437
fputs(" Data at p:", stderr);
2438
/* print up to 8 bytes at the start */
2439
while (q < tail && i < 8) {
2440
fprintf(stderr, " %02x", *q);
2441
++i;
2442
++q;
2443
}
2444
/* and up to 8 at the end */
2445
if (q < tail) {
2446
if (tail - q > 8) {
2447
fputs(" ...", stderr);
2448
q = tail - 8;
2449
}
2450
while (q < tail) {
2451
fprintf(stderr, " %02x", *q);
2452
++q;
2453
}
2454
}
2455
fputc('\n', stderr);
2456
}
2457
fputc('\n', stderr);
2458
2459
fflush(stderr);
2460
_PyMem_DumpTraceback(fileno(stderr), p);
2461
}
2462
2463
2464
static size_t
2465
printone(FILE *out, const char* msg, size_t value)
2466
{
2467
int i, k;
2468
char buf[100];
2469
size_t origvalue = value;
2470
2471
fputs(msg, out);
2472
for (i = (int)strlen(msg); i < 35; ++i)
2473
fputc(' ', out);
2474
fputc('=', out);
2475
2476
/* Write the value with commas. */
2477
i = 22;
2478
buf[i--] = '\0';
2479
buf[i--] = '\n';
2480
k = 3;
2481
do {
2482
size_t nextvalue = value / 10;
2483
unsigned int digit = (unsigned int)(value - nextvalue * 10);
2484
value = nextvalue;
2485
buf[i--] = (char)(digit + '0');
2486
--k;
2487
if (k == 0 && value && i >= 0) {
2488
k = 3;
2489
buf[i--] = ',';
2490
}
2491
} while (value && i >= 0);
2492
2493
while (i >= 0)
2494
buf[i--] = ' ';
2495
fputs(buf, out);
2496
2497
return origvalue;
2498
}
2499
2500
void
2501
_PyDebugAllocatorStats(FILE *out,
2502
const char *block_name, int num_blocks, size_t sizeof_block)
2503
{
2504
char buf1[128];
2505
char buf2[128];
2506
PyOS_snprintf(buf1, sizeof(buf1),
2507
"%d %ss * %zd bytes each",
2508
num_blocks, block_name, sizeof_block);
2509
PyOS_snprintf(buf2, sizeof(buf2),
2510
"%48s ", buf1);
2511
(void)printone(out, buf2, num_blocks * sizeof_block);
2512
}
2513
2514
2515
#ifdef WITH_PYMALLOC
2516
2517
#ifdef Py_DEBUG
2518
/* Is target in the list? The list is traversed via the nextpool pointers.
2519
* The list may be NULL-terminated, or circular. Return 1 if target is in
2520
* list, else 0.
2521
*/
2522
static int
2523
pool_is_in_list(const poolp target, poolp list)
2524
{
2525
poolp origlist = list;
2526
assert(target != NULL);
2527
if (list == NULL)
2528
return 0;
2529
do {
2530
if (target == list)
2531
return 1;
2532
list = list->nextpool;
2533
} while (list != NULL && list != origlist);
2534
return 0;
2535
}
2536
#endif
2537
2538
/* Print summary info to "out" about the state of pymalloc's structures.
2539
* In Py_DEBUG mode, also perform some expensive internal consistency
2540
* checks.
2541
*
2542
* Return 0 if the memory debug hooks are not installed or no statistics was
2543
* written into out, return 1 otherwise.
2544
*/
2545
int
2546
_PyObject_DebugMallocStats(FILE *out)
2547
{
2548
if (!_PyMem_PymallocEnabled()) {
2549
return 0;
2550
}
2551
OMState *state = get_state();
2552
2553
uint i;
2554
const uint numclasses = SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT;
2555
/* # of pools, allocated blocks, and free blocks per class index */
2556
size_t numpools[SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT];
2557
size_t numblocks[SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT];
2558
size_t numfreeblocks[SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT];
2559
/* total # of allocated bytes in used and full pools */
2560
size_t allocated_bytes = 0;
2561
/* total # of available bytes in used pools */
2562
size_t available_bytes = 0;
2563
/* # of free pools + pools not yet carved out of current arena */
2564
uint numfreepools = 0;
2565
/* # of bytes for arena alignment padding */
2566
size_t arena_alignment = 0;
2567
/* # of bytes in used and full pools used for pool_headers */
2568
size_t pool_header_bytes = 0;
2569
/* # of bytes in used and full pools wasted due to quantization,
2570
* i.e. the necessarily leftover space at the ends of used and
2571
* full pools.
2572
*/
2573
size_t quantization = 0;
2574
/* # of arenas actually allocated. */
2575
size_t narenas = 0;
2576
/* running total -- should equal narenas * ARENA_SIZE */
2577
size_t total;
2578
char buf[128];
2579
2580
fprintf(out, "Small block threshold = %d, in %u size classes.\n",
2581
SMALL_REQUEST_THRESHOLD, numclasses);
2582
2583
for (i = 0; i < numclasses; ++i)
2584
numpools[i] = numblocks[i] = numfreeblocks[i] = 0;
2585
2586
/* Because full pools aren't linked to from anything, it's easiest
2587
* to march over all the arenas. If we're lucky, most of the memory
2588
* will be living in full pools -- would be a shame to miss them.
2589
*/
2590
for (i = 0; i < maxarenas; ++i) {
2591
uintptr_t base = allarenas[i].address;
2592
2593
/* Skip arenas which are not allocated. */
2594
if (allarenas[i].address == (uintptr_t)NULL)
2595
continue;
2596
narenas += 1;
2597
2598
numfreepools += allarenas[i].nfreepools;
2599
2600
/* round up to pool alignment */
2601
if (base & (uintptr_t)POOL_SIZE_MASK) {
2602
arena_alignment += POOL_SIZE;
2603
base &= ~(uintptr_t)POOL_SIZE_MASK;
2604
base += POOL_SIZE;
2605
}
2606
2607
/* visit every pool in the arena */
2608
assert(base <= (uintptr_t) allarenas[i].pool_address);
2609
for (; base < (uintptr_t) allarenas[i].pool_address; base += POOL_SIZE) {
2610
poolp p = (poolp)base;
2611
const uint sz = p->szidx;
2612
uint freeblocks;
2613
2614
if (p->ref.count == 0) {
2615
/* currently unused */
2616
#ifdef Py_DEBUG
2617
assert(pool_is_in_list(p, allarenas[i].freepools));
2618
#endif
2619
continue;
2620
}
2621
++numpools[sz];
2622
numblocks[sz] += p->ref.count;
2623
freeblocks = NUMBLOCKS(sz) - p->ref.count;
2624
numfreeblocks[sz] += freeblocks;
2625
#ifdef Py_DEBUG
2626
if (freeblocks > 0)
2627
assert(pool_is_in_list(p, usedpools[sz + sz]));
2628
#endif
2629
}
2630
}
2631
assert(narenas == narenas_currently_allocated);
2632
2633
fputc('\n', out);
2634
fputs("class size num pools blocks in use avail blocks\n"
2635
"----- ---- --------- ------------- ------------\n",
2636
out);
2637
2638
for (i = 0; i < numclasses; ++i) {
2639
size_t p = numpools[i];
2640
size_t b = numblocks[i];
2641
size_t f = numfreeblocks[i];
2642
uint size = INDEX2SIZE(i);
2643
if (p == 0) {
2644
assert(b == 0 && f == 0);
2645
continue;
2646
}
2647
fprintf(out, "%5u %6u %11zu %15zu %13zu\n",
2648
i, size, p, b, f);
2649
allocated_bytes += b * size;
2650
available_bytes += f * size;
2651
pool_header_bytes += p * POOL_OVERHEAD;
2652
quantization += p * ((POOL_SIZE - POOL_OVERHEAD) % size);
2653
}
2654
fputc('\n', out);
2655
#ifdef PYMEM_DEBUG_SERIALNO
2656
if (_PyMem_DebugEnabled()) {
2657
(void)printone(out, "# times object malloc called", serialno);
2658
}
2659
#endif
2660
(void)printone(out, "# arenas allocated total", ntimes_arena_allocated);
2661
(void)printone(out, "# arenas reclaimed", ntimes_arena_allocated - narenas);
2662
(void)printone(out, "# arenas highwater mark", narenas_highwater);
2663
(void)printone(out, "# arenas allocated current", narenas);
2664
2665
PyOS_snprintf(buf, sizeof(buf),
2666
"%zu arenas * %d bytes/arena",
2667
narenas, ARENA_SIZE);
2668
(void)printone(out, buf, narenas * ARENA_SIZE);
2669
2670
fputc('\n', out);
2671
2672
/* Account for what all of those arena bytes are being used for. */
2673
total = printone(out, "# bytes in allocated blocks", allocated_bytes);
2674
total += printone(out, "# bytes in available blocks", available_bytes);
2675
2676
PyOS_snprintf(buf, sizeof(buf),
2677
"%u unused pools * %d bytes", numfreepools, POOL_SIZE);
2678
total += printone(out, buf, (size_t)numfreepools * POOL_SIZE);
2679
2680
total += printone(out, "# bytes lost to pool headers", pool_header_bytes);
2681
total += printone(out, "# bytes lost to quantization", quantization);
2682
total += printone(out, "# bytes lost to arena alignment", arena_alignment);
2683
(void)printone(out, "Total", total);
2684
assert(narenas * ARENA_SIZE == total);
2685
2686
#if WITH_PYMALLOC_RADIX_TREE
2687
fputs("\narena map counts\n", out);
2688
#ifdef USE_INTERIOR_NODES
2689
(void)printone(out, "# arena map mid nodes", arena_map_mid_count);
2690
(void)printone(out, "# arena map bot nodes", arena_map_bot_count);
2691
fputc('\n', out);
2692
#endif
2693
total = printone(out, "# bytes lost to arena map root", sizeof(arena_map_root));
2694
#ifdef USE_INTERIOR_NODES
2695
total += printone(out, "# bytes lost to arena map mid",
2696
sizeof(arena_map_mid_t) * arena_map_mid_count);
2697
total += printone(out, "# bytes lost to arena map bot",
2698
sizeof(arena_map_bot_t) * arena_map_bot_count);
2699
(void)printone(out, "Total", total);
2700
#endif
2701
#endif
2702
2703
return 1;
2704
}
2705
2706
#endif /* #ifdef WITH_PYMALLOC */
2707
2708