annotate Objects/obmalloc.c @ 73807:1efefeda00a7 3.2

#8414: add more tests for "assert". Initial patch by Gregory Nofi.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 02 Dec 2011 18:22:52 +0200
parents 3c9232a684ae
children b39270c6b8d1
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
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
5 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
6 #include <valgrind/valgrind.h>
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
7
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
8 /* 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
9 the valgrind checks */
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
10 #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
11 # define UNLIKELY(value) __builtin_expect((value), 0)
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
12 #else
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
13 # define UNLIKELY(value) (value)
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
14 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
15
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
16 /* -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
17 static int running_on_valgrind = -1;
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
18 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
19
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
20 /* 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
21
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
22 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
23 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
24 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
25 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
26 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
27 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
28
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
29
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
30 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
31 _____ ______ ______ ________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
32 [ 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
33 +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
34 _______________________________ | |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
35 [ 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
36 +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
37 ______________________________________________________________ |
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
38 [ 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
39 +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
40 __________________________________________________________________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
41 [ 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
42 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
43
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 _______________________________________________________________________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
46 [ 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
47 -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
48 __________________________________ __________________________________
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
49 [ ] [ ]
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
50 -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
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 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
54
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
55 /* 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
56 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
57
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
58 /* 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
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 * "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
62 * 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
63 * 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
64 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
65 * (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
66 * "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
67 * 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
68 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
69
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
70 /* #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
71
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
72 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
73
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
74 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
75 * 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
76 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
77 * For small requests, the allocator sub-allocates <Big> blocks of memory.
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
78 * Requests greater than 256 bytes are routed to the system's allocator.
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
79 *
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
80 * 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
81 * 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
82 * 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
83 * 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
84 * 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
85 * 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
86 * 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
87 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
88 * 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
89 * 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
90 * 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
91 * 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
92 * 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
93 * 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
94 * 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
95 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
96 * 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
97 *
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
98 * 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
99 * ----------------------------------------------------------------
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
100 * 1-8 8 0
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
101 * 9-16 16 1
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
102 * 17-24 24 2
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
103 * 25-32 32 3
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
104 * 33-40 40 4
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
105 * 41-48 48 5
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
106 * 49-56 56 6
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
107 * 57-64 64 7
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
108 * 65-72 72 8
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
109 * ... ... ...
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
110 * 241-248 248 30
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
111 * 249-256 256 31
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
112 *
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
113 * 0, 257 and up: routed to the underlying allocator.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
114 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
115
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
116 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
117
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
118 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
119 * -- 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
120 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
121
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
122 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
123 * 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
124 * 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
125 * 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
126 * 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
127 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
128 * 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
129 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
130 #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
131 #define ALIGNMENT_SHIFT 3
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
132 #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
133
22836
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
134 /* 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
135 #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
136
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
137 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
138 * 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
139 * 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
140 * 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
141 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
142 * The following invariants must hold:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
143 * 1) ALIGNMENT <= SMALL_REQUEST_THRESHOLD <= 256
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
144 * 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
145 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
146 * 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
147 * 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
148 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
149 #define SMALL_REQUEST_THRESHOLD 256
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
150 #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
151
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
152 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
153 * 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
154 * 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
155 * 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
156 * 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
157 * 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
158 * size, then `POOL_ADDR(p)->arenaindex' could rarely cause a segmentation
8d0d395c211e Backport:
Georg Brandl <georg@python.org>
parents: 32279
diff changeset
159 * 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
160 * 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
161 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
162 #define SYSTEM_PAGE_SIZE (4 * 1024)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
163 #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
164
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
165 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
166 * 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
167 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
168 #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
169 #ifndef SMALL_MEMORY_LIMIT
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
170 #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
171 #endif
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
172 #endif
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
173
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
174 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
175 * 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
176 * on a page boundary. This is a reserved virtual address space for the
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
177 * current process (obtained through a malloc call). In no way this means
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
178 * that the memory arenas will be used entirely. A malloc(<Big>) is usually
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
179 * an address range reservation for <Big> bytes, unless all pages within this
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
180 * space are referenced subsequently. So malloc'ing big blocks and not using
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
181 * them does not mean "wasting memory". It's an addressable range wastage...
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
182 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
183 * Therefore, allocating arenas with malloc is not optimal, because there is
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
184 * some address space wastage, but this is the most portable way to request
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
185 * memory from the system across various platforms.
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
186 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
187 #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
188
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
189 #ifdef WITH_MEMORY_LIMITS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
190 #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
191 #endif
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
192
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
193 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
194 * 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
195 * 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
196 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
197 #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
198 #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
199
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 * -- 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
202 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
203
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 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
207 * Locking
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
208 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
209 * 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
210 * 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
211 * 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
212 * 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
213 *
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
214 * 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
215 * 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
216 * 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
217 * 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
218 * 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
219 */
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 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
222 * 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
223 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
224 #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
225 #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
226 #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
227 #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
228 #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
229
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
230 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
231 * Basic types
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
232 * 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
233 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
234 #undef uchar
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
235 #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
236
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
237 #undef uint
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
238 #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
239
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
240 #undef ulong
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
241 #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
242
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
243 #undef uptr
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
244 #define uptr Py_uintptr_t
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
245
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
246 /* 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
247 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
248
22836
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
249 /* 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
250 struct pool_header {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
251 union { block *_padding;
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
252 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
253 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
254 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
255 struct pool_header *prevpool; /* previous pool "" */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
256 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
257 uint szidx; /* block size class index */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
258 uint nextoffset; /* bytes to virgin block */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
259 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
260 };
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
261
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
262 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
263
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
264 /* 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
265 struct arena_object {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
266 /* 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
267 * 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
268 * 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
269 * allocated arena.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
270 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
271 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
272
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
273 /* 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
274 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
275
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
276 /* 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
277 * allocated pools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
278 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
279 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
280
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
281 /* 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
282 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
283
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
284 /* Singly-linked list of available pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
285 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
286
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
287 /* 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
288 * 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
289 * 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
290 * 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
291 *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
292 * 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
293 * 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
294 * 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
295 * increasing order of `nfreepools` values.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
296 *
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
297 * 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
298 * 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
299 * are both meaningless in this case.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
300 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
301 struct arena_object* nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
302 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
303 };
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
304
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
305 #undef ROUNDUP
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
306 #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
307 #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
308
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
309 #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
310
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
311 /* 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
312 #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
313
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
314 /* 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
315 #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
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 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
318
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
319 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
320 * 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
321 */
24294
0a08ed05bd42 Remove extraneous semicolon.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 24177
diff changeset
322 SIMPLELOCK_DECL(_malloc_lock)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
323 #define LOCK() SIMPLELOCK_LOCK(_malloc_lock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
324 #define UNLOCK() SIMPLELOCK_UNLOCK(_malloc_lock)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
325 #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
326 #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
327
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
328 /*
22697
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
329 * 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
330
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
331 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
332 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
333 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
334 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
335
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
336 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
337 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
338 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
339
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
340 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
341 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
342 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
343 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
344 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
345 needs space.
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
346 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
347 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
348 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
349 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
350 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
351 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
352
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
353 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
354 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
355 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
356 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
357 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
358 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
359 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
360
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
361 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
362 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
363 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
364 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
365 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
366 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
367 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
368 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
369
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
370
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
371 Block Management
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
372
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
373 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
374 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
375 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
376 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
377 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
378 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
379 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
380 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
381 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
382
f1f57bf09092 Widespread, but mostly in _PyMalloc_Malloc: optimize away all expensive
Tim Peters <tim.peters@gmail.com>
parents: 22795
diff changeset
383 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
384 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
385 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
386 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
387 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
388 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
389 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
390 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
391 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
392
22697
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
393
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
394 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
395 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
396 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
397 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
398
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
399 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
400
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
401 "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
402 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
403 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
404 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
405
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
406 union { block *_padding;
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
407 uint count; } ref;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
408 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
409
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
410 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
411 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
412 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
413 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
414
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
415 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
416 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
417 (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
418 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
419 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
420 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
421 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
422 **************************************************************************** */
6bb4386b1111 Added a long-overdue comment block giving an overview of pool operations
Tim Peters <tim.peters@gmail.com>
parents: 22692
diff changeset
423
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
424 #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
425 #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
426
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
427 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
428 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
429 #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
430 , 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
431 #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
432 , 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
433 #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
434 , 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
435 #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
436 , 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
437 #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
438 , 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
439 #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
440 , 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
441 #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
442 , PT(56), PT(57), PT(58), PT(59), PT(60), PT(61), PT(62), PT(63)
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
443 #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
444 #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
445 #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
446 #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
447 #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
448 #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
449 #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
450 };
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
451
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
452 /*==========================================================================
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
453 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
454
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
455 `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
456 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
457 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
458 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
459
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
460 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
461 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
462 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
463
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
464 unused_arena_objects
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
465
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
466 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
467 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
468 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
469 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
470 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
471
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 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
473
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 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
475 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
476 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
477 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
478 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
479 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
480 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
481 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
482
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 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
484 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
485 */
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 /* 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
488 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
489 /* 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
490 static uint maxarenas = 0;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
491
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
492 /* 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
493 * 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
494 */
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 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
496
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 /* 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
498 * 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
499 */
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 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
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 /* 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
503 * 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
504 * `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
505 */
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
506 #define INITIAL_ARENA_OBJECTS 16
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
507
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
508 /* 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
509 static size_t narenas_currently_allocated = 0;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
510
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
511 #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
512 /* 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
513 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
514 /* 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
515 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
516 #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
517
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 /* 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
519 * 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
520 * 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
521 * `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
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 static struct arena_object*
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
524 new_arena(void)
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
525 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
526 struct arena_object* arenaobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
527 uint excess; /* number of bytes above pool alignment */
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
528
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
529 #ifdef PYMALLOC_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
530 if (Py_GETENV("PYTHONMALLOCSTATS"))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
531 _PyObject_DebugMallocStats();
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
532 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
533 if (unused_arena_objects == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
534 uint i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
535 uint numarenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
536 size_t nbytes;
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
537
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
538 /* 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
539 * 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
540 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
541 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
542 if (numarenas <= maxarenas)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
543 return NULL; /* overflow */
49145
96d6276d80e2 Merged revisions 66383 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48825
diff changeset
544 #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
545 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
546 return NULL; /* overflow */
49145
96d6276d80e2 Merged revisions 66383 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 48825
diff changeset
547 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
548 nbytes = numarenas * sizeof(*arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
549 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
550 if (arenaobj == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
551 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
552 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
553
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
554 /* 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
555 * 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
556 * 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
557 * 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
558 * 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
559 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
560 assert(usable_arenas == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
561 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
562
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
563 /* 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
564 for (i = maxarenas; i < numarenas; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
565 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
566 arenas[i].nextarena = i < numarenas - 1 ?
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
567 &arenas[i+1] : NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
568 }
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
569
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
570 /* Update globals. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
571 unused_arena_objects = &arenas[maxarenas];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
572 maxarenas = numarenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
573 }
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
574
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
575 /* 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
576 assert(unused_arena_objects != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
577 arenaobj = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
578 unused_arena_objects = arenaobj->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
579 assert(arenaobj->address == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
580 arenaobj->address = (uptr)malloc(ARENA_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
581 if (arenaobj->address == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
582 /* 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
583 * arenaobj back.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
584 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
585 arenaobj->nextarena = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
586 unused_arena_objects = arenaobj;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
587 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
588 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
589
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
590 ++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
591 #ifdef PYMALLOC_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
592 ++ntimes_arena_allocated;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
593 if (narenas_currently_allocated > narenas_highwater)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
594 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
595 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
596 arenaobj->freepools = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
597 /* 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
598 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
599 arenaobj->pool_address = (block*)arenaobj->address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
600 arenaobj->nfreepools = ARENA_SIZE / POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
601 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
602 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
603 if (excess != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
604 --arenaobj->nfreepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
605 arenaobj->pool_address += POOL_SIZE - excess;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
606 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
607 arenaobj->ntotalpools = arenaobj->nfreepools;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
608
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
609 return arenaobj;
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
610 }
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
611
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
612 /*
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
613 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
614
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 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
616 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
617 (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
618 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
619 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
620 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
621
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
622 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
623 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
624
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
625 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
626
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
627 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
628
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
629 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
630
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
631 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
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 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
634 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
635 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
636 (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
637 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
638
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 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
640 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
641 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
642 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
643 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
644 (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
645 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
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 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
648 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
649 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
650 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
651 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
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 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
654 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
655 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
656 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
657 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
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 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
660 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
661 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
662
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
663 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
664
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 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
666 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
667 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
668 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
669 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
670 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
671
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
672 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
673 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
674 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
675 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
676 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
677
a4c70f3968be Merge part of the trunk changes into the p3yk branch. This merges from 43030
Thomas Wouters <thomas@python.org>
parents: 36514
diff changeset
678 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
679 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
680 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
681 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
682 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
683 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
684 extremely desirable that it be this fast.
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
685
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
686 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
687 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
688 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
689 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
690 (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
691 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
692 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
693 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
694 #define Py_ADDRESS_IN_RANGE(P, POOL) \
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
695 ((arenaindex_temp = (POOL)->arenaindex) < maxarenas && \
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
696 (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
697 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
698
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
699
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
700 /* 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
701 * 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
702 *
49294
091a6c5227a9 Merged revisions 66616 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 49145
diff changeset
703 #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
704 */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
705
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
706 #ifdef Py_USING_MEMORY_DEBUGGER
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
707
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
708 /* 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
709 * 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
710 * 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
711 * 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
712 * 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
713 *
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
714 * 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
715 */
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
716
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
717 #undef Py_ADDRESS_IN_RANGE
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
718
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 38673
diff changeset
719 #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
720 (__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
721 #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
722 #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
723 #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
724 #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
725
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
726 /* 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
727 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
728 #undef Py_NO_INLINE
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
729 #endif
22741
771b2a8d445d Restructured my pool-management overview in terms of the three
Tim Peters <tim.peters@gmail.com>
parents: 22724
diff changeset
730
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
731 /*==========================================================================*/
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
732
22794
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
733 /* 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
734 * 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
735 */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
736
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
737 /*
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
738 * 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
739 * 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
740 * 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
741 * 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
742 * 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
743 */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
744
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
745 #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
746 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
747 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
748 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
749 block *bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
750 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
751 poolp next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
752 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
753
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
754 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
755 if (UNLIKELY(running_on_valgrind == -1))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
756 running_on_valgrind = RUNNING_ON_VALGRIND;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
757 if (UNLIKELY(running_on_valgrind))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
758 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
759 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
760
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
761 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
762 * 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
763 * 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
764 * 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
765 * 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
766 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
767 if (nbytes > PY_SSIZE_T_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
768 return NULL;
48565
887ee6bd9284 Merged revisions 65182 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48330
diff changeset
769
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
770 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
771 * This implicitly redirects malloc(0).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
772 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
773 if ((nbytes - 1) < SMALL_REQUEST_THRESHOLD) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
774 LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
775 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
776 * Most frequent paths first
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
777 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
778 size = (uint)(nbytes - 1) >> ALIGNMENT_SHIFT;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
779 pool = usedpools[size + size];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
780 if (pool != pool->nextpool) {
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 * 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
783 * 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
784 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
785 ++pool->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
786 bp = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
787 assert(bp != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
788 if ((pool->freeblock = *(block **)bp) != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
789 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
790 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
791 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
792 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
793 * 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
794 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
795 if (pool->nextoffset <= pool->maxnextoffset) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
796 /* There is room for another block. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
797 pool->freeblock = (block*)pool +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
798 pool->nextoffset;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
799 pool->nextoffset += INDEX2SIZE(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
800 *(block **)(pool->freeblock) = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
801 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
802 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
803 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
804 /* 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
805 next = pool->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
806 pool = pool->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
807 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
808 pool->nextpool = next;
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 }
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
812
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
813 /* 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
814 * available: use a free pool.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
815 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
816 if (usable_arenas == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
817 /* 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
818 #ifdef WITH_MEMORY_LIMITS
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
819 if (narenas_currently_allocated >= MAX_ARENAS) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
820 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
821 goto redirect;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
822 }
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
823 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
824 usable_arenas = new_arena();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
825 if (usable_arenas == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
826 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
827 goto redirect;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
828 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
829 usable_arenas->nextarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
830 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
831 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
832 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
833
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
834 /* 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
835 pool = usable_arenas->freepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
836 if (pool != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
837 /* Unlink from cached pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
838 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
839
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
840 /* 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
841 * 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
842 * 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
843 * 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
844 * 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
845 * arena_object from usable_arenas.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
846 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
847 --usable_arenas->nfreepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
848 if (usable_arenas->nfreepools == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
849 /* Wholly allocated: remove. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
850 assert(usable_arenas->freepools == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
851 assert(usable_arenas->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
852 usable_arenas->nextarena->prevarena ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
853 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
854
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
855 usable_arenas = usable_arenas->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
856 if (usable_arenas != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
857 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
858 assert(usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
859 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
860 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
861 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
862 /* 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
863 * 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
864 * 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
865 * time.
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 assert(usable_arenas->freepools != NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
868 usable_arenas->pool_address <=
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
869 (block*)usable_arenas->address +
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
870 ARENA_SIZE - POOL_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
871 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
872 init_pool:
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
873 /* Frontlink to used pools. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
874 next = usedpools[size + size]; /* == prev */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
875 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
876 pool->prevpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
877 next->nextpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
878 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
879 pool->ref.count = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
880 if (pool->szidx == size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
881 /* Luckily, this pool last contained blocks
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
882 * 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
883 * and free list are already initialized.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
884 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
885 bp = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
886 pool->freeblock = *(block **)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
887 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
888 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
889 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
890 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
891 * 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
892 * 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
893 * block.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
894 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
895 pool->szidx = size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
896 size = INDEX2SIZE(size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
897 bp = (block *)pool + POOL_OVERHEAD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
898 pool->nextoffset = POOL_OVERHEAD + (size << 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
899 pool->maxnextoffset = POOL_SIZE - size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
900 pool->freeblock = bp + size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
901 *(block **)(pool->freeblock) = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
902 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
903 return (void *)bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
904 }
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
905
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
906 /* Carve off a new pool. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
907 assert(usable_arenas->nfreepools > 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
908 assert(usable_arenas->freepools == NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
909 pool = (poolp)usable_arenas->pool_address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
910 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
911 ARENA_SIZE - POOL_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
912 pool->arenaindex = usable_arenas - arenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
913 assert(&arenas[pool->arenaindex] == usable_arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
914 pool->szidx = DUMMY_SIZE_IDX;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
915 usable_arenas->pool_address += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
916 --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
917
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
918 if (usable_arenas->nfreepools == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
919 assert(usable_arenas->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
920 usable_arenas->nextarena->prevarena ==
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
921 usable_arenas);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
922 /* 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
923 usable_arenas = usable_arenas->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
924 if (usable_arenas != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
925 usable_arenas->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
926 assert(usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
927 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
928 }
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
929
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
930 goto init_pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
931 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
932
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
933 /* 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
934
22684
fd1b8ebe4eae Lots of changes:
Tim Peters <tim.peters@gmail.com>
parents: 22631
diff changeset
935 redirect:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
936 /* 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
937 * 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
938 * 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
939 * has been reached.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
940 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
941 if (nbytes == 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
942 nbytes = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
943 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
944 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
945
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
946 /* free */
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
947
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
948 #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
949 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
950 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
951 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
952 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
953 block *lastfree;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
954 poolp next, prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
955 uint size;
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
956 #ifndef Py_USING_MEMORY_DEBUGGER
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
957 uint arenaindex_temp;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
958 #endif
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
959
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
960 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
961 return;
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
962
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
963 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
964 if (UNLIKELY(running_on_valgrind > 0))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
965 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
966 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
967
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
968 pool = POOL_ADDR(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
969 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
970 /* We allocated this address. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
971 LOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
972 /* 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
973 * 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
974 * 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
975 * 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
976 * list in any case).
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
977 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
978 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
979 *(block **)p = lastfree = pool->freeblock;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
980 pool->freeblock = (block *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
981 if (lastfree) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
982 struct arena_object* ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
983 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
984
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
985 /* 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
986 * 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
987 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
988 if (--pool->ref.count != 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
989 /* 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
990 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
991 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
992 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
993 /* 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
994 * 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
995 * 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
996 * (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
997 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
998 next = pool->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
999 prev = pool->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1000 next->prevpool = prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1001 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
1002
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1003 /* 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
1004 * 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
1005 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1006 ao = &arenas[pool->arenaindex];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1007 pool->nextpool = ao->freepools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1008 ao->freepools = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1009 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
1010
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1011 /* 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
1012 * 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
1013 * 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
1014 * the system free().
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1015 * 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
1016 * 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
1017 * 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
1018 * 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
1019 * 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
1020 * nfreepools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1021 * 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
1022 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1023 if (nf == ao->ntotalpools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1024 /* 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
1025 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1026 assert(ao->prevarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1027 ao->prevarena->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1028 assert(ao ->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1029 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
1030
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1031 /* 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
1032 * usable_arenas pointer.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1033 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1034 if (ao->prevarena == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1035 usable_arenas = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1036 assert(usable_arenas == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1037 usable_arenas->address != 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1038 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1039 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1040 assert(ao->prevarena->nextarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1041 ao->prevarena->nextarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1042 ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1043 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1044 /* Fix the pointer in the nextarena. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1045 if (ao->nextarena != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1046 assert(ao->nextarena->prevarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1047 ao->nextarena->prevarena =
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1048 ao->prevarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1049 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1050 /* 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
1051 * available to be reused.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1052 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1053 ao->nextarena = unused_arena_objects;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1054 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
1055
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1056 /* Free the entire arena. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1057 free((void *)ao->address);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1058 ao->address = 0; /* mark unassociated */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1059 --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
1060
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1061 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1062 return;
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 if (nf == 1) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1065 /* 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
1066 * usable_arenas. Note that because
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1067 * 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
1068 * currently on the usable_arenas list.
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 ao->nextarena = usable_arenas;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1071 ao->prevarena = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1072 if (usable_arenas)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1073 usable_arenas->prevarena = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1074 usable_arenas = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1075 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
1076
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1077 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1078 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1079 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1080 /* 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
1081 * 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
1082 * 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
1083 * 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
1084 * 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
1085 * 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
1086 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1087 if (ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1088 nf <= ao->nextarena->nfreepools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1089 /* Case 4. Nothing to do. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1090 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1091 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1092 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1093 /* 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
1094 * 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
1095 * the arena to its right.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1096 * First unlink ao from usable_arenas.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1097 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1098 if (ao->prevarena != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1099 /* 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
1100 assert(ao->prevarena->nextarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1101 ao->prevarena->nextarena = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1102 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1103 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1104 /* 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
1105 assert(usable_arenas == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1106 usable_arenas = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1107 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1108 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
1109
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1110 /* 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
1111 * the list, using our nextarena pointer.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1112 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1113 while (ao->nextarena != NULL &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1114 nf > ao->nextarena->nfreepools) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1115 ao->prevarena = ao->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1116 ao->nextarena = ao->nextarena->nextarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1117 }
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
1118
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1119 /* Insert ao at this point. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1120 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1121 ao->prevarena == ao->nextarena->prevarena);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1122 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
1123
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1124 ao->prevarena->nextarena = ao;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1125 if (ao->nextarena != NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1126 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
1127
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1128 /* Verify that the swaps worked. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1129 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1130 nf <= ao->nextarena->nfreepools);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1131 assert(ao->prevarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1132 nf > ao->prevarena->nfreepools);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1133 assert(ao->nextarena == NULL ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1134 ao->nextarena->prevarena == ao);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1135 assert((usable_arenas == ao &&
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1136 ao->prevarena == NULL) ||
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1137 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
1138
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1139 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1140 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1141 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1142 /* 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
1143 * 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
1144 * 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
1145 * 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
1146 * blocks of the same size class.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1147 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1148 --pool->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1149 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
1150 size = pool->szidx;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1151 next = usedpools[size + size];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1152 prev = next->prevpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1153 /* 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
1154 pool->nextpool = next;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1155 pool->prevpool = prev;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1156 next->prevpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1157 prev->nextpool = pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1158 UNLOCK();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1159 return;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1160 }
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1161
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1162 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1163 redirect:
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1164 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1165 /* We didn't allocate this address. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1166 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
1167 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1168
22794
f663ffbe9e5c _PyMalloc_{Malloc, Realloc}: Strive to meet the doc's promises about
Tim Peters <tim.peters@gmail.com>
parents: 22743
diff changeset
1169 /* 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
1170 * 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
1171 * 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
1172 */
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1173
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1174 #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
1175 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1176 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
1177 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1178 void *bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1179 poolp pool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1180 size_t size;
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1181 #ifndef Py_USING_MEMORY_DEBUGGER
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1182 uint arenaindex_temp;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1183 #endif
16782
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1184
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1185 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1186 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
1187
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1188 /*
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1189 * 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
1190 * 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
1191 * 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
1192 * 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
1193 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1194 if (nbytes > PY_SSIZE_T_MAX)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1195 return NULL;
48565
887ee6bd9284 Merged revisions 65182 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48330
diff changeset
1196
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1197 #ifdef WITH_VALGRIND
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1198 /* 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
1199 if (UNLIKELY(running_on_valgrind > 0))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1200 goto redirect;
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1201 #endif
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1202
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1203 pool = POOL_ADDR(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1204 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
1205 /* 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
1206 size = INDEX2SIZE(pool->szidx);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1207 if (nbytes <= size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1208 /* 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
1209 * 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
1210 * 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
1211 * 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
1212 * 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
1213 * 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
1214 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1215 if (4 * nbytes > 3 * size) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1216 /* It's the same,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1217 * 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
1218 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1219 return p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1220 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1221 size = nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1222 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1223 bp = PyObject_Malloc(nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1224 if (bp != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1225 memcpy(bp, p, size);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1226 PyObject_Free(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1227 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1228 return bp;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1229 }
57547
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1230 #ifdef WITH_VALGRIND
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1231 redirect:
b79d0420c204 Merged revisions 76644 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 56258
diff changeset
1232 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1233 /* 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
1234 * 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
1235 * 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
1236 * 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
1237 * 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
1238 * 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
1239 * 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
1240 * 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
1241 * 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
1242 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1243 if (nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1244 return realloc(p, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1245 /* 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
1246 * 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
1247 * 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
1248 * 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
1249 * return NULL.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1250 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1251 bp = realloc(p, 1);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1252 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
1253 }
5864a9c58c81 Add Vladimir Marangozov's object allocator. It is disabled by default. This
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
diff changeset
1254
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1255 #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
1256
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1257 /*==========================================================================*/
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1258 /* 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
1259 * 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
1260
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
1261 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1262 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
1263 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1264 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
1265 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1266
22470
0e4758ccfe2b Just whitespace fiddling.
Tim Peters <tim.peters@gmail.com>
parents: 22469
diff changeset
1267 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1268 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
1269 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1270 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
1271 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1272
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1273 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1274 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
1275 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1276 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
1277 }
8d0061493c57 Build obmalloc.c directly instead of #include'ing from object.c.
Tim Peters <tim.peters@gmail.com>
parents: 22465
diff changeset
1278 #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
1279
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1280 #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
1281 /*==========================================================================*/
22484
ffcb2fd2947e Minor code cleanup -- no semantic changes.
Tim Peters <tim.peters@gmail.com>
parents: 22479
diff changeset
1282 /* 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
1283 * 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
1284 */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1285
22986
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1286 /* 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
1287 * 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
1288 * 7-bit ASCII.
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1289 */
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1290 #undef CLEANBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1291 #undef DEADBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1292 #undef FORBIDDENBYTE
298a7c51d2c0 PYMALLOC_{CLEAN, DEAD, FORBIDDEN}BYTE symbols: remove the PYMALLOC_
Tim Peters <tim.peters@gmail.com>
parents: 22983
diff changeset
1293 #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
1294 #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
1295 #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
1296
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1297 /* 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
1298 #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
1299 #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
1300
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1301 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
1302
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1303 /* 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
1304 * 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
1305 */
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1306 static void
22631
7870fac049f7 Add missing "void" to function.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22614
diff changeset
1307 bumpserialno(void)
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1308 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1309 ++serialno;
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1310 }
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1311
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1312 #define SST SIZEOF_SIZE_T
22487
f02cdb2bc17a _PyMalloc_DebugRealloc(): simplify decl of "fresh".
Tim Peters <tim.peters@gmail.com>
parents: 22484
diff changeset
1313
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1314 /* 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
1315 static size_t
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1316 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
1317 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1318 const uchar *q = (const uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1319 size_t result = *q++;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1320 int i;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1321
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1322 for (i = SST; --i > 0; ++q)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1323 result = (result << 8) | *q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1324 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
1325 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1326
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1327 /* 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
1328 * p + sizeof(size_t) - 1.
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1329 */
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1330 static void
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1331 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
1332 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1333 uchar *q = (uchar *)p + SST - 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1334 int i;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1335
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1336 for (i = SST; --i >= 0; --q) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1337 *q = (uchar)(n & 0xff);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1338 n >>= 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1339 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1340 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1341
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1342 #ifdef Py_DEBUG
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1343 /* 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
1344 * 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
1345 * list, else 0.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1346 */
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1347 static int
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1348 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
1349 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1350 poolp origlist = list;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1351 assert(target != NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1352 if (list == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1353 return 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1354 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1355 if (target == list)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1356 return 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1357 list = list->nextpool;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1358 } while (list != NULL && list != origlist);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1359 return 0;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1360 }
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1361
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1362 #else
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1363 #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
1364
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1365 #endif /* Py_DEBUG */
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1366
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1367 /* 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
1368 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
1369
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1370 p[0: S]
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1371 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
1372 to read in a memory dump).
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1373 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
1374 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
1375 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
1376 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
1377 Used to catch reference to uninitialized memory.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1378 &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
1379 handled the request itself.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1380 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
1381 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
1382 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
1383 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
1384 and _PyObject_DebugRealloc.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1385 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
1386 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
1387 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
1388 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
1389 */
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1390
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1391 /* 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
1392 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1393 _PyMem_DebugMalloc(size_t nbytes)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1394 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1395 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
1396 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1397 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1398 _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
1399 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1400 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
1401 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1402 void
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1403 _PyMem_DebugFree(void *p)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1404 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1405 _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
1406 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1407
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1408 /* 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
1409 void *
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1410 _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
1411 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1412 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
1413 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1414 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1415 _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
1416 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1417 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
1418 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1419 void
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1420 _PyObject_DebugFree(void *p)
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1421 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1422 _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
1423 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1424 void
56258
d108fe77c06c merging revision 75106 from trunk:
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 56256
diff changeset
1425 _PyObject_DebugCheckAddress(const void *p)
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1426 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1427 _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
1428 }
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1429
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 /* 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
1432 void *
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1433 _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
1434 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1435 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
1436 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
1437 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
1438
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1439 bumpserialno();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1440 total = nbytes + 4*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1441 if (total < nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1442 /* 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
1443 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
1444
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1445 p = (uchar *)PyObject_Malloc(total);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1446 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1447 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
1448
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1449 /* 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
1450 write_size_t(p, nbytes);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1451 p[SST] = (uchar)id;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1452 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
1453
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1454 if (nbytes > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1455 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
1456
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1457 /* 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
1458 tail = p + 2*SST + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1459 memset(tail, FORBIDDENBYTE, SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1460 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
1461
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1462 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
1463 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1464
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1465 /* 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
1466 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
1467 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
1468 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
1469 */
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1470 void
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1471 _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
1472 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1473 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
1474 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
1475
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1476 if (p == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1477 return;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1478 _PyObject_DebugCheckAddressApi(api, p);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1479 nbytes = read_size_t(q);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1480 nbytes += 4*SST;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1481 if (nbytes > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1482 memset(q, DEADBYTE, nbytes);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1483 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
1484 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1485
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1486 void *
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1487 _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
1488 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1489 uchar *q = (uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1490 uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1491 size_t total; /* nbytes + 4*SST */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1492 size_t original_nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1493 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
1494
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1495 if (p == NULL)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1496 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
1497
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1498 _PyObject_DebugCheckAddressApi(api, p);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1499 bumpserialno();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1500 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
1501 total = nbytes + 4*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1502 if (total < nbytes)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1503 /* 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
1504 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
1505
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1506 if (nbytes < original_nbytes) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1507 /* 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
1508 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
1509 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1510
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1511 /* 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
1512 * 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
1513 * but we live with that.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1514 */
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1515 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
1516 if (q == NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1517 return NULL;
22988
be54465a39c4 _PyObject_DebugRealloc(): rewritten to let the underlying realloc do
Tim Peters <tim.peters@gmail.com>
parents: 22987
diff changeset
1518
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1519 write_size_t(q, nbytes);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1520 assert(q[SST] == (uchar)api);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1521 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
1522 assert(q[SST + i] == FORBIDDENBYTE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1523 q += 2*SST;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1524 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1525 memset(tail, FORBIDDENBYTE, SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1526 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
1527
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1528 if (nbytes > original_nbytes) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1529 /* growing: mark new extra memory clean */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1530 memset(q + original_nbytes, CLEANBYTE,
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1531 nbytes - original_nbytes);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1532 }
22988
be54465a39c4 _PyObject_DebugRealloc(): rewritten to let the underlying realloc do
Tim Peters <tim.peters@gmail.com>
parents: 22987
diff changeset
1533
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1534 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
1535 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1536
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1537 /* 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
1538 * 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
1539 * 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
1540 * 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
1541 */
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1542 void
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1543 _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
1544 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1545 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
1546 char msgbuf[64];
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1547 char *msg;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1548 size_t nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1549 const uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1550 int i;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1551 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
1552
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1553 if (p == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1554 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
1555 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1556 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1557
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1558 /* Check the API id */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1559 id = (char)q[-SST];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1560 if (id != api) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1561 msg = msgbuf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1562 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
1563 msgbuf[sizeof(msgbuf)-1] = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1564 goto error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1565 }
56256
b6aff7a59803 http://bugs.python.org/issue6836
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 49294
diff changeset
1566
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1567 /* 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
1568 * 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
1569 * 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
1570 */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1571 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
1572 if (*(q-i) != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1573 msg = "bad leading pad byte";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1574 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1575 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1576 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1577
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1578 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
1579 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1580 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1581 if (tail[i] != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1582 msg = "bad trailing pad byte";
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1583 goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1584 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1585 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1586
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1587 return;
22614
f294fdd18b5b PYMALLOC_DEBUG routines: The "check API family" gimmick was going nowhere
Tim Peters <tim.peters@gmail.com>
parents: 22487
diff changeset
1588
f294fdd18b5b PYMALLOC_DEBUG routines: The "check API family" gimmick was going nowhere
Tim Peters <tim.peters@gmail.com>
parents: 22487
diff changeset
1589 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1590 _PyObject_DebugDumpAddress(p);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1591 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
1592 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1593
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1594 /* 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
1595 void
22983
1c26a3106653 Move PyObject_Malloc and PyObject_Free here from object.c. Remove
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 22948
diff changeset
1596 _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
1597 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1598 const uchar *q = (const uchar *)p;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1599 const uchar *tail;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1600 size_t nbytes, serial;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1601 int i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1602 int ok;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1603 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
1604
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1605 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
1606 if (p == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1607 fprintf(stderr, "\n");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1608 return;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1609 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1610 id = (char)q[-SST];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1611 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
1612
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1613 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
1614 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
1615 "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
1616
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1617 /* 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
1618 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
1619 ok = 1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1620 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
1621 if (*(q-i) != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1622 ok = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1623 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1624 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1625 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1626 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1627 fputs("FORBIDDENBYTE, as expected.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1628 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1629 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
1630 FORBIDDENBYTE);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57547
diff changeset
1631 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
1632 const uchar byte = *(q-i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1633 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
1634 if (byte != FORBIDDENBYTE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1635 fputs(" *** OUCH", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1636 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1637 }
23298
5a6be8fa8de2 _PyObject_DebugCheckAddress(): If the leading pad bytes are corrupt,
Tim Peters <tim.peters@gmail.com>
parents: 23159
diff changeset
1638
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1639 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
1640 "count of bytes requested\n"
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1641 " 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
1642 "bytes may segfault.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1643 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1644
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1645 tail = q + nbytes;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1646 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
1647 ok = 1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1648 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1649 if (tail[i] != FORBIDDENBYTE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1650 ok = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1651 break;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1652 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1653 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1654 if (ok)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1655 fputs("FORBIDDENBYTE, as expected.\n", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1656 else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1657 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
1658 FORBIDDENBYTE);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1659 for (i = 0; i < SST; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1660 const uchar byte = tail[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1661 fprintf(stderr, " at tail+%d: 0x%02x",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1662 i, byte);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1663 if (byte != FORBIDDENBYTE)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1664 fputs(" *** OUCH", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1665 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1666 }
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 serial = read_size_t(tail + SST);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1670 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
1671 "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
1672
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1673 if (nbytes > 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1674 i = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1675 fputs(" Data at p:", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1676 /* 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
1677 while (q < tail && i < 8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1678 fprintf(stderr, " %02x", *q);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1679 ++i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1680 ++q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1681 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1682 /* 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
1683 if (q < tail) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1684 if (tail - q > 8) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1685 fputs(" ...", stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1686 q = tail - 8;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1687 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1688 while (q < tail) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1689 fprintf(stderr, " %02x", *q);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1690 ++q;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1691 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1692 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1693 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1694 }
22479
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1695 }
fb45791150d1 Give Python a debug-mode pymalloc, much as sketched on Python-Dev.
Tim Peters <tim.peters@gmail.com>
parents: 22470
diff changeset
1696
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1697 static size_t
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
1698 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
1699 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1700 int i, k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1701 char buf[100];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1702 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
1703
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1704 fputs(msg, stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1705 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
1706 fputc(' ', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1707 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
1708
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1709 /* Write the value with commas. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1710 i = 22;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1711 buf[i--] = '\0';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1712 buf[i--] = '\n';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1713 k = 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1714 do {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1715 size_t nextvalue = value / 10;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1716 uint digit = (uint)(value - nextvalue * 10);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1717 value = nextvalue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1718 buf[i--] = (char)(digit + '0');
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1719 --k;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1720 if (k == 0 && value && i >= 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1721 k = 3;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1722 buf[i--] = ',';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1723 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1724 } 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
1725
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1726 while (i >= 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1727 buf[i--] = ' ';
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1728 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
1729
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1730 return origvalue;
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1731 }
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1732
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1733 /* 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
1734 * 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
1735 * checks.
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1736 */
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1737 void
23020
e2848618bd19 _PyObject_DebugDumpStats: renamed to _PyObject_DebugMallocStats.
Tim Peters <tim.peters@gmail.com>
parents: 23009
diff changeset
1738 _PyObject_DebugMallocStats(void)
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1739 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1740 uint i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1741 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
1742 /* # 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
1743 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
1744 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
1745 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
1746 /* 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
1747 size_t allocated_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1748 /* 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
1749 size_t available_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1750 /* # 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
1751 uint numfreepools = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1752 /* # of bytes for arena alignment padding */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1753 size_t arena_alignment = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1754 /* # 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
1755 size_t pool_header_bytes = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1756 /* # 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
1757 * 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
1758 * full pools.
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1759 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1760 size_t quantization = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1761 /* # of arenas actually allocated. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1762 size_t narenas = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1763 /* 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
1764 size_t total;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1765 char buf[128];
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1766
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1767 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
1768 SMALL_REQUEST_THRESHOLD, numclasses);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1769
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1770 for (i = 0; i < numclasses; ++i)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1771 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
1772
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1773 /* 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
1774 * 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
1775 * 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
1776 */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1777 for (i = 0; i < maxarenas; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1778 uint poolsinarena;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1779 uint j;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1780 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
1781
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1782 /* Skip arenas which are not allocated. */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1783 if (arenas[i].address == (uptr)NULL)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1784 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1785 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
1786
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1787 poolsinarena = arenas[i].ntotalpools;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1788 numfreepools += arenas[i].nfreepools;
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1789
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1790 /* round up to pool alignment */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1791 if (base & (uptr)POOL_SIZE_MASK) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1792 arena_alignment += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1793 base &= ~(uptr)POOL_SIZE_MASK;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1794 base += POOL_SIZE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1795 }
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 /* visit every pool in the arena */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1798 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
1799 for (j = 0;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1800 base < (uptr) arenas[i].pool_address;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1801 ++j, base += POOL_SIZE) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1802 poolp p = (poolp)base;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1803 const uint sz = p->szidx;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1804 uint freeblocks;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1805
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1806 if (p->ref.count == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1807 /* currently unused */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1808 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
1809 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1810 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1811 ++numpools[sz];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1812 numblocks[sz] += p->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1813 freeblocks = NUMBLOCKS(sz) - p->ref.count;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1814 numfreeblocks[sz] += freeblocks;
23159
fca379c30906 _PyObject_DebugMallocStats(): Added some potentially expensive internal
Tim Peters <tim.peters@gmail.com>
parents: 23158
diff changeset
1815 #ifdef Py_DEBUG
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1816 if (freeblocks > 0)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1817 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
1818 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1819 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1820 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1821 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
1822
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1823 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1824 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
1825 "----- ---- --------- ------------- ------------\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1826 stderr);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1827
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1828 for (i = 0; i < numclasses; ++i) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1829 size_t p = numpools[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1830 size_t b = numblocks[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1831 size_t f = numfreeblocks[i];
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1832 uint size = INDEX2SIZE(i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1833 if (p == 0) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1834 assert(b == 0 && f == 0);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1835 continue;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1836 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1837 fprintf(stderr, "%5u %6u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1838 "%11" PY_FORMAT_SIZE_T "u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1839 "%15" PY_FORMAT_SIZE_T "u "
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1840 "%13" PY_FORMAT_SIZE_T "u\n",
66482
0000bbab08b4 Merged revisions 86791 via svnmerge from
Stefan Krah <stefan@bytereef.org>
parents: 61467
diff changeset
1841 i, size, p, b, f);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1842 allocated_bytes += b * size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1843 available_bytes += f * size;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1844 pool_header_bytes += p * POOL_OVERHEAD;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1845 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
1846 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1847 fputc('\n', stderr);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1848 (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
1849
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1850 (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
1851 (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
1852 (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
1853 (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
1854
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1855 PyOS_snprintf(buf, sizeof(buf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1856 "%" 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
1857 narenas, ARENA_SIZE);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1858 (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
1859
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1860 fputc('\n', stderr);
22837
ef2fbce71736 _PyMalloc_DebugDumpStats(): vastly improved the output, and it now
Tim Peters <tim.peters@gmail.com>
parents: 22836
diff changeset
1861
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1862 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
1863 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
1864
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1865 PyOS_snprintf(buf, sizeof(buf),
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1866 "%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
1867 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
1868
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1869 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
1870 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
1871 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
1872 (void)printone("Total", total);
22724
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1873 }
9baa8c9a1e84 New PYMALLOC_DEBUG function void _PyMalloc_DebugDumpStats(void).
Tim Peters <tim.peters@gmail.com>
parents: 22701
diff changeset
1874
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49294
diff changeset
1875 #endif /* PYMALLOC_DEBUG */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1876
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1877 #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
1878 /* 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
1879 * 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
1880 */
32278
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1881 int
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1882 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
1883 {
67443
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1884 uint arenaindex_temp = pool->arenaindex;
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1885
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1886 return arenaindex_temp < maxarenas &&
54fa62165853 Merged revisions 87834 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 66482
diff changeset
1887 (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
1888 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
1889 }
c2bc248d3e9c SF bug 881641, make it easier to use valgrind
Neal Norwitz <nnorwitz@gmail.com>
parents: 29515
diff changeset
1890 #endif