annotate Objects/obmalloc.c @ 72181:c1949bde461e

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