annotate Objects/obmalloc.c @ 76370:00a07720a570

Issue #14599: Fix an import caching race condition.
author Brett Cannon <brett@python.org>
date Mon, 16 Apr 2012 20:50:33 -0400
parents ba8f85e16dd9
children d63a80abfbec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22469
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1 #include "Python.h"
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
2
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
3 #ifdef WITH_PYMALLOC
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
4
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
5 #ifdef HAVE_MMAP
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
6 #include <sys/mman.h>
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
7 #ifdef MAP_ANONYMOUS
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
8 #define ARENAS_USE_MMAP
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
9 #endif
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
10 #endif
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
11
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
12 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
13 #include <valgrind/valgrind.h>
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
14
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
15 /* If we're using GCC, use __builtin_expect() to reduce overhead of
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
16 the valgrind checks */
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
17 #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
18 # define UNLIKELY(value) __builtin_expect((value), 0)
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
19 #else
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
20 # define UNLIKELY(value) (value)
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
21 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
22
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
23 /* -1 indicates that we haven't checked that we're running on valgrind yet. */
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
24 static int running_on_valgrind = -1;
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
25 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
26
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
27 /* An object allocator for Python.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
28
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
29 Here is an introduction to the layers of the Python memory architecture,
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
30 showing where the object allocator is actually used (layer +2), It is
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
31 called for every object allocation and deallocation (PyObject_New/Del),
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
32 unless the object-specific allocators implement a proprietary allocation
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
33 scheme (ex.: ints use a simple free list). This is also the place where
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
34 the cyclic garbage collector operates selectively on container objects.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
35
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
36
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
37 Object-specific allocators
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
38 _____ ______ ______ ________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
39 [ int ] [ dict ] [ list ] ... [ string ] Python core |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
40 +3 | <----- Object-specific memory -----> | <-- Non-object memory --> |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
41 _______________________________ | |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
42 [ Python's object allocator ] | |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
43 +2 | ####### Object memory ####### | <------ Internal buffers ------> |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
44 ______________________________________________________________ |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
45 [ Python's raw memory allocator (PyMem_ API) ] |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
46 +1 | <----- Python memory (under PyMem manager's control) ------> | |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
47 __________________________________________________________________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
48 [ Underlying general-purpose allocator (ex: C library malloc) ]
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
49 0 | <------ Virtual memory allocated for the python process -------> |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
50
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
51 =========================================================================
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
52 _______________________________________________________________________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
53 [ OS-specific Virtual Memory Manager (VMM) ]
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
54 -1 | <--- Kernel dynamic storage allocation & management (page-based) ---> |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
55 __________________________________ __________________________________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
56 [ ] [ ]
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
57 -2 | <-- Physical memory: ROM/RAM --> | | <-- Secondary storage (swap) --> |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
58
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
59 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
60 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
61
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
62 /* A fast, special-purpose memory allocator for small blocks, to be used
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
63 on top of a general-purpose malloc -- heavily based on previous art. */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
64
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
65 /* Vladimir Marangozov -- August 2000 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
66
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
67 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
68 * "Memory management is where the rubber meets the road -- if we do the wrong
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
69 * thing at any level, the results will not be good. And if we don't make the
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
70 * levels work well together, we are in serious trouble." (1)
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
71 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
72 * (1) Paul R. Wilson, Mark S. Johnstone, Michael Neely, and David Boles,
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
73 * "Dynamic Storage Allocation: A Survey and Critical Review",
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
74 * in Proc. 1995 Int'l. Workshop on Memory Management, September 1995.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
75 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
76
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
77 /* #undef WITH_MEMORY_LIMITS */ /* disable mem limit checks */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
78
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
79 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
80
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
81 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
82 * Allocation strategy abstract:
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
83 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
84 * For small requests, the allocator sub-allocates <Big> blocks of memory.
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
85 * Requests greater than SMALL_REQUEST_THRESHOLD bytes are routed to the
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
86 * system's allocator.
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
87 *
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
88 * Small requests are grouped in size classes spaced 8 bytes apart, due
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
89 * to the required valid alignment of the returned address. Requests of
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
90 * a particular size are serviced from memory pools of 4K (one VMM page).
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
91 * Pools are fragmented on demand and contain free lists of blocks of one
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
92 * particular size class. In other words, there is a fixed-size allocator
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
93 * for each size class. Free pools are shared by the different allocators
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
94 * thus minimizing the space reserved for a particular size class.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
95 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
96 * This allocation strategy is a variant of what is known as "simple
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
97 * segregated storage based on array of free lists". The main drawback of
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
98 * simple segregated storage is that we might end up with lot of reserved
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
99 * memory for the different free lists, which degenerate in time. To avoid
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
100 * this, we partition each free list in pools and we share dynamically the
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
101 * reserved space between all free lists. This technique is quite efficient
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
102 * for memory intensive programs which allocate mainly small-sized blocks.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
103 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
104 * For small requests we have the following table:
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
105 *
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
106 * Request in bytes Size of allocated block Size class idx
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
107 * ----------------------------------------------------------------
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
108 * 1-8 8 0
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
109 * 9-16 16 1
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
110 * 17-24 24 2
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
111 * 25-32 32 3
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
112 * 33-40 40 4
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
113 * 41-48 48 5
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
114 * 49-56 56 6
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
115 * 57-64 64 7
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
116 * 65-72 72 8
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
117 * ... ... ...
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
118 * 497-504 504 62
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
119 * 505-512 512 63
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
120 *
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
121 * 0, SMALL_REQUEST_THRESHOLD + 1 and up: routed to the underlying
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
122 * allocator.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
123 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
124
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
125 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
126
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
127 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
128 * -- Main tunable settings section --
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
129 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
130
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
131 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
132 * Alignment of addresses returned to the user. 8-bytes alignment works
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
133 * on most current architectures (with 32-bit or 64-bit address busses).
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
134 * The alignment value is also used for grouping small requests in size
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
135 * classes spaced ALIGNMENT bytes apart.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
136 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
137 * You shouldn't change this unless you know what you are doing.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
138 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
139 #define ALIGNMENT 8 /* must be 2^N */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
140 #define ALIGNMENT_SHIFT 3
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
141 #define ALIGNMENT_MASK (ALIGNMENT - 1)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
142
22836
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
143 /* Return the number of bytes in size class I, as a uint. */
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
144 #define INDEX2SIZE(I) (((uint)(I) + 1) << ALIGNMENT_SHIFT)
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
145
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
146 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
147 * Max size threshold below which malloc requests are considered to be
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
148 * small enough in order to use preallocated memory pools. You can tune
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
149 * this value according to your application behaviour and memory needs.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
150 *
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
151 * Note: a size threshold of 512 guarantees that newly created dictionaries
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
152 * will be allocated from preallocated memory pools on 64-bit.
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
153 *
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
154 * The following invariants must hold:
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
155 * 1) ALIGNMENT <= SMALL_REQUEST_THRESHOLD <= 512
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
156 * 2) SMALL_REQUEST_THRESHOLD is evenly divisible by ALIGNMENT
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
157 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
158 * Although not required, for better performance and space efficiency,
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
159 * it is recommended that SMALL_REQUEST_THRESHOLD is set to a power of 2.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
160 */
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
161 #define SMALL_REQUEST_THRESHOLD 512
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
162 #define NB_SMALL_SIZE_CLASSES (SMALL_REQUEST_THRESHOLD / ALIGNMENT)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
163
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
164 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
165 * The system's VMM page size can be obtained on most unices with a
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
166 * getpagesize() call or deduced from various header files. To make
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
167 * things simpler, we assume that it is 4K, which is OK for most systems.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
168 * It is probably better if this is the native page size, but it doesn't
35222
8d0d395c211e Backport:
Georg Brandl <georg@python.org>
parents: 32279
diff changeset
169 * have to be. In theory, if SYSTEM_PAGE_SIZE is larger than the native page
8d0d395c211e Backport:
Georg Brandl <georg@python.org>
parents: 32279
diff changeset
170 * size, then `POOL_ADDR(p)->arenaindex' could rarely cause a segmentation
8d0d395c211e Backport:
Georg Brandl <georg@python.org>
parents: 32279
diff changeset
171 * violation fault. 4K is apparently OK for all the platforms that python
25928
75756c8558bd Patch #627105: Document that SYSTEM_PAGE_SIZE really should not be
Martin v. Löwis <martin@v.loewis.de>
parents: 25233
diff changeset
172 * currently targets.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
173 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
174 #define SYSTEM_PAGE_SIZE (4 * 1024)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
175 #define SYSTEM_PAGE_SIZE_MASK (SYSTEM_PAGE_SIZE - 1)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
176
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
177 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
178 * Maximum amount of memory managed by the allocator for small requests.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
179 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
180 #ifdef WITH_MEMORY_LIMITS
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
181 #ifndef SMALL_MEMORY_LIMIT
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
182 #define SMALL_MEMORY_LIMIT (64 * 1024 * 1024) /* 64 MB -- more? */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
183 #endif
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
184 #endif
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
185
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
186 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
187 * The allocator sub-allocates <Big> blocks of memory (called arenas) aligned
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
188 * on a page boundary. This is a reserved virtual address space for the
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
189 * current process (obtained through a malloc()/mmap() call). In no way this
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
190 * means that the memory arenas will be used entirely. A malloc(<Big>) is
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
191 * usually an address range reservation for <Big> bytes, unless all pages within
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
192 * this space are referenced subsequently. So malloc'ing big blocks and not
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
193 * using them does not mean "wasting memory". It's an addressable range
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
194 * wastage...
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
195 *
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
196 * Arenas are allocated with mmap() on systems supporting anonymous memory
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
197 * mappings to reduce heap fragmentation.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
198 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
199 #define ARENA_SIZE (256 << 10) /* 256KB */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
200
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
201 #ifdef WITH_MEMORY_LIMITS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
202 #define MAX_ARENAS (SMALL_MEMORY_LIMIT / ARENA_SIZE)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
203 #endif
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
204
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
205 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
206 * Size of the pools used for small blocks. Should be a power of 2,
22692
2c02cf278f02 It's once again thought safe to call the pymalloc free/realloc with an
Tim Peters <tim.peters@gmail.com>
parents: 22691
diff changeset
207 * between 1K and SYSTEM_PAGE_SIZE, that is: 1k, 2k, 4k.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
208 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
209 #define POOL_SIZE SYSTEM_PAGE_SIZE /* must be 2^N */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
210 #define POOL_SIZE_MASK SYSTEM_PAGE_SIZE_MASK
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
211
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
212 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
213 * -- End of tunable settings section --
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
214 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
215
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
216 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
217
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
218 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
219 * Locking
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
220 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
221 * To reduce lock contention, it would probably be better to refine the
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
222 * crude function locking with per size class locking. I'm not positive
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
223 * however, whether it's worth switching to such locking policy because
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
224 * of the performance penalty it might introduce.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
225 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
226 * The following macros describe the simplest (should also be the fastest)
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
227 * lock object on a particular platform and the init/fini/lock/unlock
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
228 * operations on it. The locks defined here are not expected to be recursive
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
229 * because it is assumed that they will always be called in the order:
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
230 * INIT, [LOCK, UNLOCK]*, FINI.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
231 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
232
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
233 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
234 * Python's threads are serialized, so object malloc locking is disabled.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
235 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
236 #define SIMPLELOCK_DECL(lock) /* simple lock declaration */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
237 #define SIMPLELOCK_INIT(lock) /* allocate (if needed) and initialize */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
238 #define SIMPLELOCK_FINI(lock) /* free/destroy an existing lock */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
239 #define SIMPLELOCK_LOCK(lock) /* acquire released lock */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
240 #define SIMPLELOCK_UNLOCK(lock) /* release acquired lock */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
241
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
242 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
243 * Basic types
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
244 * I don't care if these are defined in <sys/types.h> or elsewhere. Axiom.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
245 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
246 #undef uchar
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
247 #define uchar unsigned char /* assuming == 8 bits */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
248
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
249 #undef uint
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
250 #define uint unsigned int /* assuming >= 16 bits */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
251
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
252 #undef ulong
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
253 #define ulong unsigned long /* assuming >= 32 bits */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
254
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
255 #undef uptr
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
256 #define uptr Py_uintptr_t
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
257
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
258 /* When you say memory, my mind reasons in terms of (pointers to) blocks */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
259 typedef uchar block;
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
260
22836
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
261 /* Pool for small blocks. */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
262 struct pool_header {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
263 union { block *_padding;
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
264 uint count; } ref; /* number of allocated blocks */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
265 block *freeblock; /* pool's free list head */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
266 struct pool_header *nextpool; /* next pool of this size class */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
267 struct pool_header *prevpool; /* previous pool "" */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
268 uint arenaindex; /* index into arenas of base adr */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
269 uint szidx; /* block size class index */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
270 uint nextoffset; /* bytes to virgin block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
271 uint maxnextoffset; /* largest valid nextoffset */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
272 };
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
273
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
274 typedef struct pool_header *poolp;
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
275
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
276 /* Record keeping for arenas. */
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
277 struct arena_object {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
278 /* The address of the arena, as returned by malloc. Note that 0
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
279 * will never be returned by a successful malloc, and is used
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
280 * here to mark an arena_object that doesn't correspond to an
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
281 * allocated arena.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
282 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
283 uptr address;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
284
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
285 /* Pool-aligned pointer to the next pool to be carved off. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
286 block* pool_address;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
287
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
288 /* The number of available pools in the arena: free pools + never-
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
289 * allocated pools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
290 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
291 uint nfreepools;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
292
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
293 /* The total number of pools in the arena, whether or not available. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
294 uint ntotalpools;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
295
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
296 /* Singly-linked list of available pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
297 struct pool_header* freepools;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
298
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
299 /* Whenever this arena_object is not associated with an allocated
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
300 * arena, the nextarena member is used to link all unassociated
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
301 * arena_objects in the singly-linked `unused_arena_objects` list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
302 * The prevarena member is unused in this case.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
303 *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
304 * When this arena_object is associated with an allocated arena
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
305 * with at least one available pool, both members are used in the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
306 * doubly-linked `usable_arenas` list, which is maintained in
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
307 * increasing order of `nfreepools` values.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
308 *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
309 * Else this arena_object is associated with an allocated arena
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
310 * all of whose pools are in use. `nextarena` and `prevarena`
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
311 * are both meaningless in this case.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
312 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
313 struct arena_object* nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
314 struct arena_object* prevarena;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
315 };
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
316
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
317 #undef ROUNDUP
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
318 #define ROUNDUP(x) (((x) + ALIGNMENT_MASK) & ~ALIGNMENT_MASK)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
319 #define POOL_OVERHEAD ROUNDUP(sizeof(struct pool_header))
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
320
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
321 #define DUMMY_SIZE_IDX 0xffff /* size class of newly cached pools */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
322
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
323 /* Round pointer P down to the closest pool-aligned address <= P, as a poolp */
22836
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
324 #define POOL_ADDR(P) ((poolp)((uptr)(P) & ~(uptr)POOL_SIZE_MASK))
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
325
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
326 /* Return total number of blocks in pool of size index I, as a uint. */
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
327 #define NUMBLOCKS(I) ((uint)(POOL_SIZE - POOL_OVERHEAD) / INDEX2SIZE(I))
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
328
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
329 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
330
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
331 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
332 * This malloc lock
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
333 */
24294
0a08ed05bd42 Remove extraneous semicolon.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24177
diff changeset
334 SIMPLELOCK_DECL(_malloc_lock)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
335 #define LOCK() SIMPLELOCK_LOCK(_malloc_lock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
336 #define UNLOCK() SIMPLELOCK_UNLOCK(_malloc_lock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
337 #define LOCK_INIT() SIMPLELOCK_INIT(_malloc_lock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
338 #define LOCK_FINI() SIMPLELOCK_FINI(_malloc_lock)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
339
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
340 /*
22697
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
341 * Pool table -- headed, circular, doubly-linked lists of partially used pools.
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
342
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
343 This is involved. For an index i, usedpools[i+i] is the header for a list of
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
344 all partially used pools holding small blocks with "size class idx" i. So
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
345 usedpools[0] corresponds to blocks of size 8, usedpools[2] to blocks of size
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
346 16, and so on: index 2*i <-> blocks of size (i+1)<<ALIGNMENT_SHIFT.
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
347
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
348 Pools are carved off an arena's highwater mark (an arena_object's pool_address
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
349 member) as needed. Once carved off, a pool is in one of three states forever
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
350 after:
22697
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
351
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
352 used == partially used, neither empty nor full
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
353 At least one block in the pool is currently allocated, and at least one
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
354 block in the pool is not currently allocated (note this implies a pool
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
355 has room for at least two blocks).
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
356 This is a pool's initial state, as a pool is created only when malloc
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
357 needs space.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
358 The pool holds blocks of a fixed size, and is in the circular list headed
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
359 at usedpools[i] (see above). It's linked to the other used pools of the
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
360 same size class via the pool_header's nextpool and prevpool members.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
361 If all but one block is currently allocated, a malloc can cause a
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
362 transition to the full state. If all but one block is not currently
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
363 allocated, a free can cause a transition to the empty state.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
364
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
365 full == all the pool's blocks are currently allocated
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
366 On transition to full, a pool is unlinked from its usedpools[] list.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
367 It's not linked to from anything then anymore, and its nextpool and
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
368 prevpool members are meaningless until it transitions back to used.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
369 A free of a block in a full pool puts the pool back in the used state.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
370 Then it's linked in at the front of the appropriate usedpools[] list, so
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
371 that the next allocation for its size class will reuse the freed block.
22697
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
372
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
373 empty == all the pool's blocks are currently available for allocation
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
374 On transition to empty, a pool is unlinked from its usedpools[] list,
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
375 and linked to the front of its arena_object's singly-linked freepools list,
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
376 via its nextpool member. The prevpool member has no meaning in this case.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
377 Empty pools have no inherent size class: the next time a malloc finds
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
378 an empty list in usedpools[], it takes the first pool off of freepools.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
379 If the size class needed happens to be the same as the size class the pool
22836
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
380 last had, some pool initialization can be skipped.
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
381
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
382
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
383 Block Management
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
384
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
385 Blocks within pools are again carved out as needed. pool->freeblock points to
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
386 the start of a singly-linked list of free blocks within the pool. When a
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
387 block is freed, it's inserted at the front of its pool's freeblock list. Note
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
388 that the available blocks in a pool are *not* linked all together when a pool
22836
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
389 is initialized. Instead only "the first two" (lowest addresses) blocks are
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
390 set up, returning the first such block, and setting pool->freeblock to a
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
391 one-block list holding the second such block. This is consistent with that
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
392 pymalloc strives at all levels (arena, pool, and block) never to touch a piece
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
393 of memory until it's actually needed.
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
394
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
395 So long as a pool is in the used state, we're certain there *is* a block
22948
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
396 available for allocating, and pool->freeblock is not NULL. If pool->freeblock
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
397 points to the end of the free list before we've carved the entire pool into
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
398 blocks, that means we simply haven't yet gotten to one of the higher-address
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
399 blocks. The offset from the pool_header to the start of "the next" virgin
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
400 block is stored in the pool_header nextoffset member, and the largest value
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
401 of nextoffset that makes sense is stored in the maxnextoffset member when a
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
402 pool is initialized. All the blocks in a pool have been passed out at least
6cb52829da1a SF bug 542181: Realloc behavior
Tim Peters <tim.peters@gmail.com>
parents: 22860
diff changeset
403 once when and only when nextoffset > maxnextoffset.
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
404
22697
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
405
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
406 Major obscurity: While the usedpools vector is declared to have poolp
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
407 entries, it doesn't really. It really contains two pointers per (conceptual)
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
408 poolp entry, the nextpool and prevpool members of a pool_header. The
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
409 excruciating initialization code below fools C so that
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
410
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
411 usedpool[i+i]
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
412
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
413 "acts like" a genuine poolp, but only so long as you only reference its
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
414 nextpool and prevpool members. The "- 2*sizeof(block *)" gibberish is
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
415 compensating for that a pool_header's nextpool and prevpool members
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
416 immediately follow a pool_header's first two members:
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
417
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
418 union { block *_padding;
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
419 uint count; } ref;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
420 block *freeblock;
22697
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
421
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
422 each of which consume sizeof(block *) bytes. So what usedpools[i+i] really
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
423 contains is a fudged-up pointer p such that *if* C believes it's a poolp
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
424 pointer, then p->nextpool and p->prevpool are both p (meaning that the headed
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
425 circular list is empty).
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
426
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
427 It's unclear why the usedpools setup is so convoluted. It could be to
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
428 minimize the amount of cache required to hold this heavily-referenced table
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
429 (which only *needs* the two interpool pointer members of a pool_header). OTOH,
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
430 referencing code has to remember to "double the index" and doing so isn't
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
431 free, usedpools[0] isn't a strictly legal pointer, and we're crucially relying
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
432 on that C doesn't insert any padding anywhere in a pool_header at or before
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
433 the prevpool member.
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
434 **************************************************************************** */
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
435
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
436 #define PTA(x) ((poolp )((uchar *)&(usedpools[2*(x)]) - 2*sizeof(block *)))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
437 #define PT(x) PTA(x), PTA(x)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
438
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
439 static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
440 PT(0), PT(1), PT(2), PT(3), PT(4), PT(5), PT(6), PT(7)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
441 #if NB_SMALL_SIZE_CLASSES > 8
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
442 , PT(8), PT(9), PT(10), PT(11), PT(12), PT(13), PT(14), PT(15)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
443 #if NB_SMALL_SIZE_CLASSES > 16
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
444 , PT(16), PT(17), PT(18), PT(19), PT(20), PT(21), PT(22), PT(23)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
445 #if NB_SMALL_SIZE_CLASSES > 24
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
446 , PT(24), PT(25), PT(26), PT(27), PT(28), PT(29), PT(30), PT(31)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
447 #if NB_SMALL_SIZE_CLASSES > 32
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
448 , PT(32), PT(33), PT(34), PT(35), PT(36), PT(37), PT(38), PT(39)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
449 #if NB_SMALL_SIZE_CLASSES > 40
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
450 , PT(40), PT(41), PT(42), PT(43), PT(44), PT(45), PT(46), PT(47)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
451 #if NB_SMALL_SIZE_CLASSES > 48
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
452 , PT(48), PT(49), PT(50), PT(51), PT(52), PT(53), PT(54), PT(55)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
453 #if NB_SMALL_SIZE_CLASSES > 56
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
454 , PT(56), PT(57), PT(58), PT(59), PT(60), PT(61), PT(62), PT(63)
69805
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
455 #if NB_SMALL_SIZE_CLASSES > 64
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
456 #error "NB_SMALL_SIZE_CLASSES should be less than 64"
f8a697bc3ca8 Issue #11849: Make it more likely for the system allocator to release
Antoine Pitrou <solipsis@pitrou.net>
parents: 68258
diff changeset
457 #endif /* NB_SMALL_SIZE_CLASSES > 64 */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
458 #endif /* NB_SMALL_SIZE_CLASSES > 56 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
459 #endif /* NB_SMALL_SIZE_CLASSES > 48 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
460 #endif /* NB_SMALL_SIZE_CLASSES > 40 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
461 #endif /* NB_SMALL_SIZE_CLASSES > 32 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
462 #endif /* NB_SMALL_SIZE_CLASSES > 24 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
463 #endif /* NB_SMALL_SIZE_CLASSES > 16 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
464 #endif /* NB_SMALL_SIZE_CLASSES > 8 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
465 };
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
466
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
467 /*==========================================================================
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
468 Arena management.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
469
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
470 `arenas` is a vector of arena_objects. It contains maxarenas entries, some of
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
471 which may not be currently used (== they're arena_objects that aren't
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
472 currently associated with an allocated arena). Note that arenas proper are
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
473 separately malloc'ed.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
474
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
475 Prior to Python 2.5, arenas were never free()'ed. Starting with Python 2.5,
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
476 we do try to free() arenas, and use some mild heuristic strategies to increase
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
477 the likelihood that arenas eventually can be freed.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
478
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
479 unused_arena_objects
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
480
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
481 This is a singly-linked list of the arena_objects that are currently not
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
482 being used (no arena is associated with them). Objects are taken off the
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
483 head of the list in new_arena(), and are pushed on the head of the list in
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
484 PyObject_Free() when the arena is empty. Key invariant: an arena_object
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
485 is on this list if and only if its .address member is 0.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
486
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
487 usable_arenas
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
488
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
489 This is a doubly-linked list of the arena_objects associated with arenas
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
490 that have pools available. These pools are either waiting to be reused,
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
491 or have not been used before. The list is sorted to have the most-
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
492 allocated arenas first (ascending order based on the nfreepools member).
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
493 This means that the next allocation will come from a heavily used arena,
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
494 which gives the nearly empty arenas a chance to be returned to the system.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
495 In my unscientific tests this dramatically improved the number of arenas
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
496 that could be freed.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
497
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
498 Note that an arena_object associated with an arena all of whose pools are
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
499 currently in use isn't on either list.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
500 */
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
501
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
502 /* Array of objects used to track chunks of memory (arenas). */
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
503 static struct arena_object* arenas = NULL;
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
504 /* Number of slots currently allocated in the `arenas` vector. */
22690
00b2972ab4a4 Changed the #-of-arenas counters to uints -- no need to be insane about
Tim Peters <tim.peters@gmail.com>
parents: 22687
diff changeset
505 static uint maxarenas = 0;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
506
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
507 /* The head of the singly-linked, NULL-terminated list of available
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
508 * arena_objects.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
509 */
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
510 static struct arena_object* unused_arena_objects = NULL;
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
511
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
512 /* The head of the doubly-linked, NULL-terminated at each end, list of
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
513 * arena_objects associated with arenas that have pools available.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
514 */
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
515 static struct arena_object* usable_arenas = NULL;
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
516
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
517 /* How many arena_objects do we initially allocate?
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
518 * 16 = can allocate 16 arenas = 16 * ARENA_SIZE = 4MB before growing the
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
519 * `arenas` vector.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
520 */
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
521 #define INITIAL_ARENA_OBJECTS 16
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
522
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
523 /* Number of arenas allocated that haven't been free()'d. */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
524 static size_t narenas_currently_allocated = 0;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
525
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
526 #ifdef PYMALLOC_DEBUG
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
527 /* Total number of times malloc() called to allocate an arena. */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
528 static size_t ntimes_arena_allocated = 0;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
529 /* High water mark (max value ever seen) for narenas_currently_allocated. */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
530 static size_t narenas_highwater = 0;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
531 #endif
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
532
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
533 /* Allocate a new arena. If we run out of memory, return NULL. Else
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
534 * allocate a new arena, and return the address of an arena_object
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
535 * describing the new arena. It's expected that the caller will set
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
536 * `usable_arenas` to the return value.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
537 */
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
538 static struct arena_object*
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
539 new_arena(void)
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
540 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
541 struct arena_object* arenaobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
542 uint excess; /* number of bytes above pool alignment */
75511
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
543 void *address;
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
544 int err;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
545
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
546 #ifdef PYMALLOC_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
547 if (Py_GETENV("PYTHONMALLOCSTATS"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
548 _PyObject_DebugMallocStats();
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
549 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
550 if (unused_arena_objects == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
551 uint i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
552 uint numarenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
553 size_t nbytes;
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
554
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
555 /* Double the number of arena objects on each allocation.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
556 * Note that it's possible for `numarenas` to overflow.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
557 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
558 numarenas = maxarenas ? maxarenas << 1 : INITIAL_ARENA_OBJECTS;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
559 if (numarenas <= maxarenas)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
560 return NULL; /* overflow */
49145
96d6276d80e2 Merged revisions 66383 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48825
diff changeset
561 #if SIZEOF_SIZE_T <= SIZEOF_INT
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
562 if (numarenas > PY_SIZE_MAX / sizeof(*arenas))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
563 return NULL; /* overflow */
49145
96d6276d80e2 Merged revisions 66383 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48825
diff changeset
564 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
565 nbytes = numarenas * sizeof(*arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
566 arenaobj = (struct arena_object *)realloc(arenas, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
567 if (arenaobj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
568 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
569 arenas = arenaobj;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
570
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
571 /* We might need to fix pointers that were copied. However,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
572 * new_arena only gets called when all the pages in the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
573 * previous arenas are full. Thus, there are *no* pointers
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
574 * into the old array. Thus, we don't have to worry about
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
575 * invalid pointers. Just to be sure, some asserts:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
576 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
577 assert(usable_arenas == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
578 assert(unused_arena_objects == NULL);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
579
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
580 /* Put the new arenas on the unused_arena_objects list. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
581 for (i = maxarenas; i < numarenas; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
582 arenas[i].address = 0; /* mark as unassociated */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
583 arenas[i].nextarena = i < numarenas - 1 ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
584 &arenas[i+1] : NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
585 }
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
586
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
587 /* Update globals. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
588 unused_arena_objects = &arenas[maxarenas];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
589 maxarenas = numarenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
590 }
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
591
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
592 /* Take the next available arena object off the head of the list. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
593 assert(unused_arena_objects != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
594 arenaobj = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
595 unused_arena_objects = arenaobj->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
596 assert(arenaobj->address == 0);
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
597 #ifdef ARENAS_USE_MMAP
75511
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
598 address = mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
599 MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
75511
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
600 err = (address == MAP_FAILED);
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
601 #else
75511
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
602 address = malloc(ARENA_SIZE);
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
603 err = (address == 0);
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
604 #endif
75511
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
605 if (err) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
606 /* The allocation failed: return NULL after putting the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
607 * arenaobj back.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
608 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
609 arenaobj->nextarena = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
610 unused_arena_objects = arenaobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
611 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
612 }
75511
ba8f85e16dd9 Close #14232: catch mmap() failure in new_arena() of obmalloc
Victor Stinner <victor.stinner@gmail.com>
parents: 73747
diff changeset
613 arenaobj->address = (uptr)address;
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
614
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
615 ++narenas_currently_allocated;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
616 #ifdef PYMALLOC_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
617 ++ntimes_arena_allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
618 if (narenas_currently_allocated > narenas_highwater)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
619 narenas_highwater = narenas_currently_allocated;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
620 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
621 arenaobj->freepools = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
622 /* pool_address <- first pool-aligned address in the arena
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
623 nfreepools <- number of whole pools that fit after alignment */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
624 arenaobj->pool_address = (block*)arenaobj->address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
625 arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
626 assert(POOL_SIZE * arenaobj->nfreepools == ARENA_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
627 excess = (uint)(arenaobj->address & POOL_SIZE_MASK);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
628 if (excess != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
629 --arenaobj->nfreepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
630 arenaobj->pool_address += POOL_SIZE - excess;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
631 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
632 arenaobj->ntotalpools = arenaobj->nfreepools;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
633
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
634 return arenaobj;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
635 }
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
636
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
637 /*
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
638 Py_ADDRESS_IN_RANGE(P, POOL)
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
639
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
640 Return true if and only if P is an address that was allocated by pymalloc.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
641 POOL must be the pool address associated with P, i.e., POOL = POOL_ADDR(P)
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
642 (the caller is asked to compute this because the macro expands POOL more than
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
643 once, and for efficiency it's best for the caller to assign POOL_ADDR(P) to a
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
644 variable and pass the latter to the macro; because Py_ADDRESS_IN_RANGE is
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
645 called on every alloc/realloc/free, micro-efficiency is important here).
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
646
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
647 Tricky: Let B be the arena base address associated with the pool, B =
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
648 arenas[(POOL)->arenaindex].address. Then P belongs to the arena if and only if
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
649
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
650 B <= P < B + ARENA_SIZE
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
651
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
652 Subtracting B throughout, this is true iff
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
653
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
654 0 <= P-B < ARENA_SIZE
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
655
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
656 By using unsigned arithmetic, the "0 <=" half of the test can be skipped.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
657
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
658 Obscure: A PyMem "free memory" function can call the pymalloc free or realloc
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
659 before the first arena has been allocated. `arenas` is still NULL in that
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
660 case. We're relying on that maxarenas is also 0 in that case, so that
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
661 (POOL)->arenaindex < maxarenas must be false, saving us from trying to index
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
662 into a NULL arenas.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
663
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
664 Details: given P and POOL, the arena_object corresponding to P is AO =
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
665 arenas[(POOL)->arenaindex]. Suppose obmalloc controls P. Then (barring wild
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
666 stores, etc), POOL is the correct address of P's pool, AO.address is the
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
667 correct base address of the pool's arena, and P must be within ARENA_SIZE of
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
668 AO.address. In addition, AO.address is not 0 (no arena can start at address 0
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
669 (NULL)). Therefore Py_ADDRESS_IN_RANGE correctly reports that obmalloc
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
670 controls P.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
671
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
672 Now suppose obmalloc does not control P (e.g., P was obtained via a direct
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
673 call to the system malloc() or realloc()). (POOL)->arenaindex may be anything
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
674 in this case -- it may even be uninitialized trash. If the trash arenaindex
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
675 is >= maxarenas, the macro correctly concludes at once that obmalloc doesn't
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
676 control P.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
677
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
678 Else arenaindex is < maxarena, and AO is read up. If AO corresponds to an
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
679 allocated arena, obmalloc controls all the memory in slice AO.address :
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
680 AO.address+ARENA_SIZE. By case assumption, P is not controlled by obmalloc,
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
681 so P doesn't lie in that slice, so the macro correctly reports that P is not
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
682 controlled by obmalloc.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
683
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
684 Finally, if P is not controlled by obmalloc and AO corresponds to an unused
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
685 arena_object (one not currently associated with an allocated arena),
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
686 AO.address is 0, and the second test in the macro reduces to:
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
687
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
688 P < ARENA_SIZE
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
689
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
690 If P >= ARENA_SIZE (extremely likely), the macro again correctly concludes
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
691 that P is not controlled by obmalloc. However, if P < ARENA_SIZE, this part
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
692 of the test still passes, and the third clause (AO.address != 0) is necessary
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
693 to get the correct result: AO.address is 0 in this case, so the macro
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
694 correctly reports that P is not controlled by obmalloc (despite that P lies in
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
695 slice AO.address : AO.address + ARENA_SIZE).
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
696
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
697 Note: The third (AO.address != 0) clause was added in Python 2.5. Before
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
698 2.5, arenas were never free()'ed, and an arenaindex < maxarena always
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
699 corresponded to a currently-allocated arena, so the "P is not controlled by
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
700 obmalloc, AO corresponds to an unused arena_object, and P < ARENA_SIZE" case
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
701 was impossible.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
702
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
703 Note that the logic is excruciating, and reading up possibly uninitialized
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
704 memory when P is not controlled by obmalloc (to get at (POOL)->arenaindex)
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
705 creates problems for some memory debuggers. The overwhelming advantage is
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
706 that this test determines whether an arbitrary address is controlled by
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
707 obmalloc in a small constant time, independent of the number of arenas
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
708 obmalloc controls. Since this test is needed at every entry point, it's
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
709 extremely desirable that it be this fast.
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
710
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
711 Since Py_ADDRESS_IN_RANGE may be reading from memory which was not allocated
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
712 by Python, it is important that (POOL)->arenaindex is read only once, as
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
713 another thread may be concurrently modifying the value without holding the
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
714 GIL. To accomplish this, the arenaindex_temp variable is used to store
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
715 (POOL)->arenaindex for the duration of the Py_ADDRESS_IN_RANGE macro's
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
716 execution. The caller of the macro is responsible for declaring this
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
717 variable.
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
718 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
719 #define Py_ADDRESS_IN_RANGE(P, POOL) \
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
720 ((arenaindex_temp = (POOL)->arenaindex) < maxarenas && \
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
721 (uptr)(P) - arenas[arenaindex_temp].address < (uptr)ARENA_SIZE && \
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
722 arenas[arenaindex_temp].address != 0)
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
723
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
724
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
725 /* This is only useful when running memory debuggers such as
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
726 * Purify or Valgrind. Uncomment to use.
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
727 *
49294
091a6c5227a9 Merged revisions 66616 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 49145
diff changeset
728 #define Py_USING_MEMORY_DEBUGGER
42334
e70cdce0e8b2 Merged revisions 56467-56482 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 40450
diff changeset
729 */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
730
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
731 #ifdef Py_USING_MEMORY_DEBUGGER
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
732
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
733 /* Py_ADDRESS_IN_RANGE may access uninitialized memory by design
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
734 * This leads to thousands of spurious warnings when using
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
735 * Purify or Valgrind. By making a function, we can easily
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
736 * suppress the uninitialized memory reads in this one function.
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
737 * So we won't ignore real errors elsewhere.
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
738 *
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
739 * Disable the macro and use a function.
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
740 */
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
741
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
742 #undef Py_ADDRESS_IN_RANGE
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
743
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
744 #if defined(__GNUC__) && ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) || \
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
745 (__GNUC__ >= 4))
35864
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
746 #define Py_NO_INLINE __attribute__((__noinline__))
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
747 #else
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
748 #define Py_NO_INLINE
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
749 #endif
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
750
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
751 /* Don't make static, to try to ensure this isn't inlined. */
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
752 int Py_ADDRESS_IN_RANGE(void *P, poolp pool) Py_NO_INLINE;
dbc93ee53e2f Do a better job of not inlining Py_ADDRESS_IN_RANGE() for newer gcc's.
Neal Norwitz <nnorwitz@gmail.com>
parents: 35222
diff changeset
753 #undef Py_NO_INLINE
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
754 #endif
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
755
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
756 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
757
22794
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
758 /* malloc. Note that nbytes==0 tries to return a non-NULL pointer, distinct
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
759 * from all other currently live pointers. This may not be possible.
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
760 */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
761
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
762 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
763 * The basic blocks are ordered by decreasing execution frequency,
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
764 * which minimizes the number of jumps in the most common cases,
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
765 * improves branching prediction and instruction scheduling (small
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
766 * block allocations typically result in a couple of instructions).
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
767 * Unless the optimizer reorders everything, being too smart...
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
768 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
769
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
770 #undef PyObject_Malloc
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
771 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
772 PyObject_Malloc(size_t nbytes)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
773 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
774 block *bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
775 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
776 poolp next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
777 uint size;
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
778
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
779 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
780 if (UNLIKELY(running_on_valgrind == -1))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
781 running_on_valgrind = RUNNING_ON_VALGRIND;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
782 if (UNLIKELY(running_on_valgrind))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
783 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
784 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
785
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
786 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
787 * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
788 * Most python internals blindly use a signed Py_ssize_t to track
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
789 * things without checking for overflows or negatives.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
790 * As size_t is unsigned, checking for nbytes < 0 is not required.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
791 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
792 if (nbytes > PY_SSIZE_T_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
793 return NULL;
48565
887ee6bd9284 Merged revisions 65182 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48330
diff changeset
794
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
795 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
796 * This implicitly redirects malloc(0).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
797 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
798 if ((nbytes - 1) < SMALL_REQUEST_THRESHOLD) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
799 LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
800 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
801 * Most frequent paths first
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
802 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
803 size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
804 pool = usedpools[size + size];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
805 if (pool != pool->nextpool) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
806 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
807 * There is a used pool for this size class.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
808 * Pick up the head block of its free list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
809 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
810 ++pool->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
811 bp = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
812 assert(bp != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
813 if ((pool->freeblock = *(block **)bp) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
814 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
815 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
816 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
817 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
818 * Reached the end of the free list, try to extend it.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
819 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
820 if (pool->nextoffset <= pool->maxnextoffset) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
821 /* There is room for another block. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
822 pool->freeblock = (block*)pool +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
823 pool->nextoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
824 pool->nextoffset += INDEX2SIZE(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
825 *(block **)(pool->freeblock) = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
826 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
827 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
828 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
829 /* Pool is full, unlink from used pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
830 next = pool->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
831 pool = pool->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
832 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
833 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
834 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
835 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
836 }
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
837
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
838 /* There isn't a pool of the right size class immediately
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
839 * available: use a free pool.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
840 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
841 if (usable_arenas == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
842 /* No arena has a free pool: allocate a new arena. */
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
843 #ifdef WITH_MEMORY_LIMITS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
844 if (narenas_currently_allocated >= MAX_ARENAS) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
845 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
846 goto redirect;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
847 }
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
848 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
849 usable_arenas = new_arena();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
850 if (usable_arenas == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
851 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
852 goto redirect;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
853 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
854 usable_arenas->nextarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
855 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
856 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
857 assert(usable_arenas->address != 0);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
858
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
859 /* Try to get a cached free pool. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
860 pool = usable_arenas->freepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
861 if (pool != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
862 /* Unlink from cached pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
863 usable_arenas->freepools = pool->nextpool;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
864
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
865 /* This arena already had the smallest nfreepools
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
866 * value, so decreasing nfreepools doesn't change
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
867 * that, and we don't need to rearrange the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
868 * usable_arenas list. However, if the arena has
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
869 * become wholly allocated, we need to remove its
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
870 * arena_object from usable_arenas.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
871 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
872 --usable_arenas->nfreepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
873 if (usable_arenas->nfreepools == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
874 /* Wholly allocated: remove. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
875 assert(usable_arenas->freepools == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
876 assert(usable_arenas->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
877 usable_arenas->nextarena->prevarena ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
878 usable_arenas);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
879
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
880 usable_arenas = usable_arenas->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
881 if (usable_arenas != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
882 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
883 assert(usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
884 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
885 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
886 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
887 /* nfreepools > 0: it must be that freepools
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
888 * isn't NULL, or that we haven't yet carved
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
889 * off all the arena's pools for the first
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
890 * time.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
891 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
892 assert(usable_arenas->freepools != NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
893 usable_arenas->pool_address <=
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
894 (block*)usable_arenas->address +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
895 ARENA_SIZE - POOL_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
896 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
897 init_pool:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
898 /* Frontlink to used pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
899 next = usedpools[size + size]; /* == prev */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
900 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
901 pool->prevpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
902 next->nextpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
903 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
904 pool->ref.count = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
905 if (pool->szidx == size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
906 /* Luckily, this pool last contained blocks
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
907 * of the same size class, so its header
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
908 * and free list are already initialized.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
909 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
910 bp = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
911 pool->freeblock = *(block **)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
912 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
913 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
914 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
915 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
916 * Initialize the pool header, set up the free list to
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
917 * contain just the second block, and return the first
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
918 * block.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
919 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
920 pool->szidx = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
921 size = INDEX2SIZE(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
922 bp = (block *)pool + POOL_OVERHEAD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
923 pool->nextoffset = POOL_OVERHEAD + (size << 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
924 pool->maxnextoffset = POOL_SIZE - size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
925 pool->freeblock = bp + size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
926 *(block **)(pool->freeblock) = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
927 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
928 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
929 }
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
930
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
931 /* Carve off a new pool. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
932 assert(usable_arenas->nfreepools > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
933 assert(usable_arenas->freepools == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
934 pool = (poolp)usable_arenas->pool_address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
935 assert((block*)pool <= (block*)usable_arenas->address +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
936 ARENA_SIZE - POOL_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
937 pool->arenaindex = usable_arenas - arenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
938 assert(&arenas[pool->arenaindex] == usable_arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
939 pool->szidx = DUMMY_SIZE_IDX;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
940 usable_arenas->pool_address += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
941 --usable_arenas->nfreepools;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
942
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
943 if (usable_arenas->nfreepools == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
944 assert(usable_arenas->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
945 usable_arenas->nextarena->prevarena ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
946 usable_arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
947 /* Unlink the arena: it is completely allocated. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
948 usable_arenas = usable_arenas->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
949 if (usable_arenas != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
950 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
951 assert(usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
952 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
953 }
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
954
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
955 goto init_pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
956 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
957
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
958 /* The small block allocator ends here. */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
959
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
960 redirect:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
961 /* Redirect the original request to the underlying (libc) allocator.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
962 * We jump here on bigger requests, on error in the code above (as a
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
963 * last chance to serve the request) or when the max memory limit
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
964 * has been reached.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
965 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
966 if (nbytes == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
967 nbytes = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
968 return (void *)malloc(nbytes);
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
969 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
970
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
971 /* free */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
972
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
973 #undef PyObject_Free
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
974 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
975 PyObject_Free(void *p)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
976 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
977 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
978 block *lastfree;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
979 poolp next, prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
980 uint size;
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
981 #ifndef Py_USING_MEMORY_DEBUGGER
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
982 uint arenaindex_temp;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
983 #endif
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
984
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
985 if (p == NULL) /* free(NULL) has no effect */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
986 return;
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
987
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
988 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
989 if (UNLIKELY(running_on_valgrind > 0))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
990 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
991 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
992
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
993 pool = POOL_ADDR(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
994 if (Py_ADDRESS_IN_RANGE(p, pool)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
995 /* We allocated this address. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
996 LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
997 /* Link p to the start of the pool's freeblock list. Since
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
998 * the pool had at least the p block outstanding, the pool
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
999 * wasn't empty (so it's already in a usedpools[] list, or
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1000 * was full and is in no list -- it's not in the freeblocks
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1001 * list in any case).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1002 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1003 assert(pool->ref.count > 0); /* else it was empty */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1004 *(block **)p = lastfree = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1005 pool->freeblock = (block *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1006 if (lastfree) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1007 struct arena_object* ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1008 uint nf; /* ao->nfreepools */
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1009
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1010 /* freeblock wasn't NULL, so the pool wasn't full,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1011 * and the pool is in a usedpools[] list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1012 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1013 if (--pool->ref.count != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1014 /* pool isn't empty: leave it in usedpools */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1015 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1016 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1017 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1018 /* Pool is now empty: unlink from usedpools, and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1019 * link to the front of freepools. This ensures that
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1020 * previously freed pools will be allocated later
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1021 * (being not referenced, they are perhaps paged out).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1022 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1023 next = pool->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1024 prev = pool->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1025 next->prevpool = prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1026 prev->nextpool = next;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1027
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1028 /* Link the pool to freepools. This is a singly-linked
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1029 * list, and pool->prevpool isn't used there.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1030 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1031 ao = &arenas[pool->arenaindex];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1032 pool->nextpool = ao->freepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1033 ao->freepools = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1034 nf = ++ao->nfreepools;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1035
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1036 /* All the rest is arena management. We just freed
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1037 * a pool, and there are 4 cases for arena mgmt:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1038 * 1. If all the pools are free, return the arena to
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1039 * the system free().
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1040 * 2. If this is the only free pool in the arena,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1041 * add the arena back to the `usable_arenas` list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1042 * 3. If the "next" arena has a smaller count of free
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1043 * pools, we have to "slide this arena right" to
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1044 * restore that usable_arenas is sorted in order of
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1045 * nfreepools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1046 * 4. Else there's nothing more to do.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1047 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1048 if (nf == ao->ntotalpools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1049 /* Case 1. First unlink ao from usable_arenas.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1050 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1051 assert(ao->prevarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1052 ao->prevarena->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1053 assert(ao ->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1054 ao->nextarena->address != 0);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1055
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1056 /* Fix the pointer in the prevarena, or the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1057 * usable_arenas pointer.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1058 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1059 if (ao->prevarena == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1060 usable_arenas = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1061 assert(usable_arenas == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1062 usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1063 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1064 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1065 assert(ao->prevarena->nextarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1066 ao->prevarena->nextarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1067 ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1068 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1069 /* Fix the pointer in the nextarena. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1070 if (ao->nextarena != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1071 assert(ao->nextarena->prevarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1072 ao->nextarena->prevarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1073 ao->prevarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1074 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1075 /* Record that this arena_object slot is
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1076 * available to be reused.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1077 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1078 ao->nextarena = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1079 unused_arena_objects = ao;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1080
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1081 /* Free the entire arena. */
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
1082 #ifdef ARENAS_USE_MMAP
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
1083 munmap((void *)ao->address, ARENA_SIZE);
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
1084 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1085 free((void *)ao->address);
73747
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
1086 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1087 ao->address = 0; /* mark unassociated */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1088 --narenas_currently_allocated;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1089
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1090 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1091 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1092 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1093 if (nf == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1094 /* Case 2. Put ao at the head of
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1095 * usable_arenas. Note that because
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1096 * ao->nfreepools was 0 before, ao isn't
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1097 * currently on the usable_arenas list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1098 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1099 ao->nextarena = usable_arenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1100 ao->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1101 if (usable_arenas)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1102 usable_arenas->prevarena = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1103 usable_arenas = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1104 assert(usable_arenas->address != 0);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1105
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1106 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1107 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1108 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1109 /* If this arena is now out of order, we need to keep
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1110 * the list sorted. The list is kept sorted so that
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1111 * the "most full" arenas are used first, which allows
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1112 * the nearly empty arenas to be completely freed. In
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1113 * a few un-scientific tests, it seems like this
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1114 * approach allowed a lot more memory to be freed.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1115 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1116 if (ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1117 nf <= ao->nextarena->nfreepools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1118 /* Case 4. Nothing to do. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1119 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1120 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1121 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1122 /* Case 3: We have to move the arena towards the end
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1123 * of the list, because it has more free pools than
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1124 * the arena to its right.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1125 * First unlink ao from usable_arenas.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1126 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1127 if (ao->prevarena != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1128 /* ao isn't at the head of the list */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1129 assert(ao->prevarena->nextarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1130 ao->prevarena->nextarena = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1131 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1132 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1133 /* ao is at the head of the list */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1134 assert(usable_arenas == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1135 usable_arenas = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1136 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1137 ao->nextarena->prevarena = ao->prevarena;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1138
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1139 /* Locate the new insertion point by iterating over
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1140 * the list, using our nextarena pointer.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1141 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1142 while (ao->nextarena != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1143 nf > ao->nextarena->nfreepools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1144 ao->prevarena = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1145 ao->nextarena = ao->nextarena->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1146 }
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1147
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1148 /* Insert ao at this point. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1149 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1150 ao->prevarena == ao->nextarena->prevarena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1151 assert(ao->prevarena->nextarena == ao->nextarena);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1152
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1153 ao->prevarena->nextarena = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1154 if (ao->nextarena != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1155 ao->nextarena->prevarena = ao;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1156
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1157 /* Verify that the swaps worked. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1158 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1159 nf <= ao->nextarena->nfreepools);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1160 assert(ao->prevarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1161 nf > ao->prevarena->nfreepools);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1162 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1163 ao->nextarena->prevarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1164 assert((usable_arenas == ao &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1165 ao->prevarena == NULL) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1166 ao->prevarena->nextarena == ao);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1167
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1168 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1169 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1170 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1171 /* Pool was full, so doesn't currently live in any list:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1172 * link it to the front of the appropriate usedpools[] list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1173 * This mimics LRU pool usage for new allocations and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1174 * targets optimal filling when several pools contain
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1175 * blocks of the same size class.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1176 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1177 --pool->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1178 assert(pool->ref.count > 0); /* else the pool is empty */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1179 size = pool->szidx;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1180 next = usedpools[size + size];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1181 prev = next->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1182 /* insert pool before next: prev <-> pool <-> next */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1183 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1184 pool->prevpool = prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1185 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1186 prev->nextpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1187 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1188 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1189 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1190
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1191 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1192 redirect:
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1193 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1194 /* We didn't allocate this address. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1195 free(p);
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1196 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1197
22794
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
1198 /* realloc. If p is NULL, this acts like malloc(nbytes). Else if nbytes==0,
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
1199 * then as the Python docs promise, we do not treat this like free(p), and
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
1200 * return a non-NULL result.
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
1201 */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1202
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1203 #undef PyObject_Realloc
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1204 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1205 PyObject_Realloc(void *p, size_t nbytes)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1206 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1207 void *bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1208 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1209 size_t size;
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1210 #ifndef Py_USING_MEMORY_DEBUGGER
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1211 uint arenaindex_temp;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1212 #endif
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1213
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1214 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1215 return PyObject_Malloc(nbytes);
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1216
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1217 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1218 * Limit ourselves to PY_SSIZE_T_MAX bytes to prevent security holes.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1219 * Most python internals blindly use a signed Py_ssize_t to track
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1220 * things without checking for overflows or negatives.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1221 * As size_t is unsigned, checking for nbytes < 0 is not required.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1222 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1223 if (nbytes > PY_SSIZE_T_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1224 return NULL;
48565
887ee6bd9284 Merged revisions 65182 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48330
diff changeset
1225
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1226 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1227 /* Treat running_on_valgrind == -1 the same as 0 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1228 if (UNLIKELY(running_on_valgrind > 0))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1229 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1230 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1231
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1232 pool = POOL_ADDR(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1233 if (Py_ADDRESS_IN_RANGE(p, pool)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1234 /* We're in charge of this block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1235 size = INDEX2SIZE(pool->szidx);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1236 if (nbytes <= size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1237 /* The block is staying the same or shrinking. If
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1238 * it's shrinking, there's a tradeoff: it costs
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1239 * cycles to copy the block to a smaller size class,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1240 * but it wastes memory not to copy it. The
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1241 * compromise here is to copy on shrink only if at
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1242 * least 25% of size can be shaved off.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1243 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1244 if (4 * nbytes > 3 * size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1245 /* It's the same,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1246 * or shrinking and new/old > 3/4.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1247 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1248 return p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1249 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1250 size = nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1251 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1252 bp = PyObject_Malloc(nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1253 if (bp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1254 memcpy(bp, p, size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1255 PyObject_Free(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1256 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1257 return bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1258 }
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1259 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1260 redirect:
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1261 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1262 /* We're not managing this block. If nbytes <=
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1263 * SMALL_REQUEST_THRESHOLD, it's tempting to try to take over this
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1264 * block. However, if we do, we need to copy the valid data from
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1265 * the C-managed block to one of our blocks, and there's no portable
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1266 * way to know how much of the memory space starting at p is valid.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1267 * As bug 1185883 pointed out the hard way, it's possible that the
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1268 * C-managed block is "at the end" of allocated VM space, so that
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1269 * a memory fault can occur if we try to copy nbytes bytes starting
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1270 * at p. Instead we punt: let C continue to manage this block.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1271 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1272 if (nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1273 return realloc(p, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1274 /* C doesn't define the result of realloc(p, 0) (it may or may not
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1275 * return NULL then), but Python's docs promise that nbytes==0 never
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1276 * returns NULL. We don't pass 0 to realloc(), to avoid that endcase
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1277 * to begin with. Even then, we can't be sure that realloc() won't
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1278 * return NULL.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1279 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1280 bp = realloc(p, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1281 return bp ? bp : p;
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1282 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1283
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1284 #else /* ! WITH_PYMALLOC */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1285
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1286 /*==========================================================================*/
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1287 /* pymalloc not enabled: Redirect the entry points to malloc. These will
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1288 * only be used by extensions that are compiled with pymalloc enabled. */
22484
ffcb2fd2947e Minor code cleanup -- no semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 22479
diff changeset
1289
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
1290 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1291 PyObject_Malloc(size_t n)
22469
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1292 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1293 return PyMem_MALLOC(n);
22469
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1294 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1295
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
1296 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1297 PyObject_Realloc(void *p, size_t n)
22469
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1298 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1299 return PyMem_REALLOC(p, n);
22469
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1300 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1301
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1302 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1303 PyObject_Free(void *p)
22469
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1304 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1305 PyMem_FREE(p);
22469
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1306 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1307 #endif /* WITH_PYMALLOC */
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1308
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1309 #ifdef PYMALLOC_DEBUG
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1310 /*==========================================================================*/
22484
ffcb2fd2947e Minor code cleanup -- no semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 22479
diff changeset
1311 /* A x-platform debugging allocator. This doesn't manage memory directly,
ffcb2fd2947e Minor code cleanup -- no semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 22479
diff changeset
1312 * it wraps a real allocator, adding extra debugging info to the memory blocks.
ffcb2fd2947e Minor code cleanup -- no semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 22479
diff changeset
1313 */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1314
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1315 /* Special bytes broadcast into debug memory blocks at appropriate times.
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1316 * Strings of these are unlikely to be valid addresses, floats, ints or
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1317 * 7-bit ASCII.
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1318 */
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1319 #undef CLEANBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1320 #undef DEADBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1321 #undef FORBIDDENBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1322 #define CLEANBYTE 0xCB /* clean (newly allocated) memory */
24177
a038abd08e4a Documented PYMALLOC_DEBUG. This completes primary coverage of all the
Tim Peters <tim.peters@gmail.com>
parents: 23363
diff changeset
1323 #define DEADBYTE 0xDB /* dead (newly freed) memory */
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1324 #define FORBIDDENBYTE 0xFB /* untouchable bytes at each end of a block */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1325
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1326 /* We tag each block with an API ID in order to tag API violations */
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1327 #define _PYMALLOC_MEM_ID 'm' /* the PyMem_Malloc() API */
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1328 #define _PYMALLOC_OBJ_ID 'o' /* The PyObject_Malloc() API */
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1329
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1330 static size_t serialno = 0; /* incremented on each debug {m,re}alloc */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1331
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1332 /* serialno is always incremented via calling this routine. The point is
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1333 * to supply a single place to set a breakpoint.
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1334 */
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1335 static void
22631
7870fac049f7 Add missing "void" to function.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22614
diff changeset
1336 bumpserialno(void)
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1337 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1338 ++serialno;
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1339 }
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1340
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1341 #define SST SIZEOF_SIZE_T
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1342
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1343 /* Read sizeof(size_t) bytes at p as a big-endian size_t. */
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1344 static size_t
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1345 read_size_t(const void *p)
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1346 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1347 const uchar *q = (const uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1348 size_t result = *q++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1349 int i;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1350
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1351 for (i = SST; --i > 0; ++q)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1352 result = (result << 8) | *q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1353 return result;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1354 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1355
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1356 /* Write n as a big-endian size_t, MSB at address p, LSB at
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1357 * p + sizeof(size_t) - 1.
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1358 */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1359 static void
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1360 write_size_t(void *p, size_t n)
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1361 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1362 uchar *q = (uchar *)p + SST - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1363 int i;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1364
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1365 for (i = SST; --i >= 0; --q) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1366 *q = (uchar)(n & 0xff);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1367 n >>= 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1368 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1369 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1370
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1371 #ifdef Py_DEBUG
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1372 /* Is target in the list? The list is traversed via the nextpool pointers.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1373 * The list may be NULL-terminated, or circular. Return 1 if target is in
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1374 * list, else 0.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1375 */
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1376 static int
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1377 pool_is_in_list(const poolp target, poolp list)
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1378 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1379 poolp origlist = list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1380 assert(target != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1381 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1382 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1383 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1384 if (target == list)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1385 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1386 list = list->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1387 } while (list != NULL && list != origlist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1388 return 0;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1389 }
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1390
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1391 #else
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1392 #define pool_is_in_list(X, Y) 1
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1393
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1394 #endif /* Py_DEBUG */
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1395
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1396 /* Let S = sizeof(size_t). The debug malloc asks for 4*S extra bytes and
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1397 fills them with useful stuff, here calling the underlying malloc's result p:
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1398
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1399 p[0: S]
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1400 Number of bytes originally asked for. This is a size_t, big-endian (easier
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1401 to read in a memory dump).
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1402 p[S: 2*S]
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1403 Copies of FORBIDDENBYTE. Used to catch under- writes and reads.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1404 p[2*S: 2*S+n]
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1405 The requested memory, filled with copies of CLEANBYTE.
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1406 Used to catch reference to uninitialized memory.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1407 &p[2*S] is returned. Note that this is 8-byte aligned if pymalloc
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1408 handled the request itself.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1409 p[2*S+n: 2*S+n+S]
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1410 Copies of FORBIDDENBYTE. Used to catch over- writes and reads.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1411 p[2*S+n+S: 2*S+n+2*S]
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1412 A serial number, incremented by 1 on each call to _PyObject_DebugMalloc
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1413 and _PyObject_DebugRealloc.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1414 This is a big-endian size_t.
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1415 If "bad memory" is detected later, the serial number gives an
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1416 excellent way to set a breakpoint on the next run, to capture the
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1417 instant at which this block was passed out.
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1418 */
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1419
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1420 /* debug replacements for the PyMem_* memory API */
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1421 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1422 _PyMem_DebugMalloc(size_t nbytes)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1423 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1424 return _PyObject_DebugMallocApi(_PYMALLOC_MEM_ID, nbytes);
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1425 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1426 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1427 _PyMem_DebugRealloc(void *p, size_t nbytes)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1428 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1429 return _PyObject_DebugReallocApi(_PYMALLOC_MEM_ID, p, nbytes);
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1430 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1431 void
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1432 _PyMem_DebugFree(void *p)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1433 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1434 _PyObject_DebugFreeApi(_PYMALLOC_MEM_ID, p);
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1435 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1436
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1437 /* debug replacements for the PyObject_* memory API */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1438 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1439 _PyObject_DebugMalloc(size_t nbytes)
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1440 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1441 return _PyObject_DebugMallocApi(_PYMALLOC_OBJ_ID, nbytes);
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1442 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1443 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1444 _PyObject_DebugRealloc(void *p, size_t nbytes)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1445 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1446 return _PyObject_DebugReallocApi(_PYMALLOC_OBJ_ID, p, nbytes);
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1447 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1448 void
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1449 _PyObject_DebugFree(void *p)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1450 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1451 _PyObject_DebugFreeApi(_PYMALLOC_OBJ_ID, p);
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1452 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1453 void
56258
d108fe77c06c merging revision 75106 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 56256
diff changeset
1454 _PyObject_DebugCheckAddress(const void *p)
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1455 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1456 _PyObject_DebugCheckAddressApi(_PYMALLOC_OBJ_ID, p);
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1457 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1458
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1459
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1460 /* generic debug memory api, with an "id" to identify the API in use */
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1461 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1462 _PyObject_DebugMallocApi(char id, size_t nbytes)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1463 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1464 uchar *p; /* base address of malloc'ed block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1465 uchar *tail; /* p + 2*SST + nbytes == pointer to tail pad bytes */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1466 size_t total; /* nbytes + 4*SST */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1467
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1468 bumpserialno();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1469 total = nbytes + 4*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1470 if (total < nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1471 /* overflow: can't represent total as a size_t */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1472 return NULL;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1473
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1474 p = (uchar *)PyObject_Malloc(total);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1475 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1476 return NULL;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1477
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1478 /* at p, write size (SST bytes), id (1 byte), pad (SST-1 bytes) */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1479 write_size_t(p, nbytes);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1480 p[SST] = (uchar)id;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1481 memset(p + SST + 1 , FORBIDDENBYTE, SST-1);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1482
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1483 if (nbytes > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1484 memset(p + 2*SST, CLEANBYTE, nbytes);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1485
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1486 /* at tail, write pad (SST bytes) and serialno (SST bytes) */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1487 tail = p + 2*SST + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1488 memset(tail, FORBIDDENBYTE, SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1489 write_size_t(tail + SST, serialno);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1490
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1491 return p + 2*SST;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1492 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1493
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1494 /* The debug free first checks the 2*SST bytes on each end for sanity (in
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1495 particular, that the FORBIDDENBYTEs with the api ID are still intact).
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1496 Then fills the original bytes with DEADBYTE.
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1497 Then calls the underlying free.
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1498 */
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1499 void
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1500 _PyObject_DebugFreeApi(char api, void *p)
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1501 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1502 uchar *q = (uchar *)p - 2*SST; /* address returned from malloc */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1503 size_t nbytes;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1504
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1505 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1506 return;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1507 _PyObject_DebugCheckAddressApi(api, p);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1508 nbytes = read_size_t(q);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1509 nbytes += 4*SST;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1510 if (nbytes > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1511 memset(q, DEADBYTE, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1512 PyObject_Free(q);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1513 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1514
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1515 void *
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1516 _PyObject_DebugReallocApi(char api, void *p, size_t nbytes)
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1517 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1518 uchar *q = (uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1519 uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1520 size_t total; /* nbytes + 4*SST */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1521 size_t original_nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1522 int i;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1523
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1524 if (p == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1525 return _PyObject_DebugMallocApi(api, nbytes);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1526
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1527 _PyObject_DebugCheckAddressApi(api, p);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1528 bumpserialno();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1529 original_nbytes = read_size_t(q - 2*SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1530 total = nbytes + 4*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1531 if (total < nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1532 /* overflow: can't represent total as a size_t */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1533 return NULL;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1534
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1535 if (nbytes < original_nbytes) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1536 /* shrinking: mark old extra memory dead */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1537 memset(q + nbytes, DEADBYTE, original_nbytes - nbytes + 2*SST);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1538 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1539
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1540 /* Resize and add decorations. We may get a new pointer here, in which
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1541 * case we didn't get the chance to mark the old memory with DEADBYTE,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1542 * but we live with that.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1543 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1544 q = (uchar *)PyObject_Realloc(q - 2*SST, total);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1545 if (q == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1546 return NULL;
22988
be54465a39c4 _PyObject_DebugRealloc(): rewritten to let the underlying realloc do
Tim Peters <tim.peters@gmail.com>
parents: 22987
diff changeset
1547
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1548 write_size_t(q, nbytes);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1549 assert(q[SST] == (uchar)api);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1550 for (i = 1; i < SST; ++i)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1551 assert(q[SST + i] == FORBIDDENBYTE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1552 q += 2*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1553 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1554 memset(tail, FORBIDDENBYTE, SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1555 write_size_t(tail + SST, serialno);
22988
be54465a39c4 _PyObject_DebugRealloc(): rewritten to let the underlying realloc do
Tim Peters <tim.peters@gmail.com>
parents: 22987
diff changeset
1556
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1557 if (nbytes > original_nbytes) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1558 /* growing: mark new extra memory clean */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1559 memset(q + original_nbytes, CLEANBYTE,
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1560 nbytes - original_nbytes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1561 }
22988
be54465a39c4 _PyObject_DebugRealloc(): rewritten to let the underlying realloc do
Tim Peters <tim.peters@gmail.com>
parents: 22987
diff changeset
1562
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1563 return q;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1564 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1565
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1566 /* Check the forbidden bytes on both ends of the memory allocated for p.
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1567 * If anything is wrong, print info to stderr via _PyObject_DebugDumpAddress,
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1568 * and call Py_FatalError to kill the program.
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1569 * The API id, is also checked.
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1570 */
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1571 void
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1572 _PyObject_DebugCheckAddressApi(char api, const void *p)
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1573 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1574 const uchar *q = (const uchar *)p;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1575 char msgbuf[64];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1576 char *msg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1577 size_t nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1578 const uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1579 int i;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1580 char id;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1581
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1582 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1583 msg = "didn't expect a NULL pointer";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1584 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1585 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1586
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1587 /* Check the API id */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1588 id = (char)q[-SST];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1589 if (id != api) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1590 msg = msgbuf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1591 snprintf(msg, sizeof(msgbuf), "bad ID: Allocated using API '%c', verified using API '%c'", id, api);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1592 msgbuf[sizeof(msgbuf)-1] = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1593 goto error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1594 }
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1595
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1596 /* Check the stuff at the start of p first: if there's underwrite
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1597 * corruption, the number-of-bytes field may be nuts, and checking
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1598 * the tail could lead to a segfault then.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1599 */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1600 for (i = SST-1; i >= 1; --i) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1601 if (*(q-i) != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1602 msg = "bad leading pad byte";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1603 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1604 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1605 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1606
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1607 nbytes = read_size_t(q - 2*SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1608 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1609 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1610 if (tail[i] != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1611 msg = "bad trailing pad byte";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1612 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1613 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1614 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1615
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1616 return;
22614
f294fdd18b5b PYMALLOC_DEBUG routines: The "check API family" gimmick was going nowhere
Tim Peters <tim.peters@gmail.com>
parents: 22487
diff changeset
1617
f294fdd18b5b PYMALLOC_DEBUG routines: The "check API family" gimmick was going nowhere
Tim Peters <tim.peters@gmail.com>
parents: 22487
diff changeset
1618 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1619 _PyObject_DebugDumpAddress(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1620 Py_FatalError(msg);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1621 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1622
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1623 /* Display info to stderr about the memory block at p. */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1624 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1625 _PyObject_DebugDumpAddress(const void *p)
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1626 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1627 const uchar *q = (const uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1628 const uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1629 size_t nbytes, serial;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1630 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1631 int ok;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1632 char id;
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1633
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1634 fprintf(stderr, "Debug memory block at address p=%p:", p);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1635 if (p == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1636 fprintf(stderr, "\n");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1637 return;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1638 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1639 id = (char)q[-SST];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1640 fprintf(stderr, " API '%c'\n", id);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1641
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1642 nbytes = read_size_t(q - 2*SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1643 fprintf(stderr, " %" PY_FORMAT_SIZE_T "u bytes originally "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1644 "requested\n", nbytes);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1645
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1646 /* In case this is nuts, check the leading pad bytes first. */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1647 fprintf(stderr, " The %d pad bytes at p-%d are ", SST-1, SST-1);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1648 ok = 1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1649 for (i = 1; i <= SST-1; ++i) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1650 if (*(q-i) != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1651 ok = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1652 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1653 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1654 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1655 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1656 fputs("FORBIDDENBYTE, as expected.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1657 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1658 fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1659 FORBIDDENBYTE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1660 for (i = SST-1; i >= 1; --i) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1661 const uchar byte = *(q-i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1662 fprintf(stderr, " at p-%d: 0x%02x", i, byte);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1663 if (byte != FORBIDDENBYTE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1664 fputs(" *** OUCH", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1665 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1666 }
23298
5a6be8fa8de2 _PyObject_DebugCheckAddress(): If the leading pad bytes are corrupt,
Tim Peters <tim.peters@gmail.com>
parents: 23159
diff changeset
1667
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1668 fputs(" Because memory is corrupted at the start, the "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1669 "count of bytes requested\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1670 " may be bogus, and checking the trailing pad "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1671 "bytes may segfault.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1672 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1673
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1674 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1675 fprintf(stderr, " The %d pad bytes at tail=%p are ", SST, tail);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1676 ok = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1677 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1678 if (tail[i] != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1679 ok = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1680 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1681 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1682 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1683 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1684 fputs("FORBIDDENBYTE, as expected.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1685 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1686 fprintf(stderr, "not all FORBIDDENBYTE (0x%02x):\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1687 FORBIDDENBYTE);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1688 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1689 const uchar byte = tail[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1690 fprintf(stderr, " at tail+%d: 0x%02x",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1691 i, byte);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1692 if (byte != FORBIDDENBYTE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1693 fputs(" *** OUCH", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1694 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1695 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1696 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1697
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1698 serial = read_size_t(tail + SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1699 fprintf(stderr, " The block was made by call #%" PY_FORMAT_SIZE_T
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1700 "u to debug malloc/realloc.\n", serial);
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1701
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1702 if (nbytes > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1703 i = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1704 fputs(" Data at p:", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1705 /* print up to 8 bytes at the start */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1706 while (q < tail && i < 8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1707 fprintf(stderr, " %02x", *q);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1708 ++i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1709 ++q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1710 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1711 /* and up to 8 at the end */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1712 if (q < tail) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1713 if (tail - q > 8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1714 fputs(" ...", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1715 q = tail - 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1716 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1717 while (q < tail) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1718 fprintf(stderr, " %02x", *q);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1719 ++q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1720 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1721 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1722 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1723 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1724 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1725
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1726 static size_t
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1727 printone(const char* msg, size_t value)
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1728 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1729 int i, k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1730 char buf[100];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1731 size_t origvalue = value;
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1732
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1733 fputs(msg, stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1734 for (i = (int)strlen(msg); i < 35; ++i)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1735 fputc(' ', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1736 fputc('=', stderr);
22860
04367cff8689 Minor improvements to the stats output dump, including adding commas to
Tim Peters <tim.peters@gmail.com>
parents: 22838
diff changeset
1737
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1738 /* Write the value with commas. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1739 i = 22;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1740 buf[i--] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1741 buf[i--] = '\n';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1742 k = 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1743 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1744 size_t nextvalue = value / 10;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1745 uint digit = (uint)(value - nextvalue * 10);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1746 value = nextvalue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1747 buf[i--] = (char)(digit + '0');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1748 --k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1749 if (k == 0 && value && i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1750 k = 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1751 buf[i--] = ',';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1752 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1753 } while (value && i >= 0);
22860
04367cff8689 Minor improvements to the stats output dump, including adding commas to
Tim Peters <tim.peters@gmail.com>
parents: 22838
diff changeset
1754
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1755 while (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1756 buf[i--] = ' ';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1757 fputs(buf, stderr);
22860
04367cff8689 Minor improvements to the stats output dump, including adding commas to
Tim Peters <tim.peters@gmail.com>
parents: 22838
diff changeset
1758
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1759 return origvalue;
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1760 }
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1761
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1762 /* Print summary info to stderr about the state of pymalloc's structures.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1763 * In Py_DEBUG mode, also perform some expensive internal consistency
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1764 * checks.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1765 */
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1766 void
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
1767 _PyObject_DebugMallocStats(void)
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1768 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1769 uint i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1770 const uint numclasses = SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1771 /* # of pools, allocated blocks, and free blocks per class index */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1772 size_t numpools[SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1773 size_t numblocks[SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1774 size_t numfreeblocks[SMALL_REQUEST_THRESHOLD >> ALIGNMENT_SHIFT];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1775 /* total # of allocated bytes in used and full pools */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1776 size_t allocated_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1777 /* total # of available bytes in used pools */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1778 size_t available_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1779 /* # of free pools + pools not yet carved out of current arena */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1780 uint numfreepools = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1781 /* # of bytes for arena alignment padding */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1782 size_t arena_alignment = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1783 /* # of bytes in used and full pools used for pool_headers */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1784 size_t pool_header_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1785 /* # of bytes in used and full pools wasted due to quantization,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1786 * i.e. the necessarily leftover space at the ends of used and
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1787 * full pools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1788 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1789 size_t quantization = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1790 /* # of arenas actually allocated. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1791 size_t narenas = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1792 /* running total -- should equal narenas * ARENA_SIZE */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1793 size_t total;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1794 char buf[128];
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1795
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1796 fprintf(stderr, "Small block threshold = %d, in %u size classes.\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1797 SMALL_REQUEST_THRESHOLD, numclasses);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1798
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1799 for (i = 0; i < numclasses; ++i)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1800 numpools[i] = numblocks[i] = numfreeblocks[i] = 0;
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1801
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1802 /* Because full pools aren't linked to from anything, it's easiest
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1803 * to march over all the arenas. If we're lucky, most of the memory
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1804 * will be living in full pools -- would be a shame to miss them.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1805 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1806 for (i = 0; i < maxarenas; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1807 uint j;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1808 uptr base = arenas[i].address;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1809
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1810 /* Skip arenas which are not allocated. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1811 if (arenas[i].address == (uptr)NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1812 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1813 narenas += 1;
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1814
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1815 numfreepools += arenas[i].nfreepools;
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1816
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1817 /* round up to pool alignment */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1818 if (base & (uptr)POOL_SIZE_MASK) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1819 arena_alignment += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1820 base &= ~(uptr)POOL_SIZE_MASK;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1821 base += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1822 }
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1823
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1824 /* visit every pool in the arena */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1825 assert(base <= (uptr) arenas[i].pool_address);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1826 for (j = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1827 base < (uptr) arenas[i].pool_address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1828 ++j, base += POOL_SIZE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1829 poolp p = (poolp)base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1830 const uint sz = p->szidx;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1831 uint freeblocks;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1832
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1833 if (p->ref.count == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1834 /* currently unused */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1835 assert(pool_is_in_list(p, arenas[i].freepools));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1836 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1837 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1838 ++numpools[sz];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1839 numblocks[sz] += p->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1840 freeblocks = NUMBLOCKS(sz) - p->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1841 numfreeblocks[sz] += freeblocks;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1842 #ifdef Py_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1843 if (freeblocks > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1844 assert(pool_is_in_list(p, usedpools[sz + sz]));
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1845 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1846 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1847 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1848 assert(narenas == narenas_currently_allocated);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1849
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1850 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1851 fputs("class size num pools blocks in use avail blocks\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1852 "----- ---- --------- ------------- ------------\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1853 stderr);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1854
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1855 for (i = 0; i < numclasses; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1856 size_t p = numpools[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1857 size_t b = numblocks[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1858 size_t f = numfreeblocks[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1859 uint size = INDEX2SIZE(i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1860 if (p == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1861 assert(b == 0 && f == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1862 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1863 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1864 fprintf(stderr, "%5u %6u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1865 "%11" PY_FORMAT_SIZE_T "u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1866 "%15" PY_FORMAT_SIZE_T "u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1867 "%13" PY_FORMAT_SIZE_T "u\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1868 i, size, p, b, f);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1869 allocated_bytes += b * size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1870 available_bytes += f * size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1871 pool_header_bytes += p * POOL_OVERHEAD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1872 quantization += p * ((POOL_SIZE - POOL_OVERHEAD) % size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1873 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1874 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1875 (void)printone("# times object malloc called", serialno);
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1876
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1877 (void)printone("# arenas allocated total", ntimes_arena_allocated);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1878 (void)printone("# arenas reclaimed", ntimes_arena_allocated - narenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1879 (void)printone("# arenas highwater mark", narenas_highwater);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1880 (void)printone("# arenas allocated current", narenas);
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1881
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1882 PyOS_snprintf(buf, sizeof(buf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1883 "%" PY_FORMAT_SIZE_T "u arenas * %d bytes/arena",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1884 narenas, ARENA_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1885 (void)printone(buf, narenas * ARENA_SIZE);
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1886
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1887 fputc('\n', stderr);
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1888
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1889 total = printone("# bytes in allocated blocks", allocated_bytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1890 total += printone("# bytes in available blocks", available_bytes);
22860
04367cff8689 Minor improvements to the stats output dump, including adding commas to
Tim Peters <tim.peters@gmail.com>
parents: 22838
diff changeset
1891
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1892 PyOS_snprintf(buf, sizeof(buf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1893 "%u unused pools * %d bytes", numfreepools, POOL_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1894 total += printone(buf, (size_t)numfreepools * POOL_SIZE);
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1895
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1896 total += printone("# bytes lost to pool headers", pool_header_bytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1897 total += printone("# bytes lost to quantization", quantization);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1898 total += printone("# bytes lost to arena alignment", arena_alignment);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1899 (void)printone("Total", total);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1900 }
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1901
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1902 #endif /* PYMALLOC_DEBUG */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1903
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1904 #ifdef Py_USING_MEMORY_DEBUGGER
37875
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1905 /* Make this function last so gcc won't inline it since the definition is
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1906 * after the reference.
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
1907 */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1908 int
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1909 Py_ADDRESS_IN_RANGE(void *P, poolp pool)
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1910 {
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1911 uint arenaindex_temp = pool->arenaindex;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1912
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1913 return arenaindex_temp < maxarenas &&
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1914 (uptr)P - arenas[arenaindex_temp].address < (uptr)ARENA_SIZE &&
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1915 arenas[arenaindex_temp].address != 0;
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1916 }
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1917 #endif