drd/drd_pthread_intercepts: Add a workaround for what is probably a compiler bug
[valgrind.git] / coregrind / m_mallocfree.c
blob4bc24f91e56e613373bc483860822a173c5af671
2 /*--------------------------------------------------------------------*/
3 /*--- An implementation of malloc/free which doesn't use sbrk. ---*/
4 /*--- m_mallocfree.c ---*/
5 /*--------------------------------------------------------------------*/
7 /*
8 This file is part of Valgrind, a dynamic binary instrumentation
9 framework.
11 Copyright (C) 2000-2017 Julian Seward
12 jseward@acm.org
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, see <http://www.gnu.org/licenses/>.
27 The GNU General Public License is contained in the file COPYING.
30 #include "pub_core_basics.h"
31 #include "pub_core_vki.h"
32 #include "pub_core_debuglog.h"
33 #include "pub_core_libcbase.h"
34 #include "pub_core_aspacemgr.h"
35 #include "pub_core_libcassert.h"
36 #include "pub_core_libcprint.h"
37 #include "pub_core_mallocfree.h"
38 #include "pub_core_options.h"
39 #include "pub_core_threadstate.h" // For VG_INVALID_THREADID
40 #include "pub_core_gdbserver.h"
41 #include "pub_core_transtab.h"
42 #include "pub_core_tooliface.h"
44 #include "pub_core_inner.h"
45 #if defined(ENABLE_INNER_CLIENT_REQUEST)
46 #include "memcheck/memcheck.h"
47 #endif
49 // #define DEBUG_MALLOC // turn on heavyweight debugging machinery
50 // #define VERBOSE_MALLOC // make verbose, esp. in debugging machinery
52 /* Number and total size of blocks in free queue. Used by mallinfo(). */
53 Long VG_(free_queue_volume) = 0;
54 Long VG_(free_queue_length) = 0;
56 static void cc_analyse_alloc_arena ( ArenaId aid ); /* fwds */
58 /*------------------------------------------------------------*/
59 /*--- Main types ---*/
60 /*------------------------------------------------------------*/
62 #define N_MALLOC_LISTS 112 // do not change this
64 // The amount you can ask for is limited only by sizeof(SizeT)...
65 #define MAX_PSZB (~((SizeT)0x0))
67 // Each arena has a sorted array of superblocks, which expands
68 // dynamically. This is its initial size.
69 #define SBLOCKS_SIZE_INITIAL 50
71 typedef UChar UByte;
73 /* Layout of an in-use block:
75 cost center (OPTIONAL) (VG_MIN_MALLOC_SZB bytes, only when h-p enabled)
76 this block total szB (sizeof(SizeT) bytes)
77 red zone bytes (depends on Arena.rz_szB, but >= sizeof(void*))
78 (payload bytes)
79 red zone bytes (depends on Arena.rz_szB, but >= sizeof(void*))
80 this block total szB (sizeof(SizeT) bytes)
82 Layout of a block on the free list:
84 cost center (OPTIONAL) (VG_MIN_MALLOC_SZB bytes, only when h-p enabled)
85 this block total szB (sizeof(SizeT) bytes)
86 freelist previous ptr (sizeof(void*) bytes)
87 excess red zone bytes (if Arena.rz_szB > sizeof(void*))
88 (payload bytes)
89 excess red zone bytes (if Arena.rz_szB > sizeof(void*))
90 freelist next ptr (sizeof(void*) bytes)
91 this block total szB (sizeof(SizeT) bytes)
93 Total size in bytes (bszB) and payload size in bytes (pszB)
94 are related by:
96 bszB == pszB + 2*sizeof(SizeT) + 2*a->rz_szB
98 when heap profiling is not enabled, and
100 bszB == pszB + 2*sizeof(SizeT) + 2*a->rz_szB + VG_MIN_MALLOC_SZB
102 when it is enabled. It follows that the minimum overhead per heap
103 block for arenas used by the core is:
105 32-bit platforms: 2*4 + 2*4 == 16 bytes
106 64-bit platforms: 2*8 + 2*8 == 32 bytes
108 when heap profiling is not enabled, and
110 32-bit platforms: 2*4 + 2*4 + 8 == 24 bytes
111 64-bit platforms: 2*8 + 2*8 + 16 == 48 bytes
113 when it is enabled. In all cases, extra overhead may be incurred
114 when rounding the payload size up to VG_MIN_MALLOC_SZB.
116 Furthermore, both size fields in the block have their least-significant
117 bit set if the block is not in use, and unset if it is in use.
118 (The bottom 3 or so bits are always free for this because of alignment.)
119 A block size of zero is not possible, because a block always has at
120 least two SizeTs and two pointers of overhead.
122 Nb: All Block payloads must be VG_MIN_MALLOC_SZB-aligned. This is
123 achieved by ensuring that Superblocks are VG_MIN_MALLOC_SZB-aligned
124 (see newSuperblock() for how), and that the lengths of the following
125 things are a multiple of VG_MIN_MALLOC_SZB:
126 - Superblock admin section lengths (due to elastic padding)
127 - Block admin section (low and high) lengths (due to elastic redzones)
128 - Block payload lengths (due to req_pszB rounding up)
130 The heap-profile cost-center field is 8 bytes even on 32 bit
131 platforms. This is so as to keep the payload field 8-aligned. On
132 a 64-bit platform, this cc-field contains a pointer to a const
133 HChar*, which is the cost center name. On 32-bit platforms, the
134 pointer lives in the lower-addressed half of the field, regardless
135 of the endianness of the host.
137 typedef
138 struct {
139 // No fields are actually used in this struct, because a Block has
140 // many variable sized fields and so can't be accessed
141 // meaningfully with normal fields. So we use access functions all
142 // the time. This struct gives us a type to use, though. Also, we
143 // make sizeof(Block) 1 byte so that we can do arithmetic with the
144 // Block* type in increments of 1!
145 UByte dummy;
147 Block;
149 /* Ensure that Block payloads can be safely cast to various pointers below. */
150 STATIC_ASSERT(VG_MIN_MALLOC_SZB % sizeof(void *) == 0);
152 // A superblock. 'padding' is never used, it just ensures that if the
153 // entire Superblock is aligned to VG_MIN_MALLOC_SZB, then payload_bytes[]
154 // will be too. It can add small amounts of padding unnecessarily -- eg.
155 // 8-bytes on 32-bit machines with an 8-byte VG_MIN_MALLOC_SZB -- because
156 // it's too hard to make a constant expression that works perfectly in all
157 // cases.
158 // 'unsplittable' is set to NULL if superblock can be split, otherwise
159 // it is set to the address of the superblock. An unsplittable superblock
160 // will contain only one allocated block. An unsplittable superblock will
161 // be unmapped when its (only) allocated block is freed.
162 // The free space at the end of an unsplittable superblock is not used to
163 // make a free block. Note that this means that an unsplittable superblock can
164 // have up to slightly less than 1 page of unused bytes at the end of the
165 // superblock.
166 // 'unsplittable' is used to avoid quadratic memory usage for linear
167 // reallocation of big structures
168 // (see http://bugs.kde.org/show_bug.cgi?id=250101).
169 // ??? unsplittable replaces 'void *padding2'. Choosed this
170 // ??? to avoid changing the alignment logic. Maybe something cleaner
171 // ??? can be done.
172 // A splittable block can be reclaimed when all its blocks are freed :
173 // the reclaim of such a block is deferred till either another superblock
174 // of the same arena can be reclaimed or till a new superblock is needed
175 // in any arena.
176 // payload_bytes[] is made a single big Block when the Superblock is
177 // created, and then can be split and the splittings remerged, but Blocks
178 // always cover its entire length -- there's never any unused bytes at the
179 // end, for example.
180 typedef
181 struct _Superblock {
182 SizeT n_payload_bytes;
183 struct _Superblock* unsplittable;
184 UByte padding[ VG_MIN_MALLOC_SZB -
185 ((sizeof(struct _Superblock*) + sizeof(SizeT)) %
186 VG_MIN_MALLOC_SZB) ];
187 UByte payload_bytes[0];
189 Superblock;
191 // An arena. 'freelist' is a circular, doubly-linked list. 'rz_szB' is
192 // elastic, in that it can be bigger than asked-for to ensure alignment.
193 typedef
194 struct {
195 const HChar* name;
196 Bool clientmem; // Allocates in the client address space?
197 SizeT rz_szB; // Red zone size in bytes
198 SizeT min_sblock_szB; // Minimum superblock size in bytes
199 SizeT min_unsplittable_sblock_szB;
200 // Minimum unsplittable superblock size in bytes. To be marked as
201 // unsplittable, a superblock must have a
202 // size >= min_unsplittable_sblock_szB and cannot be split.
203 // So, to avoid big overhead, superblocks used to provide aligned
204 // blocks on big alignments are splittable.
205 // Unsplittable superblocks will be reclaimed when their (only)
206 // allocated block is freed.
207 // Smaller size superblocks are splittable and can be reclaimed when all
208 // their blocks are freed.
209 Block* freelist[N_MALLOC_LISTS];
210 // A dynamically expanding, ordered array of (pointers to)
211 // superblocks in the arena. If this array is expanded, which
212 // is rare, the previous space it occupies is simply abandoned.
213 // To avoid having to get yet another block from m_aspacemgr for
214 // the first incarnation of this array, the first allocation of
215 // it is within this struct. If it has to be expanded then the
216 // new space is acquired from m_aspacemgr as you would expect.
217 Superblock** sblocks;
218 SizeT sblocks_size;
219 SizeT sblocks_used;
220 Superblock* sblocks_initial[SBLOCKS_SIZE_INITIAL];
221 Superblock* deferred_reclaimed_sb;
223 // VG_(arena_perm_malloc) returns memory from superblocks
224 // only used for permanent blocks. No overhead. These superblocks
225 // are not stored in sblocks array above.
226 Addr perm_malloc_current; // first byte free in perm_malloc sb.
227 Addr perm_malloc_limit; // maximum usable byte in perm_malloc sb.
229 // Stats only
230 SizeT stats__perm_bytes_on_loan;
231 SizeT stats__perm_blocks;
233 ULong stats__nreclaim_unsplit;
234 ULong stats__nreclaim_split;
235 /* total # of reclaim executed for unsplittable/splittable superblocks */
236 SizeT stats__bytes_on_loan;
237 SizeT stats__bytes_mmaped;
238 SizeT stats__bytes_on_loan_max;
239 ULong stats__tot_blocks; /* total # blocks alloc'd */
240 ULong stats__tot_bytes; /* total # bytes alloc'd */
241 ULong stats__nsearches; /* total # freelist checks */
242 // If profiling, when should the next profile happen at
243 // (in terms of stats__bytes_on_loan_max) ?
244 SizeT next_profile_at;
245 SizeT stats__bytes_mmaped_max;
247 Arena;
250 /*------------------------------------------------------------*/
251 /*--- Low-level functions for working with Blocks. ---*/
252 /*------------------------------------------------------------*/
254 #define SIZE_T_0x1 ((SizeT)0x1)
256 static const char* probably_your_fault =
257 "This is probably caused by your program erroneously writing past the\n"
258 "end of a heap block and corrupting heap metadata. If you fix any\n"
259 "invalid writes reported by Memcheck, this assertion failure will\n"
260 "probably go away. Please try that before reporting this as a bug.\n";
262 // Mark a bszB as in-use, and not in-use, and remove the in-use attribute.
263 static __inline__
264 SizeT mk_inuse_bszB ( SizeT bszB )
266 vg_assert2(bszB != 0, probably_your_fault);
267 return bszB & (~SIZE_T_0x1);
269 static __inline__
270 SizeT mk_free_bszB ( SizeT bszB )
272 vg_assert2(bszB != 0, probably_your_fault);
273 return bszB | SIZE_T_0x1;
275 static __inline__
276 SizeT mk_plain_bszB ( SizeT bszB )
278 vg_assert2(bszB != 0, probably_your_fault);
279 return bszB & (~SIZE_T_0x1);
282 // Forward definition.
283 static
284 void ensure_mm_init ( ArenaId aid );
286 // return either 0 or sizeof(ULong) depending on whether or not
287 // heap profiling is engaged
288 #define hp_overhead_szB() set_at_init_hp_overhead_szB
289 static SizeT set_at_init_hp_overhead_szB = -1000000;
290 // startup value chosen to very likely cause a problem if used before
291 // a proper value is given by ensure_mm_init.
293 //---------------------------------------------------------------------------
295 // Get a block's size as stored, ie with the in-use/free attribute.
296 static __inline__
297 SizeT get_bszB_as_is ( Block* b )
299 UByte* b2 = (UByte*)b;
300 SizeT bszB_lo = *ASSUME_ALIGNED(SizeT*, &b2[0 + hp_overhead_szB()]);
301 SizeT bszB_hi = *ASSUME_ALIGNED(SizeT*,
302 &b2[mk_plain_bszB(bszB_lo) - sizeof(SizeT)]);
303 vg_assert2(bszB_lo == bszB_hi,
304 "Heap block lo/hi size mismatch: lo = %llu, hi = %llu.\n%s",
305 (ULong)bszB_lo, (ULong)bszB_hi, probably_your_fault);
306 return bszB_lo;
309 // Get a block's plain size, ie. remove the in-use/free attribute.
310 static __inline__
311 SizeT get_bszB ( Block* b )
313 return mk_plain_bszB(get_bszB_as_is(b));
316 // Set the size fields of a block. bszB may have the in-use/free attribute.
317 static __inline__
318 void set_bszB ( Block* b, SizeT bszB )
320 UByte* b2 = (UByte*)b;
321 *ASSUME_ALIGNED(SizeT*, &b2[0 + hp_overhead_szB()]) = bszB;
322 *ASSUME_ALIGNED(SizeT*, &b2[mk_plain_bszB(bszB) - sizeof(SizeT)]) = bszB;
325 //---------------------------------------------------------------------------
327 // Does this block have the in-use attribute?
328 static __inline__
329 Bool is_inuse_block ( Block* b )
331 SizeT bszB = get_bszB_as_is(b);
332 vg_assert2(bszB != 0, probably_your_fault);
333 return (0 != (bszB & SIZE_T_0x1)) ? False : True;
336 //---------------------------------------------------------------------------
338 // Return the lower, upper and total overhead in bytes for a block.
339 // These are determined purely by which arena the block lives in.
340 static __inline__
341 SizeT overhead_szB_lo ( Arena* a )
343 return hp_overhead_szB() + sizeof(SizeT) + a->rz_szB;
345 static __inline__
346 SizeT overhead_szB_hi ( Arena* a )
348 return a->rz_szB + sizeof(SizeT);
350 static __inline__
351 SizeT overhead_szB ( Arena* a )
353 return overhead_szB_lo(a) + overhead_szB_hi(a);
356 //---------------------------------------------------------------------------
358 // Return the minimum bszB for a block in this arena. Can have zero-length
359 // payloads, so it's the size of the admin bytes.
360 static __inline__
361 SizeT min_useful_bszB ( Arena* a )
363 return overhead_szB(a);
366 //---------------------------------------------------------------------------
368 // Convert payload size <--> block size (both in bytes).
369 static __inline__
370 SizeT pszB_to_bszB ( Arena* a, SizeT pszB )
372 return pszB + overhead_szB(a);
374 static __inline__
375 SizeT bszB_to_pszB ( Arena* a, SizeT bszB )
377 vg_assert2(bszB >= overhead_szB(a), probably_your_fault);
378 return bszB - overhead_szB(a);
381 //---------------------------------------------------------------------------
383 // Get a block's payload size.
384 static __inline__
385 SizeT get_pszB ( Arena* a, Block* b )
387 return bszB_to_pszB(a, get_bszB(b));
390 //---------------------------------------------------------------------------
392 // Given the addr of a block, return the addr of its payload, and vice versa.
393 static __inline__
394 UByte* get_block_payload ( Arena* a, Block* b )
396 UByte* b2 = (UByte*)b;
397 return & b2[ overhead_szB_lo(a) ];
399 // Given the addr of a block's payload, return the addr of the block itself.
400 static __inline__
401 Block* get_payload_block ( Arena* a, UByte* payload )
403 return (Block*)&payload[ -overhead_szB_lo(a) ];
406 //---------------------------------------------------------------------------
408 // Set and get the next and previous link fields of a block.
409 static __inline__
410 void set_prev_b ( Block* b, Block* prev_p )
412 UByte* b2 = (UByte*)b;
413 *ASSUME_ALIGNED(Block**, &b2[hp_overhead_szB() + sizeof(SizeT)]) = prev_p;
415 static __inline__
416 void set_next_b ( Block* b, Block* next_p )
418 UByte* b2 = (UByte*)b;
419 *ASSUME_ALIGNED(Block**,
420 &b2[get_bszB(b) - sizeof(SizeT) - sizeof(void*)]) = next_p;
422 static __inline__
423 Block* get_prev_b ( Block* b )
425 UByte* b2 = (UByte*)b;
426 return *ASSUME_ALIGNED(Block**, &b2[hp_overhead_szB() + sizeof(SizeT)]);
428 static __inline__
429 Block* get_next_b ( Block* b )
431 UByte* b2 = (UByte*)b;
432 return *ASSUME_ALIGNED(Block**,
433 &b2[get_bszB(b) - sizeof(SizeT) - sizeof(void*)]);
436 //---------------------------------------------------------------------------
438 // Set and get the cost-center field of a block.
439 static __inline__
440 void set_cc ( Block* b, const HChar* cc )
442 UByte* b2 = (UByte*)b;
443 vg_assert( VG_(clo_profile_heap) );
444 *ASSUME_ALIGNED(const HChar**, &b2[0]) = cc;
446 static __inline__
447 const HChar* get_cc ( Block* b )
449 UByte* b2 = (UByte*)b;
450 vg_assert( VG_(clo_profile_heap) );
451 return *ASSUME_ALIGNED(const HChar**, &b2[0]);
454 //---------------------------------------------------------------------------
456 // Get the block immediately preceding this one in the Superblock.
457 static __inline__
458 Block* get_predecessor_block ( Block* b )
460 UByte* b2 = (UByte*)b;
461 SizeT bszB = mk_plain_bszB(*ASSUME_ALIGNED(SizeT*, &b2[-sizeof(SizeT)]));
462 return (Block*)&b2[-bszB];
465 //---------------------------------------------------------------------------
467 // Read and write the lower and upper red-zone bytes of a block.
468 static __inline__
469 void set_rz_lo_byte ( Block* b, UInt rz_byteno, UByte v )
471 UByte* b2 = (UByte*)b;
472 b2[hp_overhead_szB() + sizeof(SizeT) + rz_byteno] = v;
474 static __inline__
475 void set_rz_hi_byte ( Block* b, UInt rz_byteno, UByte v )
477 UByte* b2 = (UByte*)b;
478 b2[get_bszB(b) - sizeof(SizeT) - rz_byteno - 1] = v;
480 static __inline__
481 UByte get_rz_lo_byte ( Block* b, UInt rz_byteno )
483 UByte* b2 = (UByte*)b;
484 return b2[hp_overhead_szB() + sizeof(SizeT) + rz_byteno];
486 static __inline__
487 UByte get_rz_hi_byte ( Block* b, UInt rz_byteno )
489 UByte* b2 = (UByte*)b;
490 return b2[get_bszB(b) - sizeof(SizeT) - rz_byteno - 1];
493 #if defined(ENABLE_INNER_CLIENT_REQUEST)
494 /* When running as an inner, the block headers before and after
495 (see 'Layout of an in-use block:' above) are made non accessible
496 by VALGRIND_MALLOCLIKE_BLOCK/VALGRIND_FREELIKE_BLOCK
497 to allow the outer to detect block overrun.
498 The below two functions are used when these headers must be
499 temporarily accessed. */
500 static void mkBhdrAccess( Arena* a, Block* b )
502 VALGRIND_MAKE_MEM_DEFINED (b,
503 hp_overhead_szB() + sizeof(SizeT) + a->rz_szB);
504 VALGRIND_MAKE_MEM_DEFINED (b + get_bszB(b) - a->rz_szB - sizeof(SizeT),
505 a->rz_szB + sizeof(SizeT));
508 /* Mark block hdr as not accessible.
509 !!! Currently, we do not mark the cost center and szB fields unaccessible
510 as these are accessed at too many places. */
511 static void mkBhdrNoAccess( Arena* a, Block* b )
513 VALGRIND_MAKE_MEM_NOACCESS (b + hp_overhead_szB() + sizeof(SizeT),
514 a->rz_szB);
515 VALGRIND_MAKE_MEM_NOACCESS (b + get_bszB(b) - sizeof(SizeT) - a->rz_szB,
516 a->rz_szB);
519 /* Make the cc+szB fields accessible. */
520 static void mkBhdrSzAccess( Arena* a, Block* b )
522 VALGRIND_MAKE_MEM_DEFINED (b,
523 hp_overhead_szB() + sizeof(SizeT));
524 /* We cannot use get_bszB(b), as this reads the 'hi' szB we want
525 to mark accessible. So, we only access the 'lo' szB. */
526 SizeT bszB_lo = mk_plain_bszB(*(SizeT*)&b[0 + hp_overhead_szB()]);
527 VALGRIND_MAKE_MEM_DEFINED (b + bszB_lo - sizeof(SizeT),
528 sizeof(SizeT));
530 #endif
532 /*------------------------------------------------------------*/
533 /*--- Arena management ---*/
534 /*------------------------------------------------------------*/
536 #define CORE_ARENA_MIN_SZB 1048576
538 // The arena structures themselves.
539 static Arena vg_arena[VG_N_ARENAS];
541 // Functions external to this module identify arenas using ArenaIds,
542 // not Arena*s. This fn converts the former to the latter.
543 static Arena* arenaId_to_ArenaP ( ArenaId arena )
545 vg_assert(arena >= 0 && arena < VG_N_ARENAS);
546 return & vg_arena[arena];
549 static ArenaId arenaP_to_ArenaId ( Arena *a )
551 ArenaId arena = a -vg_arena;
552 vg_assert(arena >= 0 && arena < VG_N_ARENAS);
553 return arena;
556 // Initialise an arena. rz_szB is the (default) minimum redzone size;
557 // It might be overridden by VG_(clo_redzone_size) or VG_(clo_core_redzone_size).
558 // it might be made bigger to ensure that VG_MIN_MALLOC_SZB is observed.
559 static
560 void arena_init ( ArenaId aid, const HChar* name, SizeT rz_szB,
561 SizeT min_sblock_szB, SizeT min_unsplittable_sblock_szB )
563 SizeT i;
564 Arena* a = arenaId_to_ArenaP(aid);
566 // Ensure default redzones are a reasonable size.
567 vg_assert(rz_szB <= MAX_REDZONE_SZB);
569 /* Override the default redzone size if a clo value was given.
570 Note that the clo value can be significantly bigger than MAX_REDZONE_SZB
571 to allow the user to chase horrible bugs using up to 1 page
572 of protection. */
573 if (VG_AR_CLIENT == aid) {
574 if (VG_(clo_redzone_size) != -1)
575 rz_szB = VG_(clo_redzone_size);
576 } else {
577 if (VG_(clo_core_redzone_size) != rz_szB)
578 rz_szB = VG_(clo_core_redzone_size);
581 // Redzones must always be at least the size of a pointer, for holding the
582 // prev/next pointer (see the layout details at the top of this file).
583 if (rz_szB < sizeof(void*)) rz_szB = sizeof(void*);
585 // The size of the low and high admin sections in a block must be a
586 // multiple of VG_MIN_MALLOC_SZB. So we round up the asked-for
587 // redzone size if necessary to achieve this.
588 a->rz_szB = rz_szB;
589 while (0 != overhead_szB_lo(a) % VG_MIN_MALLOC_SZB) a->rz_szB++;
590 vg_assert(overhead_szB_lo(a) - hp_overhead_szB() == overhead_szB_hi(a));
592 // Here we have established the effective redzone size.
595 vg_assert((min_sblock_szB % VKI_PAGE_SIZE) == 0);
596 a->name = name;
597 a->clientmem = ( VG_AR_CLIENT == aid ? True : False );
599 a->min_sblock_szB = min_sblock_szB;
600 a->min_unsplittable_sblock_szB = min_unsplittable_sblock_szB;
601 for (i = 0; i < N_MALLOC_LISTS; i++) a->freelist[i] = NULL;
603 a->sblocks = & a->sblocks_initial[0];
604 a->sblocks_size = SBLOCKS_SIZE_INITIAL;
605 a->sblocks_used = 0;
606 a->deferred_reclaimed_sb = 0;
607 a->perm_malloc_current = 0;
608 a->perm_malloc_limit = 0;
609 a->stats__perm_bytes_on_loan= 0;
610 a->stats__perm_blocks = 0;
611 a->stats__nreclaim_unsplit = 0;
612 a->stats__nreclaim_split = 0;
613 a->stats__bytes_on_loan = 0;
614 a->stats__bytes_mmaped = 0;
615 a->stats__bytes_on_loan_max = 0;
616 a->stats__bytes_mmaped_max = 0;
617 a->stats__tot_blocks = 0;
618 a->stats__tot_bytes = 0;
619 a->stats__nsearches = 0;
620 a->next_profile_at = 25 * 1000 * 1000;
621 vg_assert(sizeof(a->sblocks_initial)
622 == SBLOCKS_SIZE_INITIAL * sizeof(Superblock*));
625 /* Print vital stats for an arena. */
626 void VG_(print_all_arena_stats) ( void )
628 UInt i;
629 for (i = 0; i < VG_N_ARENAS; i++) {
630 Arena* a = arenaId_to_ArenaP(i);
631 VG_(message)(Vg_DebugMsg,
632 "%-8s: %'13lu/%'13lu max/curr mmap'd, "
633 "%llu/%llu unsplit/split sb unmmap'd, "
634 "%'13lu/%'13lu max/curr, "
635 "%10llu/%10llu totalloc-blocks/bytes,"
636 " %10llu searches %lu rzB\n",
637 a->name,
638 a->stats__bytes_mmaped_max, a->stats__bytes_mmaped,
639 a->stats__nreclaim_unsplit, a->stats__nreclaim_split,
640 a->stats__bytes_on_loan_max,
641 a->stats__bytes_on_loan,
642 a->stats__tot_blocks, a->stats__tot_bytes,
643 a->stats__nsearches,
644 a->rz_szB
649 void VG_(print_arena_cc_analysis) ( void )
651 UInt i;
652 vg_assert( VG_(clo_profile_heap) );
653 for (i = 0; i < VG_N_ARENAS; i++) {
654 cc_analyse_alloc_arena(i);
659 /* This library is self-initialising, as it makes this more self-contained,
660 less coupled with the outside world. Hence VG_(arena_malloc)() and
661 VG_(arena_free)() below always call ensure_mm_init() to ensure things are
662 correctly initialised.
664 We initialise the client arena separately (and later) because the core
665 must do non-client allocation before the tool has a chance to set the
666 client arena's redzone size.
668 static Bool client_inited = False;
669 static Bool nonclient_inited = False;
671 static
672 void ensure_mm_init ( ArenaId aid )
674 static SizeT client_rz_szB = 8; // default: be paranoid
676 /* We use checked red zones (of various sizes) for our internal stuff,
677 and an unchecked zone of arbitrary size for the client. Of
678 course the client's red zone can be checked by the tool, eg.
679 by using addressibility maps, but not by the mechanism implemented
680 here, which merely checks at the time of freeing that the red
681 zone bytes are unchanged.
683 Nb: redzone sizes are *minimums*; they could be made bigger to ensure
684 alignment. Eg. with 8 byte alignment, on 32-bit machines 4 stays as
685 4, but 16 becomes 20; but on 64-bit machines 4 becomes 8, and 16
686 stays as 16 --- the extra 4 bytes in both are accounted for by the
687 larger prev/next ptr.
689 if (VG_AR_CLIENT == aid) {
690 Int ar_client_sbszB;
691 if (client_inited) {
692 // This assertion ensures that a tool cannot try to change the client
693 // redzone size with VG_(needs_malloc_replacement)() after this module
694 // has done its first allocation from the client arena.
695 if (VG_(needs).malloc_replacement)
696 vg_assert(client_rz_szB == VG_(tdict).tool_client_redzone_szB);
697 return;
700 // Check and set the client arena redzone size
701 if (VG_(needs).malloc_replacement) {
702 client_rz_szB = VG_(tdict).tool_client_redzone_szB;
703 if (client_rz_szB > MAX_REDZONE_SZB) {
704 VG_(printf)( "\nTool error:\n"
705 " specified redzone size is too big (%llu)\n",
706 (ULong)client_rz_szB);
707 VG_(exit)(1);
710 // Initialise the client arena. On all platforms,
711 // increasing the superblock size reduces the number of superblocks
712 // in the client arena, which makes findSb cheaper.
713 ar_client_sbszB = 4194304;
714 // superblocks with a size > ar_client_sbszB will be unsplittable
715 // (unless used for providing memalign-ed blocks).
716 arena_init ( VG_AR_CLIENT, "client", client_rz_szB,
717 ar_client_sbszB, ar_client_sbszB+1);
718 client_inited = True;
720 } else {
721 if (nonclient_inited) {
722 return;
724 set_at_init_hp_overhead_szB =
725 VG_(clo_profile_heap) ? VG_MIN_MALLOC_SZB : 0;
726 // Initialise the non-client arenas
727 // Similarly to client arena, big allocations will be unsplittable.
728 arena_init ( VG_AR_CORE, "core", CORE_REDZONE_DEFAULT_SZB,
729 4194304, 4194304+1 );
730 arena_init ( VG_AR_DINFO, "dinfo", CORE_REDZONE_DEFAULT_SZB,
731 1048576, 1048576+1 );
732 arena_init ( VG_AR_DEMANGLE, "demangle", CORE_REDZONE_DEFAULT_SZB,
733 65536, 65536+1 );
734 arena_init ( VG_AR_TTAUX, "ttaux", CORE_REDZONE_DEFAULT_SZB,
735 65536, 65536+1 );
736 nonclient_inited = True;
739 # ifdef DEBUG_MALLOC
740 VG_(printf)("ZZZ1\n");
741 VG_(sanity_check_malloc_all)();
742 VG_(printf)("ZZZ2\n");
743 # endif
747 /*------------------------------------------------------------*/
748 /*--- Superblock management ---*/
749 /*------------------------------------------------------------*/
751 __attribute__((noreturn))
752 void VG_(out_of_memory_NORETURN) ( const HChar* who, SizeT szB )
754 static Int outputTrial = 0;
755 // We try once to output the full memory state followed by the below message.
756 // If that fails (due to out of memory during first trial), we try to just
757 // output the below message.
758 // And then we abandon.
760 ULong tot_alloc = VG_(am_get_anonsize_total)();
761 const HChar* s1 =
762 "\n"
763 " Valgrind's memory management: out of memory:\n"
764 " %s's request for %llu bytes failed.\n"
765 " %'13llu bytes have already been mmap-ed ANONYMOUS.\n"
766 " Valgrind cannot continue. Sorry.\n\n"
767 " There are several possible reasons for this.\n"
768 " - You have some kind of memory limit in place. Look at the\n"
769 " output of 'ulimit -a'. Is there a limit on the size of\n"
770 " virtual memory or address space?\n"
771 " - You have run out of swap space.\n"
772 " - Valgrind has a bug. If you think this is the case or you are\n"
773 " not sure, please let us know and we'll try to fix it.\n"
774 " Please note that programs can take substantially more memory than\n"
775 " normal when running under Valgrind tools, eg. up to twice or\n"
776 " more, depending on the tool. On a 64-bit machine, Valgrind\n"
777 " should be able to make use of up 32GB memory. On a 32-bit\n"
778 " machine, Valgrind should be able to use all the memory available\n"
779 " to a single process, up to 4GB if that's how you have your\n"
780 " kernel configured. Most 32-bit Linux setups allow a maximum of\n"
781 " 3GB per process.\n\n"
782 " Whatever the reason, Valgrind cannot continue. Sorry.\n";
784 if (outputTrial <= 1) {
785 if (outputTrial == 0) {
786 outputTrial++;
787 // First print the memory stats with the aspacemgr data.
788 VG_(am_show_nsegments) (0, "out_of_memory");
789 VG_(print_all_arena_stats) ();
790 if (VG_(clo_profile_heap))
791 VG_(print_arena_cc_analysis) ();
792 // And then print some other information that might help.
793 VG_(print_all_stats) (False, /* Memory stats */
794 True /* Tool stats */);
795 VG_(show_sched_status) (True, // host_stacktrace
796 True, // valgrind_stack_usage
797 True); // exited_threads
798 /* In case we are an inner valgrind, asks the outer to report
799 its memory state in its log output. */
800 INNER_REQUEST(VALGRIND_MONITOR_COMMAND("v.set log_output"));
801 INNER_REQUEST(VALGRIND_MONITOR_COMMAND("v.info memory aspacemgr"));
803 outputTrial++;
804 VG_(message)(Vg_UserMsg, s1, who, (ULong)szB, tot_alloc);
805 } else {
806 VG_(debugLog)(0,"mallocfree", s1, who, (ULong)szB, tot_alloc);
809 VG_(exit)(1);
813 // Align ptr p upwards to an align-sized boundary.
814 static
815 void* align_upwards ( void* p, SizeT align )
817 Addr a = (Addr)p;
818 if ((a % align) == 0) return (void*)a;
819 return (void*)(a - (a % align) + align);
822 // Forward definition.
823 static
824 void deferred_reclaimSuperblock ( Arena* a, Superblock* sb);
826 // If not enough memory available, either aborts (for non-client memory)
827 // or returns 0 (for client memory).
828 static
829 Superblock* newSuperblock ( Arena* a, SizeT cszB )
831 Superblock* sb;
832 SysRes sres;
833 Bool unsplittable;
834 ArenaId aid;
836 // A new superblock is needed for arena a. We will execute the deferred
837 // reclaim in all arenas in order to minimise fragmentation and
838 // peak memory usage.
839 for (aid = 0; aid < VG_N_ARENAS; aid++) {
840 Arena* arena = arenaId_to_ArenaP(aid);
841 if (arena->deferred_reclaimed_sb != NULL)
842 deferred_reclaimSuperblock (arena, NULL);
845 // Take into account admin bytes in the Superblock.
846 cszB += sizeof(Superblock);
848 if (cszB < a->min_sblock_szB) cszB = a->min_sblock_szB;
849 cszB = VG_PGROUNDUP(cszB);
851 if (cszB >= a->min_unsplittable_sblock_szB)
852 unsplittable = True;
853 else
854 unsplittable = False;
857 if (a->clientmem) {
858 // client allocation -- return 0 to client if it fails
859 sres = VG_(am_mmap_client_heap)
860 ( cszB, VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC );
861 if (sr_isError(sres))
862 return 0;
863 sb = (Superblock*)(Addr)sr_Res(sres);
864 } else {
865 // non-client allocation -- abort if it fails
866 sres = VG_(am_mmap_anon_float_valgrind)( cszB );
867 if (sr_isError(sres)) {
868 VG_(out_of_memory_NORETURN)("newSuperblock", cszB);
869 /* NOTREACHED */
870 sb = NULL; /* keep gcc happy */
871 } else {
872 sb = (Superblock*)(Addr)sr_Res(sres);
875 vg_assert(NULL != sb);
876 INNER_REQUEST(VALGRIND_MAKE_MEM_UNDEFINED(sb, cszB));
877 vg_assert(0 == (Addr)sb % VG_MIN_MALLOC_SZB);
878 sb->n_payload_bytes = cszB - sizeof(Superblock);
879 sb->unsplittable = (unsplittable ? sb : NULL);
880 a->stats__bytes_mmaped += cszB;
881 if (a->stats__bytes_mmaped > a->stats__bytes_mmaped_max)
882 a->stats__bytes_mmaped_max = a->stats__bytes_mmaped;
883 VG_(debugLog)(1, "mallocfree",
884 "newSuperblock at %p (pszB %7lu) %s owner %s/%s\n",
885 sb, sb->n_payload_bytes,
886 (unsplittable ? "unsplittable" : ""),
887 a->clientmem ? "CLIENT" : "VALGRIND", a->name );
888 return sb;
891 // Reclaims the given superblock:
892 // * removes sb from arena sblocks list.
893 // * munmap the superblock segment.
894 static
895 void reclaimSuperblock ( Arena* a, Superblock* sb)
897 SysRes sres;
898 SizeT cszB;
899 UInt i, j;
901 VG_(debugLog)(1, "mallocfree",
902 "reclaimSuperblock at %p (pszB %7lu) %s owner %s/%s\n",
903 sb, sb->n_payload_bytes,
904 (sb->unsplittable ? "unsplittable" : ""),
905 a->clientmem ? "CLIENT" : "VALGRIND", a->name );
907 // Take into account admin bytes in the Superblock.
908 cszB = sizeof(Superblock) + sb->n_payload_bytes;
910 // removes sb from superblock list.
911 for (i = 0; i < a->sblocks_used; i++) {
912 if (a->sblocks[i] == sb)
913 break;
915 vg_assert(i >= 0 && i < a->sblocks_used);
916 for (j = i; j < a->sblocks_used; j++)
917 a->sblocks[j] = a->sblocks[j+1];
918 a->sblocks_used--;
919 a->sblocks[a->sblocks_used] = NULL;
920 // paranoia: NULLify ptr to reclaimed sb or NULLify copy of ptr to last sb.
922 a->stats__bytes_mmaped -= cszB;
923 if (sb->unsplittable)
924 a->stats__nreclaim_unsplit++;
925 else
926 a->stats__nreclaim_split++;
928 // Now that the sb is removed from the list, mnumap its space.
929 if (a->clientmem) {
930 // reclaimable client allocation
931 Bool need_discard = False;
932 sres = VG_(am_munmap_client)(&need_discard, (Addr) sb, cszB);
933 vg_assert2(! sr_isError(sres), "superblock client munmap failure\n");
934 /* We somewhat help the client by discarding the range.
935 Note however that if the client has JITted some code in
936 a small block that was freed, we do not provide this
937 'discard support' */
938 /* JRS 2011-Sept-26: it would be nice to move the discard
939 outwards somewhat (in terms of calls) so as to make it easier
940 to verify that there will be no nonterminating recursive set
941 of calls a result of calling VG_(discard_translations).
942 Another day, perhaps. */
943 if (need_discard)
944 VG_(discard_translations) ((Addr) sb, cszB, "reclaimSuperblock");
945 } else {
946 // reclaimable non-client allocation
947 sres = VG_(am_munmap_valgrind)((Addr) sb, cszB);
948 vg_assert2(! sr_isError(sres), "superblock valgrind munmap failure\n");
953 // Find the superblock containing the given chunk.
954 static
955 Superblock* findSb ( Arena* a, Block* b )
957 SizeT min = 0;
958 SizeT max = a->sblocks_used;
960 while (min <= max) {
961 Superblock * sb;
962 SizeT pos = min + (max - min)/2;
964 vg_assert(pos >= 0 && pos < a->sblocks_used);
965 sb = a->sblocks[pos];
966 if ((Block*)&sb->payload_bytes[0] <= b
967 && b < (Block*)&sb->payload_bytes[sb->n_payload_bytes])
969 return sb;
970 } else if ((Block*)&sb->payload_bytes[0] <= b) {
971 min = pos + 1;
972 } else {
973 max = pos - 1;
976 VG_(printf)("findSb: can't find pointer %p in arena '%s'\n",
977 b, a->name );
978 VG_(core_panic)("findSb: VG_(arena_free)() in wrong arena?");
979 return NULL; /*NOTREACHED*/
983 // Find the superblock containing the given address.
984 // If superblock not found, return NULL.
985 static
986 Superblock* maybe_findSb ( Arena* a, Addr ad )
988 SizeT min = 0;
989 SizeT max = a->sblocks_used;
991 while (min <= max) {
992 Superblock * sb;
993 SizeT pos = min + (max - min)/2;
994 if (pos < 0 || pos >= a->sblocks_used)
995 return NULL;
996 sb = a->sblocks[pos];
997 if ((Addr)&sb->payload_bytes[0] <= ad
998 && ad < (Addr)&sb->payload_bytes[sb->n_payload_bytes]) {
999 return sb;
1000 } else if ((Addr)&sb->payload_bytes[0] <= ad) {
1001 min = pos + 1;
1002 } else {
1003 max = pos - 1;
1006 return NULL;
1010 /*------------------------------------------------------------*/
1011 /*--- Functions for working with freelists. ---*/
1012 /*------------------------------------------------------------*/
1014 // Nb: Determination of which freelist a block lives on is based on the
1015 // payload size, not block size.
1017 // Convert a payload size in bytes to a freelist number.
1018 static __attribute__((noinline))
1019 UInt pszB_to_listNo_SLOW ( SizeT pszB__divided_by__VG_MIN_MALLOC_SZB )
1021 SizeT n = pszB__divided_by__VG_MIN_MALLOC_SZB;
1023 if (n < 299) {
1024 if (n < 114) {
1025 if (n < 85) {
1026 if (n < 74) {
1027 /* -- Exponential slope up, factor 1.05 -- */
1028 if (n < 67) return 64;
1029 if (n < 70) return 65;
1030 /* else */ return 66;
1031 } else {
1032 if (n < 77) return 67;
1033 if (n < 81) return 68;
1034 /* else */ return 69;
1036 } else {
1037 if (n < 99) {
1038 if (n < 90) return 70;
1039 if (n < 94) return 71;
1040 /* else */ return 72;
1041 } else {
1042 if (n < 104) return 73;
1043 if (n < 109) return 74;
1044 /* else */ return 75;
1047 } else {
1048 if (n < 169) {
1049 if (n < 133) {
1050 if (n < 120) return 76;
1051 if (n < 126) return 77;
1052 /* else */ return 78;
1053 } else {
1054 if (n < 139) return 79;
1055 /* -- Exponential slope up, factor 1.10 -- */
1056 if (n < 153) return 80;
1057 /* else */ return 81;
1059 } else {
1060 if (n < 224) {
1061 if (n < 185) return 82;
1062 if (n < 204) return 83;
1063 /* else */ return 84;
1064 } else {
1065 if (n < 247) return 85;
1066 if (n < 272) return 86;
1067 /* else */ return 87;
1071 } else {
1072 if (n < 1331) {
1073 if (n < 530) {
1074 if (n < 398) {
1075 if (n < 329) return 88;
1076 if (n < 362) return 89;
1077 /* else */ return 90;
1078 } else {
1079 if (n < 438) return 91;
1080 if (n < 482) return 92;
1081 /* else */ return 93;
1083 } else {
1084 if (n < 770) {
1085 if (n < 583) return 94;
1086 if (n < 641) return 95;
1087 /* -- Exponential slope up, factor 1.20 -- */
1088 /* else */ return 96;
1089 } else {
1090 if (n < 924) return 97;
1091 if (n < 1109) return 98;
1092 /* else */ return 99;
1095 } else {
1096 if (n < 3974) {
1097 if (n < 2300) {
1098 if (n < 1597) return 100;
1099 if (n < 1916) return 101;
1100 return 102;
1101 } else {
1102 if (n < 2760) return 103;
1103 if (n < 3312) return 104;
1104 /* else */ return 105;
1106 } else {
1107 if (n < 6868) {
1108 if (n < 4769) return 106;
1109 if (n < 5723) return 107;
1110 /* else */ return 108;
1111 } else {
1112 if (n < 8241) return 109;
1113 if (n < 9890) return 110;
1114 /* else */ return 111;
1119 /*NOTREACHED*/
1120 vg_assert(0);
1123 static inline
1124 UInt pszB_to_listNo ( SizeT pszB )
1126 SizeT n = pszB / VG_MIN_MALLOC_SZB;
1127 vg_assert(0 == (pszB % VG_MIN_MALLOC_SZB));
1129 // The first 64 lists hold blocks of size VG_MIN_MALLOC_SZB * list_num.
1130 // The final 48 hold bigger blocks and are dealt with by the _SLOW
1131 // case.
1132 if (LIKELY(n < 64)) {
1133 return (UInt)n;
1134 } else {
1135 return pszB_to_listNo_SLOW(n);
1139 // What is the minimum payload size for a given list?
1140 static
1141 SizeT listNo_to_pszB_min ( UInt listNo )
1143 /* Repeatedly computing this function at every request is
1144 expensive. Hence at the first call just cache the result for
1145 every possible argument. */
1146 static SizeT cache[N_MALLOC_LISTS];
1147 static Bool cache_valid = False;
1148 if (!cache_valid) {
1149 UInt i;
1150 for (i = 0; i < N_MALLOC_LISTS; i++) {
1151 SizeT pszB = 0;
1152 while (pszB_to_listNo(pszB) < i)
1153 pszB += VG_MIN_MALLOC_SZB;
1154 cache[i] = pszB;
1156 cache_valid = True;
1158 /* Returned cached answer. */
1159 vg_assert(listNo <= N_MALLOC_LISTS);
1160 return cache[listNo];
1163 // What is the maximum payload size for a given list?
1164 static
1165 SizeT listNo_to_pszB_max ( UInt listNo )
1167 vg_assert(listNo <= N_MALLOC_LISTS);
1168 if (listNo == N_MALLOC_LISTS-1) {
1169 return MAX_PSZB;
1170 } else {
1171 return listNo_to_pszB_min(listNo+1) - 1;
1176 /* A nasty hack to try and reduce fragmentation. Try and replace
1177 a->freelist[lno] with another block on the same list but with a
1178 lower address, with the idea of attempting to recycle the same
1179 blocks rather than cruise through the address space. */
1180 static
1181 void swizzle ( Arena* a, UInt lno )
1183 Block* p_best;
1184 Block* pp;
1185 Block* pn;
1186 UInt i;
1188 p_best = a->freelist[lno];
1189 if (p_best == NULL) return;
1191 pn = pp = p_best;
1193 // This loop bound was 20 for a long time, but experiments showed that
1194 // reducing it to 10 gave the same result in all the tests, and 5 got the
1195 // same result in 85--100% of cases. And it's called often enough to be
1196 // noticeable in programs that allocated a lot.
1197 for (i = 0; i < 5; i++) {
1198 pn = get_next_b(pn);
1199 pp = get_prev_b(pp);
1200 if (pn < p_best) p_best = pn;
1201 if (pp < p_best) p_best = pp;
1203 if (p_best < a->freelist[lno]) {
1204 # ifdef VERBOSE_MALLOC
1205 VG_(printf)("retreat by %ld\n", (Word)(a->freelist[lno] - p_best));
1206 # endif
1207 a->freelist[lno] = p_best;
1212 /*------------------------------------------------------------*/
1213 /*--- Sanity-check/debugging machinery. ---*/
1214 /*------------------------------------------------------------*/
1216 #define REDZONE_LO_MASK 0x31
1217 #define REDZONE_HI_MASK 0x7c
1219 // Do some crude sanity checks on a Block.
1220 static
1221 Bool blockSane ( Arena* a, Block* b )
1223 # define BLEAT(str) VG_(printf)("blockSane: fail -- %s\n",str)
1224 UInt i;
1225 // The lo and hi size fields will be checked (indirectly) by the call
1226 // to get_rz_hi_byte().
1227 if (!a->clientmem && is_inuse_block(b)) {
1228 // In the inner, for memcheck sake, temporarily mark redzone accessible.
1229 INNER_REQUEST(mkBhdrAccess(a,b));
1230 for (i = 0; i < a->rz_szB; i++) {
1231 if (get_rz_lo_byte(b, i) !=
1232 (UByte)(((Addr)b&0xff) ^ REDZONE_LO_MASK))
1233 {BLEAT("redzone-lo");return False;}
1234 if (get_rz_hi_byte(b, i) !=
1235 (UByte)(((Addr)b&0xff) ^ REDZONE_HI_MASK))
1236 {BLEAT("redzone-hi");return False;}
1238 INNER_REQUEST(mkBhdrNoAccess(a,b));
1240 return True;
1241 # undef BLEAT
1244 // Sanity checks on a Block inside an unsplittable superblock
1245 static
1246 Bool unsplittableBlockSane ( Arena* a, Superblock *sb, Block* b )
1248 # define BLEAT(str) VG_(printf)("unsplittableBlockSane: fail -- %s\n",str)
1249 Block* other_b;
1250 UByte* sb_start;
1251 UByte* sb_end;
1253 if (!blockSane (a, b))
1254 {BLEAT("blockSane");return False;}
1256 if (sb->unsplittable != sb)
1257 {BLEAT("unsplittable");return False;}
1259 sb_start = &sb->payload_bytes[0];
1260 sb_end = &sb->payload_bytes[sb->n_payload_bytes - 1];
1262 // b must be first block (i.e. no unused bytes at the beginning)
1263 if ((Block*)sb_start != b)
1264 {BLEAT("sb_start");return False;}
1266 // b must be last block (i.e. no unused bytes at the end)
1267 other_b = b + get_bszB(b);
1268 if (other_b-1 != (Block*)sb_end)
1269 {BLEAT("sb_end");return False;}
1271 return True;
1272 # undef BLEAT
1275 // Print superblocks (only for debugging).
1276 static
1277 void ppSuperblocks ( Arena* a )
1279 UInt i, j, blockno = 1;
1280 SizeT b_bszB;
1282 for (j = 0; j < a->sblocks_used; ++j) {
1283 Superblock * sb = a->sblocks[j];
1285 VG_(printf)( "\n" );
1286 VG_(printf)( "superblock %u at %p %s, sb->n_pl_bs = %lu\n",
1287 blockno++, sb, (sb->unsplittable ? "unsplittable" : ""),
1288 sb->n_payload_bytes);
1289 for (i = 0; i < sb->n_payload_bytes; i += b_bszB) {
1290 Block* b = (Block*)&sb->payload_bytes[i];
1291 b_bszB = get_bszB(b);
1292 VG_(printf)( " block at %u, bszB %lu: ", i, b_bszB );
1293 VG_(printf)( "%s, ", is_inuse_block(b) ? "inuse" : "free");
1294 VG_(printf)( "%s\n", blockSane(a, b) ? "ok" : "BAD" );
1296 vg_assert(i == sb->n_payload_bytes); // no overshoot at end of Sb
1298 VG_(printf)( "end of superblocks\n\n" );
1301 // Sanity check both the superblocks and the chains.
1302 static void sanity_check_malloc_arena ( ArenaId aid )
1304 UInt i, j, superblockctr, blockctr_sb, blockctr_li;
1305 UInt blockctr_sb_free, listno;
1306 SizeT b_bszB, b_pszB, list_min_pszB, list_max_pszB;
1307 Bool thisFree, lastWasFree, sblockarrOK;
1308 Block* b;
1309 Block* b_prev;
1310 SizeT arena_bytes_on_loan;
1311 Arena* a;
1313 # define BOMB VG_(core_panic)("sanity_check_malloc_arena")
1315 a = arenaId_to_ArenaP(aid);
1317 // Check the superblock array.
1318 sblockarrOK
1319 = a->sblocks != NULL
1320 && a->sblocks_size >= SBLOCKS_SIZE_INITIAL
1321 && a->sblocks_used <= a->sblocks_size
1322 && (a->sblocks_size == SBLOCKS_SIZE_INITIAL
1323 ? (a->sblocks == &a->sblocks_initial[0])
1324 : (a->sblocks != &a->sblocks_initial[0]));
1325 if (!sblockarrOK) {
1326 VG_(printf)("sanity_check_malloc_arena: sblock array BAD\n");
1327 BOMB;
1330 // First, traverse all the superblocks, inspecting the Blocks in each.
1331 superblockctr = blockctr_sb = blockctr_sb_free = 0;
1332 arena_bytes_on_loan = 0;
1333 for (j = 0; j < a->sblocks_used; ++j) {
1334 Superblock * sb = a->sblocks[j];
1335 lastWasFree = False;
1336 superblockctr++;
1337 for (i = 0; i < sb->n_payload_bytes; i += mk_plain_bszB(b_bszB)) {
1338 blockctr_sb++;
1339 b = (Block*)&sb->payload_bytes[i];
1340 b_bszB = get_bszB_as_is(b);
1341 if (!blockSane(a, b)) {
1342 VG_(printf)("sanity_check_malloc_arena: sb %p, block %u "
1343 "(bszB %lu): BAD\n", sb, i, b_bszB );
1344 BOMB;
1346 thisFree = !is_inuse_block(b);
1347 if (thisFree && lastWasFree) {
1348 VG_(printf)("sanity_check_malloc_arena: sb %p, block %u "
1349 "(bszB %lu): UNMERGED FREES\n", sb, i, b_bszB );
1350 BOMB;
1352 if (thisFree) blockctr_sb_free++;
1353 if (!thisFree)
1354 arena_bytes_on_loan += bszB_to_pszB(a, b_bszB);
1355 lastWasFree = thisFree;
1357 if (i > sb->n_payload_bytes) {
1358 VG_(printf)( "sanity_check_malloc_arena: sb %p: last block "
1359 "overshoots end\n", sb);
1360 BOMB;
1364 arena_bytes_on_loan += a->stats__perm_bytes_on_loan;
1366 if (arena_bytes_on_loan != a->stats__bytes_on_loan) {
1367 # ifdef VERBOSE_MALLOC
1368 VG_(printf)( "sanity_check_malloc_arena: a->bytes_on_loan %lu, "
1369 "arena_bytes_on_loan %lu: "
1370 "MISMATCH\n", a->stats__bytes_on_loan, arena_bytes_on_loan);
1371 # endif
1372 ppSuperblocks(a);
1373 BOMB;
1376 /* Second, traverse each list, checking that the back pointers make
1377 sense, counting blocks encountered, and checking that each block
1378 is an appropriate size for this list. */
1379 blockctr_li = 0;
1380 for (listno = 0; listno < N_MALLOC_LISTS; listno++) {
1381 list_min_pszB = listNo_to_pszB_min(listno);
1382 list_max_pszB = listNo_to_pszB_max(listno);
1383 b = a->freelist[listno];
1384 if (b == NULL) continue;
1385 while (True) {
1386 b_prev = b;
1387 b = get_next_b(b);
1388 if (get_prev_b(b) != b_prev) {
1389 VG_(printf)( "sanity_check_malloc_arena: list %u at %p: "
1390 "BAD LINKAGE\n",
1391 listno, b );
1392 BOMB;
1394 b_pszB = get_pszB(a, b);
1395 if (b_pszB < list_min_pszB || b_pszB > list_max_pszB) {
1396 VG_(printf)(
1397 "sanity_check_malloc_arena: list %u at %p: "
1398 "WRONG CHAIN SIZE %luB (%luB, %luB)\n",
1399 listno, b, b_pszB, list_min_pszB, list_max_pszB );
1400 BOMB;
1402 blockctr_li++;
1403 if (b == a->freelist[listno]) break;
1407 if (blockctr_sb_free != blockctr_li) {
1408 # ifdef VERBOSE_MALLOC
1409 VG_(printf)( "sanity_check_malloc_arena: BLOCK COUNT MISMATCH "
1410 "(via sbs %d, via lists %d)\n",
1411 blockctr_sb_free, blockctr_li );
1412 # endif
1413 ppSuperblocks(a);
1414 BOMB;
1417 if (VG_(clo_verbosity) > 2)
1418 VG_(message)(Vg_DebugMsg,
1419 "%-8s: %2u sbs, %5u bs, %2u/%-2u free bs, "
1420 "%7lu mmap, %7lu loan\n",
1421 a->name,
1422 superblockctr,
1423 blockctr_sb, blockctr_sb_free, blockctr_li,
1424 a->stats__bytes_mmaped, a->stats__bytes_on_loan);
1425 # undef BOMB
1429 #define N_AN_CCS 1000
1431 typedef struct {
1432 ULong nBytes;
1433 ULong nBlocks;
1434 const HChar* cc;
1435 } AnCC;
1437 static AnCC anCCs[N_AN_CCS];
1439 /* Sorting by decreasing cost center nBytes, to have the biggest
1440 cost centres at the top. */
1441 static Int cmp_AnCC_by_vol ( const void* v1, const void* v2 ) {
1442 const AnCC* ancc1 = v1;
1443 const AnCC* ancc2 = v2;
1444 if (ancc1->nBytes < ancc2->nBytes) return 1;
1445 if (ancc1->nBytes > ancc2->nBytes) return -1;
1446 return 0;
1449 static void cc_analyse_alloc_arena ( ArenaId aid )
1451 Word i, j, k;
1452 Arena* a;
1453 Block* b;
1454 Bool thisFree, lastWasFree;
1455 SizeT b_bszB;
1457 const HChar* cc;
1458 UInt n_ccs = 0;
1459 //return;
1460 a = arenaId_to_ArenaP(aid);
1461 if (a->name == NULL) {
1462 /* arena is not in use, is not initialised and will fail the
1463 sanity check that follows. */
1464 return;
1467 sanity_check_malloc_arena(aid);
1469 VG_(printf)(
1470 "-------- Arena \"%s\": %'lu/%'lu max/curr mmap'd, "
1471 "%llu/%llu unsplit/split sb unmmap'd, "
1472 "%'lu/%'lu max/curr on_loan %lu rzB --------\n",
1473 a->name, a->stats__bytes_mmaped_max, a->stats__bytes_mmaped,
1474 a->stats__nreclaim_unsplit, a->stats__nreclaim_split,
1475 a->stats__bytes_on_loan_max, a->stats__bytes_on_loan,
1476 a->rz_szB
1479 for (j = 0; j < a->sblocks_used; ++j) {
1480 Superblock * sb = a->sblocks[j];
1481 lastWasFree = False;
1482 for (i = 0; i < sb->n_payload_bytes; i += mk_plain_bszB(b_bszB)) {
1483 b = (Block*)&sb->payload_bytes[i];
1484 b_bszB = get_bszB_as_is(b);
1485 if (!blockSane(a, b)) {
1486 VG_(printf)("sanity_check_malloc_arena: sb %p, block %ld "
1487 "(bszB %lu): BAD\n", sb, i, b_bszB );
1488 vg_assert(0);
1490 thisFree = !is_inuse_block(b);
1491 if (thisFree && lastWasFree) {
1492 VG_(printf)("sanity_check_malloc_arena: sb %p, block %ld "
1493 "(bszB %lu): UNMERGED FREES\n", sb, i, b_bszB );
1494 vg_assert(0);
1496 lastWasFree = thisFree;
1498 if (thisFree) continue;
1500 if (VG_(clo_profile_heap))
1501 cc = get_cc(b);
1502 else
1503 cc = "(--profile-heap=yes for details)";
1504 if (0)
1505 VG_(printf)("block: inUse=%d pszB=%d cc=%s\n",
1506 (Int)(!thisFree),
1507 (Int)bszB_to_pszB(a, b_bszB),
1508 get_cc(b));
1509 vg_assert(cc);
1510 for (k = 0; k < n_ccs; k++) {
1511 vg_assert(anCCs[k].cc);
1512 if (0 == VG_(strcmp)(cc, anCCs[k].cc))
1513 break;
1515 vg_assert(k >= 0 && k <= n_ccs);
1517 if (k == n_ccs) {
1518 vg_assert(n_ccs < N_AN_CCS-1);
1519 n_ccs++;
1520 anCCs[k].nBytes = 0;
1521 anCCs[k].nBlocks = 0;
1522 anCCs[k].cc = cc;
1525 vg_assert(k >= 0 && k < n_ccs && k < N_AN_CCS);
1526 anCCs[k].nBytes += (ULong)bszB_to_pszB(a, b_bszB);
1527 anCCs[k].nBlocks++;
1529 if (i > sb->n_payload_bytes) {
1530 VG_(printf)( "sanity_check_malloc_arena: sb %p: last block "
1531 "overshoots end\n", sb);
1532 vg_assert(0);
1536 if (a->stats__perm_bytes_on_loan > 0) {
1537 vg_assert(n_ccs < N_AN_CCS-1);
1538 anCCs[n_ccs].nBytes = a->stats__perm_bytes_on_loan;
1539 anCCs[n_ccs].nBlocks = a->stats__perm_blocks;
1540 anCCs[n_ccs].cc = "perm_malloc";
1541 n_ccs++;
1544 VG_(ssort)( &anCCs[0], n_ccs, sizeof(anCCs[0]), cmp_AnCC_by_vol );
1546 for (k = 0; k < n_ccs; k++) {
1547 VG_(printf)("%'13llu in %'9llu: %s\n",
1548 anCCs[k].nBytes, anCCs[k].nBlocks, anCCs[k].cc );
1551 VG_(printf)("\n");
1555 void VG_(sanity_check_malloc_all) ( void )
1557 UInt i;
1558 for (i = 0; i < VG_N_ARENAS; i++) {
1559 if (i == VG_AR_CLIENT && !client_inited)
1560 continue;
1561 sanity_check_malloc_arena ( i );
1565 void VG_(describe_arena_addr) ( Addr a, AddrArenaInfo* aai )
1567 UInt i;
1568 Superblock *sb;
1569 Arena *arena;
1571 for (i = 0; i < VG_N_ARENAS; i++) {
1572 if (i == VG_AR_CLIENT && !client_inited)
1573 continue;
1574 arena = arenaId_to_ArenaP(i);
1575 sb = maybe_findSb( arena, a );
1576 if (sb != NULL) {
1577 Word j;
1578 SizeT b_bszB;
1579 Block *b = NULL;
1581 aai->aid = i;
1582 aai->name = arena->name;
1583 for (j = 0; j < sb->n_payload_bytes; j += mk_plain_bszB(b_bszB)) {
1584 b = (Block*)&sb->payload_bytes[j];
1585 b_bszB = get_bszB_as_is(b);
1586 if (a < (Addr)b + mk_plain_bszB(b_bszB))
1587 break;
1589 vg_assert (b);
1590 aai->block_szB = get_pszB(arena, b);
1591 aai->rwoffset = a - (Addr)get_block_payload(arena, b);
1592 aai->free = !is_inuse_block(b);
1593 return;
1596 aai->aid = 0;
1597 aai->name = NULL;
1598 aai->block_szB = 0;
1599 aai->rwoffset = 0;
1600 aai->free = False;
1603 /*------------------------------------------------------------*/
1604 /*--- Creating and deleting blocks. ---*/
1605 /*------------------------------------------------------------*/
1607 // Mark the bytes at b .. b+bszB-1 as not in use, and add them to the
1608 // relevant free list.
1610 static
1611 void mkFreeBlock ( Arena* a, Block* b, SizeT bszB, UInt b_lno )
1613 SizeT pszB = bszB_to_pszB(a, bszB);
1614 vg_assert(b_lno == pszB_to_listNo(pszB));
1615 INNER_REQUEST(VALGRIND_MAKE_MEM_UNDEFINED(b, bszB));
1616 // Set the size fields and indicate not-in-use.
1617 set_bszB(b, mk_free_bszB(bszB));
1619 // Add to the relevant list.
1620 if (a->freelist[b_lno] == NULL) {
1621 set_prev_b(b, b);
1622 set_next_b(b, b);
1623 a->freelist[b_lno] = b;
1624 } else {
1625 Block* b_prev = get_prev_b(a->freelist[b_lno]);
1626 Block* b_next = a->freelist[b_lno];
1627 set_next_b(b_prev, b);
1628 set_prev_b(b_next, b);
1629 set_next_b(b, b_next);
1630 set_prev_b(b, b_prev);
1632 # ifdef DEBUG_MALLOC
1633 (void)blockSane(a,b);
1634 # endif
1637 // Mark the bytes at b .. b+bszB-1 as in use, and set up the block
1638 // appropriately.
1639 static
1640 void mkInuseBlock ( Arena* a, Block* b, SizeT bszB )
1642 UInt i;
1643 vg_assert(bszB >= min_useful_bszB(a));
1644 INNER_REQUEST(VALGRIND_MAKE_MEM_UNDEFINED(b, bszB));
1645 set_bszB(b, mk_inuse_bszB(bszB));
1646 set_prev_b(b, NULL); // Take off freelist
1647 set_next_b(b, NULL); // ditto
1648 if (!a->clientmem) {
1649 for (i = 0; i < a->rz_szB; i++) {
1650 set_rz_lo_byte(b, i, (UByte)(((Addr)b&0xff) ^ REDZONE_LO_MASK));
1651 set_rz_hi_byte(b, i, (UByte)(((Addr)b&0xff) ^ REDZONE_HI_MASK));
1654 # ifdef DEBUG_MALLOC
1655 (void)blockSane(a,b);
1656 # endif
1659 // Mark the bytes at b .. b+bszB-1 as being part of a block that has been shrunk.
1660 static
1661 void shrinkInuseBlock ( Arena* a, Block* b, SizeT bszB )
1663 UInt i;
1665 vg_assert(bszB >= min_useful_bszB(a));
1666 INNER_REQUEST(mkBhdrAccess(a,b));
1667 set_bszB(b, mk_inuse_bszB(bszB));
1668 if (!a->clientmem) {
1669 for (i = 0; i < a->rz_szB; i++) {
1670 set_rz_lo_byte(b, i, (UByte)(((Addr)b&0xff) ^ REDZONE_LO_MASK));
1671 set_rz_hi_byte(b, i, (UByte)(((Addr)b&0xff) ^ REDZONE_HI_MASK));
1674 INNER_REQUEST(mkBhdrNoAccess(a,b));
1676 # ifdef DEBUG_MALLOC
1677 (void)blockSane(a,b);
1678 # endif
1681 // Remove a block from a given list. Does no sanity checking.
1682 static
1683 void unlinkBlock ( Arena* a, Block* b, UInt listno )
1685 vg_assert(listno < N_MALLOC_LISTS);
1686 if (get_prev_b(b) == b) {
1687 // Only one element in the list; treat it specially.
1688 vg_assert(get_next_b(b) == b);
1689 a->freelist[listno] = NULL;
1690 } else {
1691 Block* b_prev = get_prev_b(b);
1692 Block* b_next = get_next_b(b);
1693 a->freelist[listno] = b_prev;
1694 set_next_b(b_prev, b_next);
1695 set_prev_b(b_next, b_prev);
1696 swizzle ( a, listno );
1698 set_prev_b(b, NULL);
1699 set_next_b(b, NULL);
1703 /*------------------------------------------------------------*/
1704 /*--- Core-visible functions. ---*/
1705 /*------------------------------------------------------------*/
1707 // Align the request size.
1708 static __inline__
1709 SizeT align_req_pszB ( SizeT req_pszB )
1711 SizeT n = VG_MIN_MALLOC_SZB-1;
1712 return ((req_pszB + n) & (~n));
1715 static
1716 void add_one_block_to_stats (Arena* a, SizeT loaned)
1718 a->stats__bytes_on_loan += loaned;
1719 if (a->stats__bytes_on_loan > a->stats__bytes_on_loan_max) {
1720 a->stats__bytes_on_loan_max = a->stats__bytes_on_loan;
1721 if (a->stats__bytes_on_loan_max >= a->next_profile_at) {
1722 /* next profile after 10% more growth */
1723 a->next_profile_at
1724 = (SizeT)(
1725 (((ULong)a->stats__bytes_on_loan_max) * 105ULL) / 100ULL );
1726 if (VG_(clo_profile_heap))
1727 cc_analyse_alloc_arena(arenaP_to_ArenaId (a));
1730 a->stats__tot_blocks += (ULong)1;
1731 a->stats__tot_bytes += (ULong)loaned;
1734 /* Allocate a piece of memory of req_pszB bytes on the given arena.
1735 The function may return NULL if (and only if) aid == VG_AR_CLIENT.
1736 Otherwise, the function returns a non-NULL value. */
1737 void* VG_(arena_malloc) ( ArenaId aid, const HChar* cc, SizeT req_pszB )
1739 SizeT req_bszB, frag_bszB, b_bszB;
1740 UInt lno, i;
1741 Superblock* new_sb = NULL;
1742 Block* b = NULL;
1743 Arena* a;
1744 void* v;
1745 UWord stats__nsearches = 0;
1747 ensure_mm_init(aid);
1748 a = arenaId_to_ArenaP(aid);
1750 vg_assert(req_pszB < MAX_PSZB);
1751 req_pszB = align_req_pszB(req_pszB);
1752 req_bszB = pszB_to_bszB(a, req_pszB);
1754 // You must provide a cost-center name against which to charge
1755 // this allocation; it isn't optional.
1756 vg_assert(cc);
1758 // Scan through all the big-enough freelists for a block.
1760 // Nb: this scanning might be expensive in some cases. Eg. if you
1761 // allocate lots of small objects without freeing them, but no
1762 // medium-sized objects, it will repeatedly scanning through the whole
1763 // list, and each time not find any free blocks until the last element.
1765 // If this becomes a noticeable problem... the loop answers the question
1766 // "where is the first nonempty list above me?" And most of the time,
1767 // you ask the same question and get the same answer. So it would be
1768 // good to somehow cache the results of previous searches.
1769 // One possibility is an array (with N_MALLOC_LISTS elements) of
1770 // shortcuts. shortcut[i] would give the index number of the nearest
1771 // larger list above list i which is non-empty. Then this loop isn't
1772 // necessary. However, we'd have to modify some section [ .. i-1] of the
1773 // shortcut array every time a list [i] changes from empty to nonempty or
1774 // back. This would require care to avoid pathological worst-case
1775 // behaviour.
1777 for (lno = pszB_to_listNo(req_pszB); lno < N_MALLOC_LISTS; lno++) {
1778 UWord nsearches_this_level = 0;
1779 b = a->freelist[lno];
1780 if (NULL == b) continue; // If this list is empty, try the next one.
1781 while (True) {
1782 stats__nsearches++;
1783 nsearches_this_level++;
1784 if (UNLIKELY(nsearches_this_level >= 100)
1785 && lno < N_MALLOC_LISTS-1) {
1786 /* Avoid excessive scanning on this freelist, and instead
1787 try the next one up. But first, move this freelist's
1788 start pointer one element along, so as to ensure that
1789 subsequent searches of this list don't endlessly
1790 revisit only these 100 elements, but in fact slowly
1791 progress through the entire list. */
1792 b = a->freelist[lno];
1793 vg_assert(b); // this list must be nonempty!
1794 a->freelist[lno] = get_next_b(b); // step one along
1795 break;
1797 b_bszB = get_bszB(b);
1798 if (b_bszB >= req_bszB) goto obtained_block; // success!
1799 b = get_next_b(b);
1800 if (b == a->freelist[lno]) break; // traversed entire freelist
1804 // If we reach here, no suitable block found, allocate a new superblock
1805 vg_assert(lno == N_MALLOC_LISTS);
1806 new_sb = newSuperblock(a, req_bszB);
1807 if (NULL == new_sb) {
1808 // Should only fail if for client, otherwise, should have aborted
1809 // already.
1810 vg_assert(VG_AR_CLIENT == aid);
1811 return NULL;
1814 vg_assert(a->sblocks_used <= a->sblocks_size);
1815 if (a->sblocks_used == a->sblocks_size) {
1816 Superblock ** array;
1817 SysRes sres = VG_(am_mmap_anon_float_valgrind)(sizeof(Superblock *) *
1818 a->sblocks_size * 2);
1819 if (sr_isError(sres)) {
1820 VG_(out_of_memory_NORETURN)("arena_init", sizeof(Superblock *) *
1821 a->sblocks_size * 2);
1822 /* NOTREACHED */
1824 array = (Superblock**)(Addr)sr_Res(sres);
1825 for (i = 0; i < a->sblocks_used; ++i) array[i] = a->sblocks[i];
1827 a->sblocks_size *= 2;
1828 a->sblocks = array;
1829 VG_(debugLog)(1, "mallocfree",
1830 "sblock array for arena `%s' resized to %lu\n",
1831 a->name, a->sblocks_size);
1834 vg_assert(a->sblocks_used < a->sblocks_size);
1836 i = a->sblocks_used;
1837 while (i > 0) {
1838 if (a->sblocks[i-1] > new_sb) {
1839 a->sblocks[i] = a->sblocks[i-1];
1840 } else {
1841 break;
1843 --i;
1845 a->sblocks[i] = new_sb;
1846 a->sblocks_used++;
1848 b = (Block*)&new_sb->payload_bytes[0];
1849 lno = pszB_to_listNo(bszB_to_pszB(a, new_sb->n_payload_bytes));
1850 mkFreeBlock ( a, b, new_sb->n_payload_bytes, lno);
1851 if (VG_(clo_profile_heap))
1852 set_cc(b, "admin.free-new-sb-1");
1853 // fall through
1855 obtained_block:
1856 // Ok, we can allocate from b, which lives in list lno.
1857 vg_assert(b != NULL);
1858 vg_assert(lno < N_MALLOC_LISTS);
1859 vg_assert(a->freelist[lno] != NULL);
1860 b_bszB = get_bszB(b);
1861 // req_bszB is the size of the block we are after. b_bszB is the
1862 // size of what we've actually got. */
1863 vg_assert(b_bszB >= req_bszB);
1865 // Could we split this block and still get a useful fragment?
1866 // A block in an unsplittable superblock can never be split.
1867 frag_bszB = b_bszB - req_bszB;
1868 if (frag_bszB >= min_useful_bszB(a)
1869 && (NULL == new_sb || ! new_sb->unsplittable)) {
1870 // Yes, split block in two, put the fragment on the appropriate free
1871 // list, and update b_bszB accordingly.
1872 // printf( "split %dB into %dB and %dB\n", b_bszB, req_bszB, frag_bszB );
1873 unlinkBlock(a, b, lno);
1874 mkInuseBlock(a, b, req_bszB);
1875 if (VG_(clo_profile_heap))
1876 set_cc(b, cc);
1877 mkFreeBlock(a, &b[req_bszB], frag_bszB,
1878 pszB_to_listNo(bszB_to_pszB(a, frag_bszB)));
1879 if (VG_(clo_profile_heap))
1880 set_cc(&b[req_bszB], "admin.fragmentation-1");
1881 b_bszB = get_bszB(b);
1882 } else {
1883 // No, mark as in use and use as-is.
1884 unlinkBlock(a, b, lno);
1885 mkInuseBlock(a, b, b_bszB);
1886 if (VG_(clo_profile_heap))
1887 set_cc(b, cc);
1890 // Update stats
1891 SizeT loaned = bszB_to_pszB(a, b_bszB);
1892 add_one_block_to_stats (a, loaned);
1893 a->stats__nsearches += (ULong)stats__nsearches;
1895 # ifdef DEBUG_MALLOC
1896 sanity_check_malloc_arena(aid);
1897 # endif
1899 v = get_block_payload(a, b);
1900 vg_assert( (((Addr)v) & (VG_MIN_MALLOC_SZB-1)) == 0 );
1902 // Which size should we pass to VALGRIND_MALLOCLIKE_BLOCK ?
1903 // We have 2 possible options:
1904 // 1. The final resulting usable size.
1905 // 2. The initial (non-aligned) req_pszB.
1906 // Memcheck implements option 2 easily, as the initial requested size
1907 // is maintained in the mc_chunk data structure.
1908 // This is not as easy in the core, as there is no such structure.
1909 // (note: using the aligned req_pszB is not simpler than 2, as
1910 // requesting an aligned req_pszB might still be satisfied by returning
1911 // a (slightly) bigger block than requested if the remaining part of
1912 // of a free block is not big enough to make a free block by itself).
1913 // Implement Sol 2 can be done the following way:
1914 // After having called VALGRIND_MALLOCLIKE_BLOCK, the non accessible
1915 // redzone just after the block can be used to determine the
1916 // initial requested size.
1917 // Currently, not implemented => we use Option 1.
1918 INNER_REQUEST
1919 (VALGRIND_MALLOCLIKE_BLOCK(v,
1920 VG_(arena_malloc_usable_size)(aid, v),
1921 a->rz_szB, False));
1923 /* For debugging/testing purposes, fill the newly allocated area
1924 with a definite value in an attempt to shake out any
1925 uninitialised uses of the data (by V core / V tools, not by the
1926 client). Testing on 25 Nov 07 with the values 0x00, 0xFF, 0x55,
1927 0xAA showed no differences in the regression tests on
1928 amd64-linux. Note, is disabled by default. */
1929 if (0 && aid != VG_AR_CLIENT)
1930 VG_(memset)(v, 0xAA, (SizeT)req_pszB);
1932 return v;
1935 // If arena has already a deferred reclaimed superblock and
1936 // this superblock is still reclaimable, then this superblock is first
1937 // reclaimed.
1938 // sb becomes then the new arena deferred superblock.
1939 // Passing NULL as sb allows to reclaim a deferred sb without setting a new
1940 // deferred reclaim.
1941 static
1942 void deferred_reclaimSuperblock ( Arena* a, Superblock* sb)
1945 if (sb == NULL) {
1946 if (!a->deferred_reclaimed_sb)
1947 // no deferred sb to reclaim now, nothing to do in the future =>
1948 // return directly.
1949 return;
1951 VG_(debugLog)(1, "mallocfree",
1952 "deferred_reclaimSuperblock NULL "
1953 "(prev %p) owner %s/%s\n",
1954 a->deferred_reclaimed_sb,
1955 a->clientmem ? "CLIENT" : "VALGRIND", a->name );
1956 } else
1957 VG_(debugLog)(1, "mallocfree",
1958 "deferred_reclaimSuperblock at %p (pszB %7lu) %s "
1959 "(prev %p) owner %s/%s\n",
1960 sb, sb->n_payload_bytes,
1961 (sb->unsplittable ? "unsplittable" : ""),
1962 a->deferred_reclaimed_sb,
1963 a->clientmem ? "CLIENT" : "VALGRIND", a->name );
1965 if (a->deferred_reclaimed_sb && a->deferred_reclaimed_sb != sb) {
1966 // If we are deferring another block that the current block deferred,
1967 // then if this block can stil be reclaimed, reclaim it now.
1968 // Note that we might have a re-deferred reclaim of the same block
1969 // with a sequence: free (causing a deferred reclaim of sb)
1970 // alloc (using a piece of memory of the deferred sb)
1971 // free of the just alloc-ed block (causing a re-defer).
1972 UByte* def_sb_start;
1973 UByte* def_sb_end;
1974 Superblock* def_sb;
1975 Block* b;
1977 def_sb = a->deferred_reclaimed_sb;
1978 def_sb_start = &def_sb->payload_bytes[0];
1979 def_sb_end = &def_sb->payload_bytes[def_sb->n_payload_bytes - 1];
1980 b = (Block *)def_sb_start;
1981 vg_assert (blockSane(a, b));
1983 // Check if the deferred_reclaimed_sb is still reclaimable.
1984 // If yes, we will execute the reclaim.
1985 if (!is_inuse_block(b)) {
1986 // b (at the beginning of def_sb) is not in use.
1987 UInt b_listno;
1988 SizeT b_bszB, b_pszB;
1989 b_bszB = get_bszB(b);
1990 b_pszB = bszB_to_pszB(a, b_bszB);
1991 if (b + b_bszB-1 == (Block*)def_sb_end) {
1992 // b (not in use) covers the full superblock.
1993 // => def_sb is still reclaimable
1994 // => execute now the reclaim of this def_sb.
1995 b_listno = pszB_to_listNo(b_pszB);
1996 unlinkBlock( a, b, b_listno );
1997 reclaimSuperblock (a, def_sb);
1998 a->deferred_reclaimed_sb = NULL;
2003 // sb (possibly NULL) becomes the new deferred reclaimed superblock.
2004 a->deferred_reclaimed_sb = sb;
2007 /* b must be a free block, of size b_bszB.
2008 If b is followed by another free block, merge them.
2009 If b is preceded by another free block, merge them.
2010 If the merge results in the superblock being fully free,
2011 deferred_reclaimSuperblock the superblock. */
2012 static void mergeWithFreeNeighbours (Arena* a, Superblock* sb,
2013 Block* b, SizeT b_bszB)
2015 UByte* sb_start;
2016 UByte* sb_end;
2017 Block* other_b;
2018 SizeT other_bszB;
2019 UInt b_listno;
2021 sb_start = &sb->payload_bytes[0];
2022 sb_end = &sb->payload_bytes[sb->n_payload_bytes - 1];
2024 b_listno = pszB_to_listNo(bszB_to_pszB(a, b_bszB));
2026 // See if this block can be merged with its successor.
2027 // First test if we're far enough before the superblock's end to possibly
2028 // have a successor.
2029 other_b = b + b_bszB;
2030 if (other_b+min_useful_bszB(a)-1 <= (Block*)sb_end) {
2031 // Ok, we have a successor, merge if it's not in use.
2032 other_bszB = get_bszB(other_b);
2033 if (!is_inuse_block(other_b)) {
2034 // VG_(printf)( "merge-successor\n");
2035 # ifdef DEBUG_MALLOC
2036 vg_assert(blockSane(a, other_b));
2037 # endif
2038 unlinkBlock( a, b, b_listno );
2039 unlinkBlock( a, other_b,
2040 pszB_to_listNo(bszB_to_pszB(a,other_bszB)) );
2041 b_bszB += other_bszB;
2042 b_listno = pszB_to_listNo(bszB_to_pszB(a, b_bszB));
2043 mkFreeBlock( a, b, b_bszB, b_listno );
2044 if (VG_(clo_profile_heap))
2045 set_cc(b, "admin.free-2");
2047 } else {
2048 // Not enough space for successor: check that b is the last block
2049 // ie. there are no unused bytes at the end of the Superblock.
2050 vg_assert(other_b-1 == (Block*)sb_end);
2053 // Then see if this block can be merged with its predecessor.
2054 // First test if we're far enough after the superblock's start to possibly
2055 // have a predecessor.
2056 if (b >= (Block*)sb_start + min_useful_bszB(a)) {
2057 // Ok, we have a predecessor, merge if it's not in use.
2058 other_b = get_predecessor_block( b );
2059 other_bszB = get_bszB(other_b);
2060 if (!is_inuse_block(other_b)) {
2061 // VG_(printf)( "merge-predecessor\n");
2062 unlinkBlock( a, b, b_listno );
2063 unlinkBlock( a, other_b,
2064 pszB_to_listNo(bszB_to_pszB(a, other_bszB)) );
2065 b = other_b;
2066 b_bszB += other_bszB;
2067 b_listno = pszB_to_listNo(bszB_to_pszB(a, b_bszB));
2068 mkFreeBlock( a, b, b_bszB, b_listno );
2069 if (VG_(clo_profile_heap))
2070 set_cc(b, "admin.free-3");
2072 } else {
2073 // Not enough space for predecessor: check that b is the first block,
2074 // ie. there are no unused bytes at the start of the Superblock.
2075 vg_assert((Block*)sb_start == b);
2078 /* If the block b just merged is the only block of the superblock sb,
2079 then we defer reclaim sb. */
2080 if ( ((Block*)sb_start == b) && (b + b_bszB-1 == (Block*)sb_end) ) {
2081 deferred_reclaimSuperblock (a, sb);
2085 void VG_(arena_free) ( ArenaId aid, void* ptr )
2087 Superblock* sb;
2088 Block* b;
2089 SizeT b_bszB, b_pszB;
2090 UInt b_listno;
2091 Arena* a;
2093 ensure_mm_init(aid);
2094 a = arenaId_to_ArenaP(aid);
2096 if (ptr == NULL) {
2097 return;
2100 b = get_payload_block(a, ptr);
2102 /* If this is one of V's areas, check carefully the block we're
2103 getting back. This picks up simple block-end overruns. */
2104 if (aid != VG_AR_CLIENT)
2105 vg_assert(is_inuse_block(b) && blockSane(a, b));
2107 b_bszB = get_bszB(b);
2108 b_pszB = bszB_to_pszB(a, b_bszB);
2109 sb = findSb( a, b );
2111 a->stats__bytes_on_loan -= b_pszB;
2113 /* If this is one of V's areas, fill it up with junk to enhance the
2114 chances of catching any later reads of it. Note, 0xDD is
2115 carefully chosen junk :-), in that: (1) 0xDDDDDDDD is an invalid
2116 and non-word-aligned address on most systems, and (2) 0xDD is a
2117 value which is unlikely to be generated by the new compressed
2118 Vbits representation for memcheck. */
2119 if (aid != VG_AR_CLIENT)
2120 VG_(memset)(ptr, 0xDD, (SizeT)b_pszB);
2122 if (! sb->unsplittable) {
2123 // Put this chunk back on a list somewhere.
2124 b_listno = pszB_to_listNo(b_pszB);
2125 mkFreeBlock( a, b, b_bszB, b_listno );
2126 if (VG_(clo_profile_heap))
2127 set_cc(b, "admin.free-1");
2129 /* Possibly merge b with its predecessor or successor. */
2130 mergeWithFreeNeighbours (a, sb, b, b_bszB);
2132 // Inform that ptr has been released. We give redzone size
2133 // 0 instead of a->rz_szB as proper accessibility is done just after.
2134 INNER_REQUEST(VALGRIND_FREELIKE_BLOCK(ptr, 0));
2136 // We need to (re-)establish the minimum accessibility needed
2137 // for free list management. E.g. if block ptr has been put in a free
2138 // list and a neighbour block is released afterwards, the
2139 // "lo" and "hi" portions of the block ptr will be accessed to
2140 // glue the 2 blocks together.
2141 // We could mark the whole block as not accessible, and each time
2142 // transiently mark accessible the needed lo/hi parts. Not done as this
2143 // is quite complex, for very little expected additional bug detection.
2144 // fully unaccessible. Note that the below marks the (possibly) merged
2145 // block, not the block corresponding to the ptr argument.
2147 // First mark the whole block unaccessible.
2148 INNER_REQUEST(VALGRIND_MAKE_MEM_NOACCESS(b, b_bszB));
2149 // Then mark the relevant administrative headers as defined.
2150 // No need to mark the heap profile portion as defined, this is not
2151 // used for free blocks.
2152 INNER_REQUEST(VALGRIND_MAKE_MEM_DEFINED(b + hp_overhead_szB(),
2153 sizeof(SizeT) + sizeof(void*)));
2154 INNER_REQUEST(VALGRIND_MAKE_MEM_DEFINED(b + b_bszB
2155 - sizeof(SizeT) - sizeof(void*),
2156 sizeof(SizeT) + sizeof(void*)));
2157 } else {
2158 vg_assert(unsplittableBlockSane(a, sb, b));
2160 // Inform that ptr has been released. Redzone size value
2161 // is not relevant (so we give 0 instead of a->rz_szB)
2162 // as it is expected that the aspacemgr munmap will be used by
2163 // outer to mark the whole superblock as unaccessible.
2164 INNER_REQUEST(VALGRIND_FREELIKE_BLOCK(ptr, 0));
2166 // Reclaim immediately the unsplittable superblock sb.
2167 reclaimSuperblock (a, sb);
2170 # ifdef DEBUG_MALLOC
2171 sanity_check_malloc_arena(aid);
2172 # endif
2178 The idea for malloc_aligned() is to allocate a big block, base, and
2179 then split it into two parts: frag, which is returned to the free
2180 pool, and align, which is the bit we're really after. Here's
2181 a picture. L and H denote the block lower and upper overheads, in
2182 bytes. The details are gruesome. Note it is slightly complicated
2183 because the initial request to generate base may return a bigger
2184 block than we asked for, so it is important to distinguish the base
2185 request size and the base actual size.
2187 frag_b align_b
2189 | frag_p | align_p
2190 | | | |
2191 v v v v
2193 +---+ +---+---+ +---+
2194 | L |----------------| H | L |---------------| H |
2195 +---+ +---+---+ +---+
2197 ^ ^ ^
2198 | | :
2199 | base_p this addr must be aligned
2201 base_b
2203 . . . . . . .
2204 <------ frag_bszB -------> . . .
2205 . <------------- base_pszB_act -----------> .
2206 . . . . . . .
2209 void* VG_(arena_memalign) ( ArenaId aid, const HChar* cc,
2210 SizeT req_alignB, SizeT req_pszB )
2212 SizeT base_pszB_req, base_pszB_act, frag_bszB;
2213 Block *base_b, *align_b;
2214 UByte *base_p, *align_p;
2215 SizeT saved_bytes_on_loan;
2216 Arena* a;
2218 ensure_mm_init(aid);
2219 a = arenaId_to_ArenaP(aid);
2221 vg_assert(req_pszB < MAX_PSZB);
2223 // You must provide a cost-center name against which to charge
2224 // this allocation; it isn't optional.
2225 vg_assert(cc);
2227 // Check that the requested alignment has a plausible size.
2228 // Check that the requested alignment seems reasonable; that is, is
2229 // a power of 2.
2230 if (req_alignB < VG_MIN_MALLOC_SZB
2231 || req_alignB > 16 * 1024 * 1024
2232 || VG_(log2)( req_alignB ) == -1 /* not a power of 2 */) {
2233 VG_(printf)("VG_(arena_memalign)(%p, %lu, %lu)\n"
2234 "bad alignment value %lu\n"
2235 "(it is too small, too big, or not a power of two)",
2236 a, req_alignB, req_pszB, req_alignB );
2237 VG_(core_panic)("VG_(arena_memalign)");
2238 /*NOTREACHED*/
2240 // Paranoid
2241 vg_assert(req_alignB % VG_MIN_MALLOC_SZB == 0);
2243 /* Required payload size for the aligned chunk. */
2244 req_pszB = align_req_pszB(req_pszB);
2246 /* Payload size to request for the big block that we will split up. */
2247 base_pszB_req = req_pszB + min_useful_bszB(a) + req_alignB;
2249 /* Payload ptr for the block we are going to split. Note this
2250 changes a->bytes_on_loan; we save and restore it ourselves. */
2251 saved_bytes_on_loan = a->stats__bytes_on_loan;
2253 /* As we will split the block given back by VG_(arena_malloc),
2254 we have to (temporarily) disable unsplittable for this arena,
2255 as unsplittable superblocks cannot be split. */
2256 const SizeT save_min_unsplittable_sblock_szB
2257 = a->min_unsplittable_sblock_szB;
2258 a->min_unsplittable_sblock_szB = MAX_PSZB;
2259 base_p = VG_(arena_malloc) ( aid, cc, base_pszB_req );
2260 a->min_unsplittable_sblock_szB = save_min_unsplittable_sblock_szB;
2262 a->stats__bytes_on_loan = saved_bytes_on_loan;
2264 /* Give up if we couldn't allocate enough space */
2265 if (base_p == 0)
2266 return 0;
2267 /* base_p was marked as allocated by VALGRIND_MALLOCLIKE_BLOCK
2268 inside VG_(arena_malloc). We need to indicate it is free, then
2269 we need to mark it undefined to allow the below code to access is. */
2270 INNER_REQUEST(VALGRIND_FREELIKE_BLOCK(base_p, a->rz_szB));
2271 INNER_REQUEST(VALGRIND_MAKE_MEM_UNDEFINED(base_p, base_pszB_req));
2273 /* Block ptr for the block we are going to split. */
2274 base_b = get_payload_block ( a, base_p );
2276 /* Pointer to the payload of the aligned block we are going to
2277 return. This has to be suitably aligned. */
2278 align_p = align_upwards ( base_b + 2 * overhead_szB_lo(a)
2279 + overhead_szB_hi(a),
2280 req_alignB );
2281 align_b = get_payload_block(a, align_p);
2283 /* The block size of the fragment we will create. This must be big
2284 enough to actually create a fragment. */
2285 frag_bszB = align_b - base_b;
2287 vg_assert(frag_bszB >= min_useful_bszB(a));
2289 /* The actual payload size of the block we are going to split. */
2290 base_pszB_act = get_pszB(a, base_b);
2292 /* Create the fragment block, and put it back on the relevant free list. */
2293 mkFreeBlock ( a, base_b, frag_bszB,
2294 pszB_to_listNo(bszB_to_pszB(a, frag_bszB)) );
2295 if (VG_(clo_profile_heap))
2296 set_cc(base_b, "admin.frag-memalign-1");
2298 /* Create the aligned block. */
2299 mkInuseBlock ( a, align_b,
2300 base_p + base_pszB_act
2301 + overhead_szB_hi(a) - (UByte*)align_b );
2302 if (VG_(clo_profile_heap))
2303 set_cc(align_b, cc);
2305 /* Final sanity checks. */
2306 vg_assert( is_inuse_block(get_payload_block(a, align_p)) );
2308 vg_assert(req_pszB <= get_pszB(a, get_payload_block(a, align_p)));
2310 a->stats__bytes_on_loan += get_pszB(a, get_payload_block(a, align_p));
2311 if (a->stats__bytes_on_loan > a->stats__bytes_on_loan_max) {
2312 a->stats__bytes_on_loan_max = a->stats__bytes_on_loan;
2314 /* a->stats__tot_blocks, a->stats__tot_bytes, a->stats__nsearches
2315 are updated by the call to VG_(arena_malloc) just a few lines
2316 above. So we don't need to update them here. */
2318 # ifdef DEBUG_MALLOC
2319 sanity_check_malloc_arena(aid);
2320 # endif
2322 vg_assert( (((Addr)align_p) % req_alignB) == 0 );
2324 INNER_REQUEST(VALGRIND_MALLOCLIKE_BLOCK(align_p,
2325 req_pszB, a->rz_szB, False));
2327 return align_p;
2331 SizeT VG_(arena_malloc_usable_size) ( ArenaId aid, void* ptr )
2333 Arena* a = arenaId_to_ArenaP(aid);
2334 Block* b = get_payload_block(a, ptr);
2335 return get_pszB(a, b);
2339 // Implementation of mallinfo(). There is no recent standard that defines
2340 // the behavior of mallinfo(). The meaning of the fields in struct mallinfo
2341 // is as follows:
2343 // struct mallinfo {
2344 // int arena; /* total space in arena */
2345 // int ordblks; /* number of ordinary blocks */
2346 // int smblks; /* number of small blocks */
2347 // int hblks; /* number of holding blocks */
2348 // int hblkhd; /* space in holding block headers */
2349 // int usmblks; /* space in small blocks in use */
2350 // int fsmblks; /* space in free small blocks */
2351 // int uordblks; /* space in ordinary blocks in use */
2352 // int fordblks; /* space in free ordinary blocks */
2353 // int keepcost; /* space penalty if keep option */
2354 // /* is used */
2355 // };
2357 // The glibc documentation about mallinfo (which is somewhat outdated) can
2358 // be found here:
2359 // http://www.gnu.org/software/libtool/manual/libc/Statistics-of-Malloc.html
2361 // See also http://bugs.kde.org/show_bug.cgi?id=160956.
2363 // Regarding the implementation of VG_(mallinfo)(): we cannot return the
2364 // whole struct as the library function does, because this is called by a
2365 // client request. So instead we use a pointer to do call by reference.
2366 void VG_(mallinfo) ( ThreadId tid, struct vg_mallinfo* mi )
2368 UWord i, free_blocks, free_blocks_size;
2369 Arena* a = arenaId_to_ArenaP(VG_AR_CLIENT);
2371 // Traverse free list and calculate free blocks statistics.
2372 // This may seem slow but glibc works the same way.
2373 free_blocks_size = free_blocks = 0;
2374 for (i = 0; i < N_MALLOC_LISTS; i++) {
2375 Block* b = a->freelist[i];
2376 if (b == NULL) continue;
2377 for (;;) {
2378 free_blocks++;
2379 free_blocks_size += (UWord)get_pszB(a, b);
2380 b = get_next_b(b);
2381 if (b == a->freelist[i]) break;
2385 // We don't have fastbins so smblks & fsmblks are always 0. Also we don't
2386 // have a separate mmap allocator so set hblks & hblkhd to 0.
2387 mi->arena = a->stats__bytes_mmaped;
2388 mi->ordblks = free_blocks + VG_(free_queue_length);
2389 mi->smblks = 0;
2390 mi->hblks = 0;
2391 mi->hblkhd = 0;
2392 mi->usmblks = 0;
2393 mi->fsmblks = 0;
2394 mi->uordblks = a->stats__bytes_on_loan - VG_(free_queue_volume);
2395 mi->fordblks = free_blocks_size + VG_(free_queue_volume);
2396 mi->keepcost = 0; // may want some value in here
2399 SizeT VG_(arena_redzone_size) ( ArenaId aid )
2401 ensure_mm_init (VG_AR_CLIENT);
2402 /* ensure_mm_init will call arena_init if not yet done.
2403 This then ensures that the arena redzone size is properly
2404 initialised. */
2405 return arenaId_to_ArenaP(aid)->rz_szB;
2408 /*------------------------------------------------------------*/
2409 /*--- Services layered on top of malloc/free. ---*/
2410 /*------------------------------------------------------------*/
2412 void* VG_(arena_calloc) ( ArenaId aid, const HChar* cc,
2413 SizeT nmemb, SizeT bytes_per_memb )
2415 SizeT size;
2416 void* p;
2418 size = nmemb * bytes_per_memb;
2419 vg_assert(size >= nmemb && size >= bytes_per_memb);// check against overflow
2421 p = VG_(arena_malloc) ( aid, cc, size );
2423 if (p != NULL)
2424 VG_(memset)(p, 0, size);
2426 return p;
2430 void* VG_(arena_realloc) ( ArenaId aid, const HChar* cc,
2431 void* ptr, SizeT req_pszB )
2433 Arena* a;
2434 SizeT old_pszB;
2435 void* p_new;
2436 Block* b;
2438 ensure_mm_init(aid);
2439 a = arenaId_to_ArenaP(aid);
2441 vg_assert(req_pszB < MAX_PSZB);
2443 if (NULL == ptr) {
2444 return VG_(arena_malloc)(aid, cc, req_pszB);
2447 if (req_pszB == 0) {
2448 VG_(arena_free)(aid, ptr);
2449 return NULL;
2452 b = get_payload_block(a, ptr);
2453 vg_assert(blockSane(a, b));
2455 vg_assert(is_inuse_block(b));
2456 old_pszB = get_pszB(a, b);
2458 if (req_pszB <= old_pszB) {
2459 return ptr;
2462 p_new = VG_(arena_malloc) ( aid, cc, req_pszB );
2464 VG_(memcpy)(p_new, ptr, old_pszB);
2466 VG_(arena_free)(aid, ptr);
2468 return p_new;
2472 void VG_(arena_realloc_shrink) ( ArenaId aid,
2473 void* ptr, SizeT req_pszB )
2475 SizeT req_bszB, frag_bszB, b_bszB;
2476 Superblock* sb;
2477 Arena* a;
2478 SizeT old_pszB;
2479 Block* b;
2481 ensure_mm_init(aid);
2483 a = arenaId_to_ArenaP(aid);
2484 b = get_payload_block(a, ptr);
2485 vg_assert(blockSane(a, b));
2486 vg_assert(is_inuse_block(b));
2488 old_pszB = get_pszB(a, b);
2489 req_pszB = align_req_pszB(req_pszB);
2490 vg_assert(old_pszB >= req_pszB);
2491 if (old_pszB == req_pszB)
2492 return;
2494 sb = findSb( a, b );
2495 if (sb->unsplittable) {
2496 const UByte* sb_start = &sb->payload_bytes[0];
2497 const UByte* sb_end = &sb->payload_bytes[sb->n_payload_bytes - 1];
2498 Addr frag;
2500 vg_assert(unsplittableBlockSane(a, sb, b));
2502 frag = VG_PGROUNDUP((Addr) sb
2503 + sizeof(Superblock) + pszB_to_bszB(a, req_pszB));
2504 frag_bszB = (Addr)sb_end - frag + 1;
2506 if (frag_bszB >= VKI_PAGE_SIZE) {
2507 SysRes sres;
2509 a->stats__bytes_on_loan -= old_pszB;
2510 b_bszB = (UByte*)frag - sb_start;
2511 shrinkInuseBlock(a, b, b_bszB);
2512 INNER_REQUEST
2513 (VALGRIND_RESIZEINPLACE_BLOCK(ptr,
2514 old_pszB,
2515 VG_(arena_malloc_usable_size)(aid, ptr),
2516 a->rz_szB));
2517 /* Have the minimum admin headers needed accessibility. */
2518 INNER_REQUEST(mkBhdrSzAccess(a, b));
2519 a->stats__bytes_on_loan += bszB_to_pszB(a, b_bszB);
2521 sb->n_payload_bytes -= frag_bszB;
2522 VG_(debugLog)(1, "mallocfree",
2523 "shrink superblock %p to (pszB %7lu) "
2524 "owner %s/%s (munmap-ing %p %7lu)\n",
2525 sb, sb->n_payload_bytes,
2526 a->clientmem ? "CLIENT" : "VALGRIND", a->name,
2527 (void*) frag, frag_bszB);
2528 if (a->clientmem) {
2529 Bool need_discard = False;
2530 sres = VG_(am_munmap_client)(&need_discard,
2531 frag,
2532 frag_bszB);
2533 vg_assert (!need_discard);
2534 } else {
2535 sres = VG_(am_munmap_valgrind)(frag,
2536 frag_bszB);
2538 vg_assert2(! sr_isError(sres), "shrink superblock munmap failure\n");
2539 a->stats__bytes_mmaped -= frag_bszB;
2541 vg_assert(unsplittableBlockSane(a, sb, b));
2543 } else {
2544 req_bszB = pszB_to_bszB(a, req_pszB);
2545 b_bszB = get_bszB(b);
2546 frag_bszB = b_bszB - req_bszB;
2547 if (frag_bszB < min_useful_bszB(a))
2548 return;
2550 a->stats__bytes_on_loan -= old_pszB;
2551 shrinkInuseBlock(a, b, req_bszB);
2552 INNER_REQUEST
2553 (VALGRIND_RESIZEINPLACE_BLOCK(ptr,
2554 old_pszB,
2555 VG_(arena_malloc_usable_size)(aid, ptr),
2556 a->rz_szB));
2557 /* Have the minimum admin headers needed accessibility. */
2558 INNER_REQUEST(mkBhdrSzAccess(a, b));
2560 mkFreeBlock(a, &b[req_bszB], frag_bszB,
2561 pszB_to_listNo(bszB_to_pszB(a, frag_bszB)));
2562 /* Mark the admin headers as accessible. */
2563 INNER_REQUEST(mkBhdrAccess(a, &b[req_bszB]));
2564 if (VG_(clo_profile_heap))
2565 set_cc(&b[req_bszB], "admin.fragmentation-2");
2566 /* Possibly merge &b[req_bszB] with its free neighbours. */
2567 mergeWithFreeNeighbours(a, sb, &b[req_bszB], frag_bszB);
2569 b_bszB = get_bszB(b);
2570 a->stats__bytes_on_loan += bszB_to_pszB(a, b_bszB);
2573 vg_assert (blockSane(a, b));
2574 # ifdef DEBUG_MALLOC
2575 sanity_check_malloc_arena(aid);
2576 # endif
2579 /* Inline just for the wrapper VG_(strdup) below */
2580 __inline__ HChar* VG_(arena_strdup) ( ArenaId aid, const HChar* cc,
2581 const HChar* s )
2583 Int i;
2584 Int len;
2585 HChar* res;
2587 if (s == NULL)
2588 return NULL;
2590 len = VG_(strlen)(s) + 1;
2591 res = VG_(arena_malloc) (aid, cc, len);
2593 for (i = 0; i < len; i++)
2594 res[i] = s[i];
2595 return res;
2598 void* VG_(arena_perm_malloc) ( ArenaId aid, SizeT size, Int align )
2600 Arena* a;
2602 ensure_mm_init(aid);
2603 a = arenaId_to_ArenaP(aid);
2605 align = align - 1;
2606 size = (size + align) & ~align;
2608 if (UNLIKELY(a->perm_malloc_current + size > a->perm_malloc_limit)) {
2609 // Get a superblock, but we will not insert it into the superblock list.
2610 // The superblock structure is not needed, so we will use the full
2611 // memory range of it. This superblock is however counted in the
2612 // mmaped statistics.
2613 Superblock* new_sb = newSuperblock (a, size);
2614 a->perm_malloc_limit = (Addr)&new_sb->payload_bytes[new_sb->n_payload_bytes - 1];
2616 // We do not mind starting allocating from the beginning of the superblock
2617 // as afterwards, we "lose" it as a superblock.
2618 a->perm_malloc_current = (Addr)new_sb;
2621 a->stats__perm_blocks += 1;
2622 a->stats__perm_bytes_on_loan += size;
2623 add_one_block_to_stats (a, size);
2625 a->perm_malloc_current += size;
2626 return (void*)(a->perm_malloc_current - size);
2629 /*------------------------------------------------------------*/
2630 /*--- Tool-visible functions. ---*/
2631 /*------------------------------------------------------------*/
2633 // All just wrappers to avoid exposing arenas to tools.
2635 // This function never returns NULL.
2636 void* VG_(malloc) ( const HChar* cc, SizeT nbytes )
2638 return VG_(arena_malloc) ( VG_AR_CORE, cc, nbytes );
2641 void VG_(free) ( void* ptr )
2643 VG_(arena_free) ( VG_AR_CORE, ptr );
2646 void* VG_(calloc) ( const HChar* cc, SizeT nmemb, SizeT bytes_per_memb )
2648 return VG_(arena_calloc) ( VG_AR_CORE, cc, nmemb, bytes_per_memb );
2651 void* VG_(realloc) ( const HChar* cc, void* ptr, SizeT size )
2653 return VG_(arena_realloc) ( VG_AR_CORE, cc, ptr, size );
2656 void VG_(realloc_shrink) ( void* ptr, SizeT size )
2658 VG_(arena_realloc_shrink) ( VG_AR_CORE, ptr, size );
2661 HChar* VG_(strdup) ( const HChar* cc, const HChar* s )
2663 return VG_(arena_strdup) ( VG_AR_CORE, cc, s );
2666 void* VG_(perm_malloc) ( SizeT size, Int align )
2668 return VG_(arena_perm_malloc) ( VG_AR_CORE, size, align );
2672 /*--------------------------------------------------------------------*/
2673 /*--- end ---*/
2674 /*--------------------------------------------------------------------*/