annotate Objects/obmalloc.c @ 73798:6cde416ef03b

Credit Per Øyvind Karlsen for the initial implementation of the lzma module (issue #6715).
author Nadeem Vawda <nadeem.vawda@gmail.com>
date Thu, 01 Dec 2011 01:18:27 +0200
parents e7aa72e6aad4
children ba8f85e16dd9
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 */
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
543
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
544 #ifdef PYMALLOC_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
545 if (Py_GETENV("PYTHONMALLOCSTATS"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
546 _PyObject_DebugMallocStats();
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
547 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
548 if (unused_arena_objects == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
549 uint i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
550 uint numarenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
551 size_t nbytes;
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
552
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
553 /* 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
554 * 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
555 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
556 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
557 if (numarenas <= maxarenas)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
558 return NULL; /* overflow */
49145
96d6276d80e2 Merged revisions 66383 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48825
diff changeset
559 #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
560 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
561 return NULL; /* overflow */
49145
96d6276d80e2 Merged revisions 66383 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48825
diff changeset
562 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
563 nbytes = numarenas * sizeof(*arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
564 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
565 if (arenaobj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
566 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
567 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
568
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
569 /* 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
570 * 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
571 * 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
572 * 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
573 * 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
574 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
575 assert(usable_arenas == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
576 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
577
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
578 /* 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
579 for (i = maxarenas; i < numarenas; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
580 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
581 arenas[i].nextarena = i < numarenas - 1 ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
582 &arenas[i+1] : NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
583 }
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
584
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
585 /* Update globals. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
586 unused_arena_objects = &arenas[maxarenas];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
587 maxarenas = numarenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
588 }
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
589
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
590 /* 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
591 assert(unused_arena_objects != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
592 arenaobj = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
593 unused_arena_objects = arenaobj->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
594 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
595 #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
596 arenaobj->address = (uptr)mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
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 MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
e7aa72e6aad4 Better resolution for issue #11849: Ensure that free()d memory arenas are really released
Antoine Pitrou <solipsis@pitrou.net>
parents: 69805
diff changeset
598 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
599 arenaobj->address = (uptr)malloc(ARENA_SIZE);
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
600 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
601 if (arenaobj->address == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
602 /* 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
603 * arenaobj back.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
604 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
605 arenaobj->nextarena = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
606 unused_arena_objects = arenaobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
607 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
608 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
609
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
610 ++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
611 #ifdef PYMALLOC_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
612 ++ntimes_arena_allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
613 if (narenas_currently_allocated > narenas_highwater)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
614 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
615 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
616 arenaobj->freepools = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
617 /* 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
618 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
619 arenaobj->pool_address = (block*)arenaobj->address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
620 arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
621 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
622 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
623 if (excess != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
624 --arenaobj->nfreepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
625 arenaobj->pool_address += POOL_SIZE - excess;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
626 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
627 arenaobj->ntotalpools = arenaobj->nfreepools;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
628
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
629 return arenaobj;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
630 }
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
631
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
632 /*
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
633 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
634
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
635 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
636 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
637 (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
638 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
639 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
640 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
641
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 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
643 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
644
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
645 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
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 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
648
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
649 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
650
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 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
652
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 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
654 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
655 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
656 (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
657 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
658
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 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
660 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
661 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
662 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
663 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
664 (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
665 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
666
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 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
668 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
669 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
670 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
671 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
672
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 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
674 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
675 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
676 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
677 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
678
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 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
680 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
681 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
682
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
683 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
684
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 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
686 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
687 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
688 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
689 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
690 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
691
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 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
693 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
694 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
695 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
696 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
697
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 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
699 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
700 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
701 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
702 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
703 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
704 extremely desirable that it be this fast.
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
705
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
706 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
707 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
708 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
709 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
710 (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
711 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
712 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
713 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
714 #define Py_ADDRESS_IN_RANGE(P, POOL) \
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
715 ((arenaindex_temp = (POOL)->arenaindex) < maxarenas && \
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
716 (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
717 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
718
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
719
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
720 /* 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
721 * 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
722 *
49294
091a6c5227a9 Merged revisions 66616 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 49145
diff changeset
723 #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
724 */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
725
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
726 #ifdef Py_USING_MEMORY_DEBUGGER
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
727
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
728 /* 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
729 * 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
730 * 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
731 * 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
732 * 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
733 *
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
734 * 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
735 */
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
736
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
737 #undef Py_ADDRESS_IN_RANGE
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
738
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
739 #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
740 (__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
741 #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
742 #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
743 #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
744 #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
745
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 /* 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
747 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
748 #undef Py_NO_INLINE
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
749 #endif
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
750
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
751 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
752
22794
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
753 /* 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
754 * 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
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 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
758 * 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
759 * 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
760 * 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
761 * 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
762 * 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
763 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
764
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
765 #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
766 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
767 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
768 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
769 block *bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
770 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
771 poolp next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
772 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
773
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
774 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
775 if (UNLIKELY(running_on_valgrind == -1))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
776 running_on_valgrind = RUNNING_ON_VALGRIND;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
777 if (UNLIKELY(running_on_valgrind))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
778 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
779 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
780
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
781 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
782 * 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
783 * 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
784 * 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
785 * 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
786 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
787 if (nbytes > PY_SSIZE_T_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
788 return NULL;
48565
887ee6bd9284 Merged revisions 65182 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48330
diff changeset
789
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
790 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
791 * This implicitly redirects malloc(0).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
792 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
793 if ((nbytes - 1) < SMALL_REQUEST_THRESHOLD) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
794 LOCK();
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 * Most frequent paths first
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 size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
799 pool = usedpools[size + size];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
800 if (pool != pool->nextpool) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
801 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
802 * 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
803 * 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
804 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
805 ++pool->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
806 bp = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
807 assert(bp != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
808 if ((pool->freeblock = *(block **)bp) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
809 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
810 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
811 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
812 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
813 * 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
814 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
815 if (pool->nextoffset <= pool->maxnextoffset) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
816 /* There is room for another block. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
817 pool->freeblock = (block*)pool +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
818 pool->nextoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
819 pool->nextoffset += INDEX2SIZE(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
820 *(block **)(pool->freeblock) = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
821 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
822 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
823 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
824 /* 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
825 next = pool->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
826 pool = pool->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
827 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
828 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
829 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
830 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
831 }
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
832
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
833 /* 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
834 * available: use a free pool.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
835 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
836 if (usable_arenas == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
837 /* 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
838 #ifdef WITH_MEMORY_LIMITS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
839 if (narenas_currently_allocated >= MAX_ARENAS) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
840 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
841 goto redirect;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
842 }
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 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
844 usable_arenas = new_arena();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
845 if (usable_arenas == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
846 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
847 goto redirect;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
848 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
849 usable_arenas->nextarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
850 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
851 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
852 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
853
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
854 /* 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
855 pool = usable_arenas->freepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
856 if (pool != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
857 /* Unlink from cached pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
858 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
859
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
860 /* 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
861 * 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
862 * 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
863 * 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
864 * 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
865 * arena_object from usable_arenas.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
866 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
867 --usable_arenas->nfreepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
868 if (usable_arenas->nfreepools == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
869 /* Wholly allocated: remove. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
870 assert(usable_arenas->freepools == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
871 assert(usable_arenas->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
872 usable_arenas->nextarena->prevarena ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
873 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
874
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
875 usable_arenas = usable_arenas->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
876 if (usable_arenas != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
877 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
878 assert(usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
879 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
880 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
881 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
882 /* 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
883 * 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
884 * 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
885 * time.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
886 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
887 assert(usable_arenas->freepools != NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
888 usable_arenas->pool_address <=
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
889 (block*)usable_arenas->address +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
890 ARENA_SIZE - POOL_SIZE);
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 init_pool:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
893 /* Frontlink to used pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
894 next = usedpools[size + size]; /* == prev */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
895 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
896 pool->prevpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
897 next->nextpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
898 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
899 pool->ref.count = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
900 if (pool->szidx == size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
901 /* Luckily, this pool last contained blocks
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
902 * 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
903 * and free list are already initialized.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
904 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
905 bp = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
906 pool->freeblock = *(block **)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
907 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
908 return (void *)bp;
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 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
911 * 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
912 * 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
913 * block.
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 pool->szidx = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
916 size = INDEX2SIZE(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
917 bp = (block *)pool + POOL_OVERHEAD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
918 pool->nextoffset = POOL_OVERHEAD + (size << 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
919 pool->maxnextoffset = POOL_SIZE - size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
920 pool->freeblock = bp + size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
921 *(block **)(pool->freeblock) = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
922 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
923 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
924 }
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
925
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
926 /* Carve off a new pool. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
927 assert(usable_arenas->nfreepools > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
928 assert(usable_arenas->freepools == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
929 pool = (poolp)usable_arenas->pool_address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
930 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
931 ARENA_SIZE - POOL_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
932 pool->arenaindex = usable_arenas - arenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
933 assert(&arenas[pool->arenaindex] == usable_arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
934 pool->szidx = DUMMY_SIZE_IDX;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
935 usable_arenas->pool_address += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
936 --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
937
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
938 if (usable_arenas->nfreepools == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
939 assert(usable_arenas->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
940 usable_arenas->nextarena->prevarena ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
941 usable_arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
942 /* 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
943 usable_arenas = usable_arenas->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
944 if (usable_arenas != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
945 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
946 assert(usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
947 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
948 }
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
949
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
950 goto init_pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
951 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
952
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
953 /* 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
954
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
955 redirect:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
956 /* 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
957 * 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
958 * 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
959 * has been reached.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
960 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
961 if (nbytes == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
962 nbytes = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
963 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
964 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
965
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
966 /* free */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
967
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
968 #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
969 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
970 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
971 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
972 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
973 block *lastfree;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
974 poolp next, prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
975 uint size;
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
976 #ifndef Py_USING_MEMORY_DEBUGGER
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
977 uint arenaindex_temp;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
978 #endif
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
979
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
980 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
981 return;
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
982
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
983 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
984 if (UNLIKELY(running_on_valgrind > 0))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
985 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
986 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
987
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
988 pool = POOL_ADDR(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
989 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
990 /* We allocated this address. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
991 LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
992 /* 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
993 * 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
994 * 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
995 * 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
996 * list in any case).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
997 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
998 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
999 *(block **)p = lastfree = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1000 pool->freeblock = (block *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1001 if (lastfree) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1002 struct arena_object* ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1003 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
1004
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1005 /* 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
1006 * 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
1007 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1008 if (--pool->ref.count != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1009 /* 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
1010 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1011 return;
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 /* 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
1014 * 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
1015 * 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
1016 * (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
1017 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1018 next = pool->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1019 prev = pool->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1020 next->prevpool = prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1021 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
1022
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1023 /* 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
1024 * 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
1025 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1026 ao = &arenas[pool->arenaindex];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1027 pool->nextpool = ao->freepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1028 ao->freepools = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1029 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
1030
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1031 /* 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
1032 * 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
1033 * 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
1034 * the system free().
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1035 * 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
1036 * 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
1037 * 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
1038 * 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
1039 * 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
1040 * nfreepools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1041 * 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
1042 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1043 if (nf == ao->ntotalpools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1044 /* 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
1045 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1046 assert(ao->prevarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1047 ao->prevarena->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1048 assert(ao ->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1049 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
1050
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1051 /* 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
1052 * usable_arenas pointer.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1053 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1054 if (ao->prevarena == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1055 usable_arenas = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1056 assert(usable_arenas == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1057 usable_arenas->address != 0);
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 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1060 assert(ao->prevarena->nextarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1061 ao->prevarena->nextarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1062 ao->nextarena;
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 /* Fix the pointer in the nextarena. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1065 if (ao->nextarena != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1066 assert(ao->nextarena->prevarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1067 ao->nextarena->prevarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1068 ao->prevarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1069 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1070 /* 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
1071 * available to be reused.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1072 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1073 ao->nextarena = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1074 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
1075
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1076 /* 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
1077 #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
1078 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
1079 #else
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1080 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
1081 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1082 ao->address = 0; /* mark unassociated */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1083 --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
1084
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1085 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1086 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1087 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1088 if (nf == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1089 /* 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
1090 * usable_arenas. Note that because
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1091 * 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
1092 * currently on the usable_arenas list.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1093 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1094 ao->nextarena = usable_arenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1095 ao->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1096 if (usable_arenas)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1097 usable_arenas->prevarena = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1098 usable_arenas = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1099 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
1100
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1101 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1102 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1103 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1104 /* 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
1105 * 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
1106 * 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
1107 * 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
1108 * 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
1109 * 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
1110 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1111 if (ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1112 nf <= ao->nextarena->nfreepools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1113 /* Case 4. Nothing to do. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1114 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1115 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1116 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1117 /* 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
1118 * 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
1119 * the arena to its right.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1120 * First unlink ao from usable_arenas.
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 if (ao->prevarena != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1123 /* 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
1124 assert(ao->prevarena->nextarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1125 ao->prevarena->nextarena = ao->nextarena;
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 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1128 /* 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
1129 assert(usable_arenas == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1130 usable_arenas = 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 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
1133
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1134 /* 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
1135 * the list, using our nextarena pointer.
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 while (ao->nextarena != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1138 nf > ao->nextarena->nfreepools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1139 ao->prevarena = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1140 ao->nextarena = ao->nextarena->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1141 }
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
1142
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1143 /* Insert ao at this point. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1144 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1145 ao->prevarena == ao->nextarena->prevarena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1146 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
1147
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1148 ao->prevarena->nextarena = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1149 if (ao->nextarena != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1150 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
1151
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1152 /* Verify that the swaps worked. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1153 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1154 nf <= ao->nextarena->nfreepools);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1155 assert(ao->prevarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1156 nf > ao->prevarena->nfreepools);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1157 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1158 ao->nextarena->prevarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1159 assert((usable_arenas == ao &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1160 ao->prevarena == NULL) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1161 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
1162
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1163 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1164 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1165 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1166 /* 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
1167 * 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
1168 * 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
1169 * 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
1170 * blocks of the same size class.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1171 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1172 --pool->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1173 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
1174 size = pool->szidx;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1175 next = usedpools[size + size];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1176 prev = next->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1177 /* 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
1178 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1179 pool->prevpool = prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1180 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1181 prev->nextpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1182 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1183 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1184 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1185
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1186 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1187 redirect:
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1188 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1189 /* We didn't allocate this address. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1190 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
1191 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1192
22794
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
1193 /* 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
1194 * 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
1195 * 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
1196 */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1197
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1198 #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
1199 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1200 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
1201 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1202 void *bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1203 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1204 size_t size;
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1205 #ifndef Py_USING_MEMORY_DEBUGGER
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1206 uint arenaindex_temp;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1207 #endif
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1208
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1209 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1210 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
1211
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1212 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1213 * 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
1214 * 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
1215 * 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
1216 * 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
1217 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1218 if (nbytes > PY_SSIZE_T_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1219 return NULL;
48565
887ee6bd9284 Merged revisions 65182 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48330
diff changeset
1220
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1221 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1222 /* 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
1223 if (UNLIKELY(running_on_valgrind > 0))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1224 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1225 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1226
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1227 pool = POOL_ADDR(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1228 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
1229 /* 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
1230 size = INDEX2SIZE(pool->szidx);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1231 if (nbytes <= size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1232 /* 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
1233 * 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
1234 * 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
1235 * 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
1236 * 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
1237 * 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
1238 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1239 if (4 * nbytes > 3 * size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1240 /* It's the same,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1241 * 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
1242 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1243 return p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1244 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1245 size = nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1246 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1247 bp = PyObject_Malloc(nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1248 if (bp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1249 memcpy(bp, p, size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1250 PyObject_Free(p);
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 return bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1253 }
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1254 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1255 redirect:
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1256 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1257 /* 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
1258 * 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
1259 * 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
1260 * 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
1261 * 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
1262 * 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
1263 * 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
1264 * 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
1265 * 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
1266 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1267 if (nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1268 return realloc(p, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1269 /* 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
1270 * 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
1271 * 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
1272 * 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
1273 * return NULL.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1274 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1275 bp = realloc(p, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1276 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
1277 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1278
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1279 #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
1280
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1281 /*==========================================================================*/
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1282 /* 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
1283 * 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
1284
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
1285 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1286 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
1287 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1288 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
1289 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1290
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
1291 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1292 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
1293 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1294 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
1295 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1296
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1297 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1298 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
1299 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1300 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
1301 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1302 #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
1303
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1304 #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
1305 /*==========================================================================*/
22484
ffcb2fd2947e Minor code cleanup -- no semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 22479
diff changeset
1306 /* 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
1307 * 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
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
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1310 /* 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
1311 * 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
1312 * 7-bit ASCII.
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1313 */
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1314 #undef CLEANBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1315 #undef DEADBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1316 #undef FORBIDDENBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1317 #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
1318 #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
1319 #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
1320
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1321 /* 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
1322 #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
1323 #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
1324
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1325 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
1326
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1327 /* 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
1328 * 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
1329 */
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1330 static void
22631
7870fac049f7 Add missing "void" to function.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22614
diff changeset
1331 bumpserialno(void)
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1332 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1333 ++serialno;
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1334 }
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1335
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1336 #define SST SIZEOF_SIZE_T
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1337
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1338 /* 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
1339 static size_t
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1340 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
1341 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1342 const uchar *q = (const uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1343 size_t result = *q++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1344 int i;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1345
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1346 for (i = SST; --i > 0; ++q)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1347 result = (result << 8) | *q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1348 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
1349 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1350
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1351 /* 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
1352 * p + sizeof(size_t) - 1.
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1353 */
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 static void
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1355 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
1356 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1357 uchar *q = (uchar *)p + SST - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1358 int i;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1359
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1360 for (i = SST; --i >= 0; --q) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1361 *q = (uchar)(n & 0xff);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1362 n >>= 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1363 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1364 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1365
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1366 #ifdef Py_DEBUG
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1367 /* 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
1368 * 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
1369 * list, else 0.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1370 */
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1371 static int
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1372 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
1373 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1374 poolp origlist = list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1375 assert(target != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1376 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1377 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1378 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1379 if (target == list)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1380 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1381 list = list->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1382 } while (list != NULL && list != origlist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1383 return 0;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1384 }
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1385
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1386 #else
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1387 #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
1388
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1389 #endif /* Py_DEBUG */
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1390
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1391 /* 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
1392 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
1393
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1394 p[0: S]
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1395 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
1396 to read in a memory dump).
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1397 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
1398 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
1399 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
1400 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
1401 Used to catch reference to uninitialized memory.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1402 &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
1403 handled the request itself.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1404 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
1405 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
1406 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
1407 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
1408 and _PyObject_DebugRealloc.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1409 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
1410 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
1411 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
1412 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
1413 */
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1414
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1415 /* 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
1416 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1417 _PyMem_DebugMalloc(size_t nbytes)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1418 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1419 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
1420 }
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_DebugRealloc(void *p, 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_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
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_DebugFree(void *p)
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 _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
1430 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1431
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1432 /* 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
1433 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1434 _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
1435 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1436 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
1437 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1438 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1439 _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
1440 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1441 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
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_DebugFree(void *p)
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 _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
1447 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1448 void
56258
d108fe77c06c merging revision 75106 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 56256
diff changeset
1449 _PyObject_DebugCheckAddress(const void *p)
56256
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_DebugCheckAddressApi(_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
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1454
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1455 /* 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
1456 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1457 _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
1458 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1459 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
1460 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
1461 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
1462
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1463 bumpserialno();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1464 total = nbytes + 4*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1465 if (total < nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1466 /* 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
1467 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
1468
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1469 p = (uchar *)PyObject_Malloc(total);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1470 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1471 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
1472
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1473 /* 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
1474 write_size_t(p, nbytes);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1475 p[SST] = (uchar)id;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1476 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
1477
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1478 if (nbytes > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1479 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
1480
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1481 /* 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
1482 tail = p + 2*SST + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1483 memset(tail, FORBIDDENBYTE, SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1484 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
1485
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1486 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
1487 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1488
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1489 /* 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
1490 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
1491 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
1492 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
1493 */
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1494 void
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1495 _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
1496 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1497 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
1498 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
1499
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1500 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1501 return;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1502 _PyObject_DebugCheckAddressApi(api, p);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1503 nbytes = read_size_t(q);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1504 nbytes += 4*SST;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1505 if (nbytes > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1506 memset(q, DEADBYTE, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1507 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
1508 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1509
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1510 void *
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1511 _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
1512 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1513 uchar *q = (uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1514 uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1515 size_t total; /* nbytes + 4*SST */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1516 size_t original_nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1517 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
1518
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1519 if (p == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1520 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
1521
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1522 _PyObject_DebugCheckAddressApi(api, p);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1523 bumpserialno();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1524 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
1525 total = nbytes + 4*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1526 if (total < nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1527 /* 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
1528 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
1529
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1530 if (nbytes < original_nbytes) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1531 /* 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
1532 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
1533 }
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
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1535 /* 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
1536 * 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
1537 * but we live with that.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1538 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1539 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
1540 if (q == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1541 return NULL;
22988
be54465a39c4 _PyObject_DebugRealloc(): rewritten to let the underlying realloc do
Tim Peters <tim.peters@gmail.com>
parents: 22987
diff changeset
1542
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1543 write_size_t(q, nbytes);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1544 assert(q[SST] == (uchar)api);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1545 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
1546 assert(q[SST + i] == FORBIDDENBYTE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1547 q += 2*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1548 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1549 memset(tail, FORBIDDENBYTE, SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1550 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
1551
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1552 if (nbytes > original_nbytes) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1553 /* growing: mark new extra memory clean */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1554 memset(q + original_nbytes, CLEANBYTE,
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1555 nbytes - original_nbytes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1556 }
22988
be54465a39c4 _PyObject_DebugRealloc(): rewritten to let the underlying realloc do
Tim Peters <tim.peters@gmail.com>
parents: 22987
diff changeset
1557
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1558 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
1559 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1560
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1561 /* 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
1562 * 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
1563 * 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
1564 * 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
1565 */
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1566 void
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1567 _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
1568 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1569 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
1570 char msgbuf[64];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1571 char *msg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1572 size_t nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1573 const uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1574 int i;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1575 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
1576
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1577 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1578 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
1579 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1580 }
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
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1582 /* Check the API id */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1583 id = (char)q[-SST];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1584 if (id != api) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1585 msg = msgbuf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1586 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
1587 msgbuf[sizeof(msgbuf)-1] = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1588 goto error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1589 }
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1590
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1591 /* 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
1592 * 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
1593 * 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
1594 */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1595 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
1596 if (*(q-i) != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1597 msg = "bad leading pad byte";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1598 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1599 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1600 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1601
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1602 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
1603 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1604 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1605 if (tail[i] != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1606 msg = "bad trailing pad byte";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1607 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1608 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1609 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1610
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1611 return;
22614
f294fdd18b5b PYMALLOC_DEBUG routines: The "check API family" gimmick was going nowhere
Tim Peters <tim.peters@gmail.com>
parents: 22487
diff changeset
1612
f294fdd18b5b PYMALLOC_DEBUG routines: The "check API family" gimmick was going nowhere
Tim Peters <tim.peters@gmail.com>
parents: 22487
diff changeset
1613 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1614 _PyObject_DebugDumpAddress(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1615 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
1616 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1617
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1618 /* 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
1619 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1620 _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
1621 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1622 const uchar *q = (const uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1623 const uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1624 size_t nbytes, serial;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1625 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1626 int ok;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1627 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
1628
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1629 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
1630 if (p == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1631 fprintf(stderr, "\n");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1632 return;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1633 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1634 id = (char)q[-SST];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1635 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
1636
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1637 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
1638 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
1639 "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
1640
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1641 /* 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
1642 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
1643 ok = 1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1644 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
1645 if (*(q-i) != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1646 ok = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1647 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1648 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1649 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1650 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1651 fputs("FORBIDDENBYTE, as expected.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1652 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1653 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
1654 FORBIDDENBYTE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1655 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
1656 const uchar byte = *(q-i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1657 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
1658 if (byte != FORBIDDENBYTE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1659 fputs(" *** OUCH", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1660 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1661 }
23298
5a6be8fa8de2 _PyObject_DebugCheckAddress(): If the leading pad bytes are corrupt,
Tim Peters <tim.peters@gmail.com>
parents: 23159
diff changeset
1662
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1663 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
1664 "count of bytes requested\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1665 " 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
1666 "bytes may segfault.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1667 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1668
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1669 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1670 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
1671 ok = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1672 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1673 if (tail[i] != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1674 ok = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1675 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1676 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1677 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1678 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1679 fputs("FORBIDDENBYTE, as expected.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1680 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1681 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
1682 FORBIDDENBYTE);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1683 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1684 const uchar byte = tail[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1685 fprintf(stderr, " at tail+%d: 0x%02x",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1686 i, byte);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1687 if (byte != FORBIDDENBYTE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1688 fputs(" *** OUCH", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1689 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1690 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1691 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1692
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1693 serial = read_size_t(tail + SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1694 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
1695 "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
1696
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1697 if (nbytes > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1698 i = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1699 fputs(" Data at p:", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1700 /* 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
1701 while (q < tail && i < 8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1702 fprintf(stderr, " %02x", *q);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1703 ++i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1704 ++q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1705 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1706 /* 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
1707 if (q < tail) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1708 if (tail - q > 8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1709 fputs(" ...", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1710 q = tail - 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1711 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1712 while (q < tail) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1713 fprintf(stderr, " %02x", *q);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1714 ++q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1715 }
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 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1718 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1719 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1720
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1721 static size_t
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1722 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
1723 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1724 int i, k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1725 char buf[100];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1726 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
1727
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1728 fputs(msg, stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1729 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
1730 fputc(' ', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1731 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
1732
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1733 /* Write the value with commas. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1734 i = 22;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1735 buf[i--] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1736 buf[i--] = '\n';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1737 k = 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1738 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1739 size_t nextvalue = value / 10;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1740 uint digit = (uint)(value - nextvalue * 10);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1741 value = nextvalue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1742 buf[i--] = (char)(digit + '0');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1743 --k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1744 if (k == 0 && value && i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1745 k = 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1746 buf[i--] = ',';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1747 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1748 } 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
1749
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1750 while (i >= 0)
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 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
1753
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1754 return origvalue;
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1755 }
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1756
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1757 /* 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
1758 * 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
1759 * checks.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1760 */
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1761 void
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
1762 _PyObject_DebugMallocStats(void)
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1763 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1764 uint i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1765 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
1766 /* # 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
1767 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
1768 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
1769 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
1770 /* 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
1771 size_t allocated_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1772 /* 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
1773 size_t available_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1774 /* # 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
1775 uint numfreepools = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1776 /* # of bytes for arena alignment padding */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1777 size_t arena_alignment = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1778 /* # 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
1779 size_t pool_header_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1780 /* # 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
1781 * 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
1782 * full pools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1783 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1784 size_t quantization = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1785 /* # of arenas actually allocated. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1786 size_t narenas = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1787 /* 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
1788 size_t total;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1789 char buf[128];
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1790
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1791 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
1792 SMALL_REQUEST_THRESHOLD, numclasses);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1793
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1794 for (i = 0; i < numclasses; ++i)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1795 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
1796
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1797 /* 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
1798 * 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
1799 * 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
1800 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1801 for (i = 0; i < maxarenas; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1802 uint j;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1803 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
1804
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1805 /* Skip arenas which are not allocated. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1806 if (arenas[i].address == (uptr)NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1807 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1808 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
1809
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1810 numfreepools += arenas[i].nfreepools;
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1811
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1812 /* round up to pool alignment */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1813 if (base & (uptr)POOL_SIZE_MASK) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1814 arena_alignment += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1815 base &= ~(uptr)POOL_SIZE_MASK;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1816 base += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1817 }
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1818
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1819 /* visit every pool in the arena */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1820 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
1821 for (j = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1822 base < (uptr) arenas[i].pool_address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1823 ++j, base += POOL_SIZE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1824 poolp p = (poolp)base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1825 const uint sz = p->szidx;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1826 uint freeblocks;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1827
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1828 if (p->ref.count == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1829 /* currently unused */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1830 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
1831 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1832 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1833 ++numpools[sz];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1834 numblocks[sz] += p->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1835 freeblocks = NUMBLOCKS(sz) - p->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1836 numfreeblocks[sz] += freeblocks;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1837 #ifdef Py_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1838 if (freeblocks > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1839 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
1840 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1841 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1842 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1843 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
1844
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1845 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1846 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
1847 "----- ---- --------- ------------- ------------\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1848 stderr);
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 for (i = 0; i < numclasses; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1851 size_t p = numpools[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1852 size_t b = numblocks[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1853 size_t f = numfreeblocks[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1854 uint size = INDEX2SIZE(i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1855 if (p == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1856 assert(b == 0 && f == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1857 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1858 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1859 fprintf(stderr, "%5u %6u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1860 "%11" PY_FORMAT_SIZE_T "u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1861 "%15" PY_FORMAT_SIZE_T "u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1862 "%13" PY_FORMAT_SIZE_T "u\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1863 i, size, p, b, f);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1864 allocated_bytes += b * size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1865 available_bytes += f * size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1866 pool_header_bytes += p * POOL_OVERHEAD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1867 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
1868 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1869 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1870 (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
1871
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1872 (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
1873 (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
1874 (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
1875 (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
1876
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1877 PyOS_snprintf(buf, sizeof(buf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1878 "%" 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
1879 narenas, ARENA_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1880 (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
1881
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1882 fputc('\n', stderr);
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1883
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1884 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
1885 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
1886
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1887 PyOS_snprintf(buf, sizeof(buf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1888 "%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
1889 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
1890
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1891 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
1892 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
1893 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
1894 (void)printone("Total", total);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1895 }
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1896
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1897 #endif /* PYMALLOC_DEBUG */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1898
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1899 #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
1900 /* 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
1901 * 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
1902 */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1903 int
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1904 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
1905 {
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1906 uint arenaindex_temp = pool->arenaindex;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1907
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1908 return arenaindex_temp < maxarenas &&
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1909 (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
1910 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
1911 }
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1912 #endif