1 2 /*--------------------------------------------------------------------*/ 3 /*--- An implementation of malloc/free which doesn't use sbrk. ---*/ 4 /*--- m_mallocfree.c ---*/ 5 /*--------------------------------------------------------------------*/ 6 7 /* 8 This file is part of Valgrind, a dynamic binary instrumentation 9 framework. 10 11 Copyright (C) 2000-2010 Julian Seward 12 jseward (at) acm.org 13 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. 18 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. 23 24 You should have received a copy of the GNU General Public License 25 along with this program; if not, write to the Free Software 26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 27 02111-1307, USA. 28 29 The GNU General Public License is contained in the file COPYING. 30 */ 31 32 #include "pub_core_basics.h" 33 #include "pub_core_vki.h" 34 #include "pub_core_debuglog.h" 35 #include "pub_core_libcbase.h" 36 #include "pub_core_aspacemgr.h" 37 #include "pub_core_libcassert.h" 38 #include "pub_core_libcfile.h" 39 #include "pub_core_libcprint.h" 40 #include "pub_core_mallocfree.h" 41 #include "pub_core_options.h" 42 #include "pub_core_threadstate.h" // For VG_INVALID_THREADID 43 #include "pub_core_tooliface.h" 44 #include "valgrind.h" 45 46 //zz#include "memcheck/memcheck.h" 47 48 // #define DEBUG_MALLOC // turn on heavyweight debugging machinery 49 // #define VERBOSE_MALLOC // make verbose, esp. in debugging machinery 50 51 /* Number and total size of blocks in free queue. Used by mallinfo(). */ 52 Long VG_(free_queue_volume) = 0; 53 Long VG_(free_queue_length) = 0; 54 55 static void cc_analyse_alloc_arena ( ArenaId aid ); /* fwds */ 56 57 /*------------------------------------------------------------*/ 58 /*--- Main types ---*/ 59 /*------------------------------------------------------------*/ 60 61 #define N_MALLOC_LISTS 112 // do not change this 62 63 // The amount you can ask for is limited only by sizeof(SizeT)... 64 #define MAX_PSZB (~((SizeT)0x0)) 65 66 // Each arena has a sorted array of superblocks, which expands 67 // dynamically. This is its initial size. 68 #define SBLOCKS_SIZE_INITIAL 50 69 70 typedef UChar UByte; 71 72 /* Layout of an in-use block: 73 74 cost center (OPTIONAL) (VG_MIN_MALLOC_SZB bytes, only when h-p enabled) 75 this block total szB (sizeof(SizeT) bytes) 76 red zone bytes (depends on Arena.rz_szB, but >= sizeof(void*)) 77 (payload bytes) 78 red zone bytes (depends on Arena.rz_szB, but >= sizeof(void*)) 79 this block total szB (sizeof(SizeT) bytes) 80 81 Layout of a block on the free list: 82 83 cost center (OPTIONAL) (VG_MIN_MALLOC_SZB bytes, only when h-p enabled) 84 this block total szB (sizeof(SizeT) bytes) 85 freelist previous ptr (sizeof(void*) bytes) 86 excess red zone bytes (if Arena.rz_szB > sizeof(void*)) 87 (payload bytes) 88 excess red zone bytes (if Arena.rz_szB > sizeof(void*)) 89 freelist next ptr (sizeof(void*) bytes) 90 this block total szB (sizeof(SizeT) bytes) 91 92 Total size in bytes (bszB) and payload size in bytes (pszB) 93 are related by: 94 95 bszB == pszB + 2*sizeof(SizeT) + 2*a->rz_szB 96 97 when heap profiling is not enabled, and 98 99 bszB == pszB + 2*sizeof(SizeT) + 2*a->rz_szB + VG_MIN_MALLOC_SZB 100 101 when it is enabled. It follows that the minimum overhead per heap 102 block for arenas used by the core is: 103 104 32-bit platforms: 2*4 + 2*4 == 16 bytes 105 64-bit platforms: 2*8 + 2*8 == 32 bytes 106 107 when heap profiling is not enabled, and 108 109 32-bit platforms: 2*4 + 2*4 + 8 == 24 bytes 110 64-bit platforms: 2*8 + 2*8 + 16 == 48 bytes 111 112 when it is enabled. In all cases, extra overhead may be incurred 113 when rounding the payload size up to VG_MIN_MALLOC_SZB. 114 115 Furthermore, both size fields in the block have their least-significant 116 bit set if the block is not in use, and unset if it is in use. 117 (The bottom 3 or so bits are always free for this because of alignment.) 118 A block size of zero is not possible, because a block always has at 119 least two SizeTs and two pointers of overhead. 120 121 Nb: All Block payloads must be VG_MIN_MALLOC_SZB-aligned. This is 122 achieved by ensuring that Superblocks are VG_MIN_MALLOC_SZB-aligned 123 (see newSuperblock() for how), and that the lengths of the following 124 things are a multiple of VG_MIN_MALLOC_SZB: 125 - Superblock admin section lengths (due to elastic padding) 126 - Block admin section (low and high) lengths (due to elastic redzones) 127 - Block payload lengths (due to req_pszB rounding up) 128 129 The heap-profile cost-center field is 8 bytes even on 32 bit 130 platforms. This is so as to keep the payload field 8-aligned. On 131 a 64-bit platform, this cc-field contains a pointer to a const 132 HChar*, which is the cost center name. On 32-bit platforms, the 133 pointer lives in the lower-addressed half of the field, regardless 134 of the endianness of the host. 135 */ 136 typedef 137 struct { 138 // No fields are actually used in this struct, because a Block has 139 // many variable sized fields and so can't be accessed 140 // meaningfully with normal fields. So we use access functions all 141 // the time. This struct gives us a type to use, though. Also, we 142 // make sizeof(Block) 1 byte so that we can do arithmetic with the 143 // Block* type in increments of 1! 144 UByte dummy; 145 } 146 Block; 147 148 // A superblock. 'padding' is never used, it just ensures that if the 149 // entire Superblock is aligned to VG_MIN_MALLOC_SZB, then payload_bytes[] 150 // will be too. It can add small amounts of padding unnecessarily -- eg. 151 // 8-bytes on 32-bit machines with an 8-byte VG_MIN_MALLOC_SZB -- because 152 // it's too hard to make a constant expression that works perfectly in all 153 // cases. 154 // payload_bytes[] is made a single big Block when the Superblock is 155 // created, and then can be split and the splittings remerged, but Blocks 156 // always cover its entire length -- there's never any unused bytes at the 157 // end, for example. 158 typedef 159 struct _Superblock { 160 SizeT n_payload_bytes; 161 void* padding2; 162 UByte padding[ VG_MIN_MALLOC_SZB - 163 ((sizeof(struct _Superblock*) + sizeof(SizeT)) % 164 VG_MIN_MALLOC_SZB) ]; 165 UByte payload_bytes[0]; 166 } 167 Superblock; 168 169 // An arena. 'freelist' is a circular, doubly-linked list. 'rz_szB' is 170 // elastic, in that it can be bigger than asked-for to ensure alignment. 171 typedef 172 struct { 173 Char* name; 174 Bool clientmem; // Allocates in the client address space? 175 SizeT rz_szB; // Red zone size in bytes 176 SizeT min_sblock_szB; // Minimum superblock size in bytes 177 Block* freelist[N_MALLOC_LISTS]; 178 // A dynamically expanding, ordered array of (pointers to) 179 // superblocks in the arena. If this array is expanded, which 180 // is rare, the previous space it occupies is simply abandoned. 181 // To avoid having to get yet another block from m_aspacemgr for 182 // the first incarnation of this array, the first allocation of 183 // it is within this struct. If it has to be expanded then the 184 // new space is acquired from m_aspacemgr as you would expect. 185 Superblock** sblocks; 186 SizeT sblocks_size; 187 SizeT sblocks_used; 188 Superblock* sblocks_initial[SBLOCKS_SIZE_INITIAL]; 189 // Stats only. 190 SizeT bytes_on_loan; 191 SizeT bytes_mmaped; 192 SizeT bytes_on_loan_max; 193 SizeT next_profile_at; 194 } 195 Arena; 196 197 198 /*------------------------------------------------------------*/ 199 /*--- Low-level functions for working with Blocks. ---*/ 200 /*------------------------------------------------------------*/ 201 202 #define SIZE_T_0x1 ((SizeT)0x1) 203 204 static char* probably_your_fault = 205 "This is probably caused by your program erroneously writing past the\n" 206 "end of a heap block and corrupting heap metadata. If you fix any\n" 207 "invalid writes reported by Memcheck, this assertion failure will\n" 208 "probably go away. Please try that before reporting this as a bug.\n"; 209 210 // Mark a bszB as in-use, and not in-use, and remove the in-use attribute. 211 static __inline__ 212 SizeT mk_inuse_bszB ( SizeT bszB ) 213 { 214 vg_assert2(bszB != 0, probably_your_fault); 215 return bszB & (~SIZE_T_0x1); 216 } 217 static __inline__ 218 SizeT mk_free_bszB ( SizeT bszB ) 219 { 220 vg_assert2(bszB != 0, probably_your_fault); 221 return bszB | SIZE_T_0x1; 222 } 223 static __inline__ 224 SizeT mk_plain_bszB ( SizeT bszB ) 225 { 226 vg_assert2(bszB != 0, probably_your_fault); 227 return bszB & (~SIZE_T_0x1); 228 } 229 230 // return either 0 or sizeof(ULong) depending on whether or not 231 // heap profiling is engaged 232 static __inline__ 233 SizeT hp_overhead_szB ( void ) 234 { 235 return VG_(clo_profile_heap) ? VG_MIN_MALLOC_SZB : 0; 236 } 237 238 //--------------------------------------------------------------------------- 239 240 // Get a block's size as stored, ie with the in-use/free attribute. 241 static __inline__ 242 SizeT get_bszB_as_is ( Block* b ) 243 { 244 UByte* b2 = (UByte*)b; 245 SizeT bszB_lo = *(SizeT*)&b2[0 + hp_overhead_szB()]; 246 SizeT bszB_hi = *(SizeT*)&b2[mk_plain_bszB(bszB_lo) - sizeof(SizeT)]; 247 vg_assert2(bszB_lo == bszB_hi, 248 "Heap block lo/hi size mismatch: lo = %llu, hi = %llu.\n%s", 249 (ULong)bszB_lo, (ULong)bszB_hi, probably_your_fault); 250 return bszB_lo; 251 } 252 253 // Get a block's plain size, ie. remove the in-use/free attribute. 254 static __inline__ 255 SizeT get_bszB ( Block* b ) 256 { 257 return mk_plain_bszB(get_bszB_as_is(b)); 258 } 259 260 // Set the size fields of a block. bszB may have the in-use/free attribute. 261 static __inline__ 262 void set_bszB ( Block* b, SizeT bszB ) 263 { 264 UByte* b2 = (UByte*)b; 265 *(SizeT*)&b2[0 + hp_overhead_szB()] = bszB; 266 *(SizeT*)&b2[mk_plain_bszB(bszB) - sizeof(SizeT)] = bszB; 267 } 268 269 //--------------------------------------------------------------------------- 270 271 // Does this block have the in-use attribute? 272 static __inline__ 273 Bool is_inuse_block ( Block* b ) 274 { 275 SizeT bszB = get_bszB_as_is(b); 276 vg_assert2(bszB != 0, probably_your_fault); 277 return (0 != (bszB & SIZE_T_0x1)) ? False : True; 278 } 279 280 //--------------------------------------------------------------------------- 281 282 // Return the lower, upper and total overhead in bytes for a block. 283 // These are determined purely by which arena the block lives in. 284 static __inline__ 285 SizeT overhead_szB_lo ( Arena* a ) 286 { 287 return hp_overhead_szB() + sizeof(SizeT) + a->rz_szB; 288 } 289 static __inline__ 290 SizeT overhead_szB_hi ( Arena* a ) 291 { 292 return a->rz_szB + sizeof(SizeT); 293 } 294 static __inline__ 295 SizeT overhead_szB ( Arena* a ) 296 { 297 return overhead_szB_lo(a) + overhead_szB_hi(a); 298 } 299 300 //--------------------------------------------------------------------------- 301 302 // Return the minimum bszB for a block in this arena. Can have zero-length 303 // payloads, so it's the size of the admin bytes. 304 static __inline__ 305 SizeT min_useful_bszB ( Arena* a ) 306 { 307 return overhead_szB(a); 308 } 309 310 //--------------------------------------------------------------------------- 311 312 // Convert payload size <--> block size (both in bytes). 313 static __inline__ 314 SizeT pszB_to_bszB ( Arena* a, SizeT pszB ) 315 { 316 return pszB + overhead_szB(a); 317 } 318 static __inline__ 319 SizeT bszB_to_pszB ( Arena* a, SizeT bszB ) 320 { 321 vg_assert2(bszB >= overhead_szB(a), probably_your_fault); 322 return bszB - overhead_szB(a); 323 } 324 325 //--------------------------------------------------------------------------- 326 327 // Get a block's payload size. 328 static __inline__ 329 SizeT get_pszB ( Arena* a, Block* b ) 330 { 331 return bszB_to_pszB(a, get_bszB(b)); 332 } 333 334 //--------------------------------------------------------------------------- 335 336 // Given the addr of a block, return the addr of its payload, and vice versa. 337 static __inline__ 338 UByte* get_block_payload ( Arena* a, Block* b ) 339 { 340 UByte* b2 = (UByte*)b; 341 return & b2[ overhead_szB_lo(a) ]; 342 } 343 // Given the addr of a block's payload, return the addr of the block itself. 344 static __inline__ 345 Block* get_payload_block ( Arena* a, UByte* payload ) 346 { 347 return (Block*)&payload[ -overhead_szB_lo(a) ]; 348 } 349 350 //--------------------------------------------------------------------------- 351 352 // Set and get the next and previous link fields of a block. 353 static __inline__ 354 void set_prev_b ( Block* b, Block* prev_p ) 355 { 356 UByte* b2 = (UByte*)b; 357 *(Block**)&b2[hp_overhead_szB() + sizeof(SizeT)] = prev_p; 358 } 359 static __inline__ 360 void set_next_b ( Block* b, Block* next_p ) 361 { 362 UByte* b2 = (UByte*)b; 363 *(Block**)&b2[get_bszB(b) - sizeof(SizeT) - sizeof(void*)] = next_p; 364 } 365 static __inline__ 366 Block* get_prev_b ( Block* b ) 367 { 368 UByte* b2 = (UByte*)b; 369 return *(Block**)&b2[hp_overhead_szB() + sizeof(SizeT)]; 370 } 371 static __inline__ 372 Block* get_next_b ( Block* b ) 373 { 374 UByte* b2 = (UByte*)b; 375 return *(Block**)&b2[get_bszB(b) - sizeof(SizeT) - sizeof(void*)]; 376 } 377 378 //--------------------------------------------------------------------------- 379 380 // Set and get the cost-center field of a block. 381 static __inline__ 382 void set_cc ( Block* b, HChar* cc ) 383 { 384 UByte* b2 = (UByte*)b; 385 vg_assert( VG_(clo_profile_heap) ); 386 *(HChar**)&b2[0] = cc; 387 } 388 static __inline__ 389 HChar* get_cc ( Block* b ) 390 { 391 UByte* b2 = (UByte*)b; 392 vg_assert( VG_(clo_profile_heap) ); 393 return *(HChar**)&b2[0]; 394 } 395 396 //--------------------------------------------------------------------------- 397 398 // Get the block immediately preceding this one in the Superblock. 399 static __inline__ 400 Block* get_predecessor_block ( Block* b ) 401 { 402 UByte* b2 = (UByte*)b; 403 SizeT bszB = mk_plain_bszB( (*(SizeT*)&b2[-sizeof(SizeT)]) ); 404 return (Block*)&b2[-bszB]; 405 } 406 407 //--------------------------------------------------------------------------- 408 409 // Read and write the lower and upper red-zone bytes of a block. 410 static __inline__ 411 void set_rz_lo_byte ( Block* b, UInt rz_byteno, UByte v ) 412 { 413 UByte* b2 = (UByte*)b; 414 b2[hp_overhead_szB() + sizeof(SizeT) + rz_byteno] = v; 415 } 416 static __inline__ 417 void set_rz_hi_byte ( Block* b, UInt rz_byteno, UByte v ) 418 { 419 UByte* b2 = (UByte*)b; 420 b2[get_bszB(b) - sizeof(SizeT) - rz_byteno - 1] = v; 421 } 422 static __inline__ 423 UByte get_rz_lo_byte ( Block* b, UInt rz_byteno ) 424 { 425 UByte* b2 = (UByte*)b; 426 return b2[hp_overhead_szB() + sizeof(SizeT) + rz_byteno]; 427 } 428 static __inline__ 429 UByte get_rz_hi_byte ( Block* b, UInt rz_byteno ) 430 { 431 UByte* b2 = (UByte*)b; 432 return b2[get_bszB(b) - sizeof(SizeT) - rz_byteno - 1]; 433 } 434 435 436 /*------------------------------------------------------------*/ 437 /*--- Arena management ---*/ 438 /*------------------------------------------------------------*/ 439 440 #define CORE_ARENA_MIN_SZB 1048576 441 442 // The arena structures themselves. 443 static Arena vg_arena[VG_N_ARENAS]; 444 445 // Functions external to this module identify arenas using ArenaIds, 446 // not Arena*s. This fn converts the former to the latter. 447 static Arena* arenaId_to_ArenaP ( ArenaId arena ) 448 { 449 vg_assert(arena >= 0 && arena < VG_N_ARENAS); 450 return & vg_arena[arena]; 451 } 452 453 // Initialise an arena. rz_szB is the minimum redzone size; it might be 454 // made bigger to ensure that VG_MIN_MALLOC_SZB is observed. 455 static 456 void arena_init ( ArenaId aid, Char* name, SizeT rz_szB, SizeT min_sblock_szB ) 457 { 458 SizeT i; 459 Arena* a = arenaId_to_ArenaP(aid); 460 461 // Ensure redzones are a reasonable size. They must always be at least 462 // the size of a pointer, for holding the prev/next pointer (see the layout 463 // details at the top of this file). 464 vg_assert(rz_szB < 128); 465 if (rz_szB < sizeof(void*)) rz_szB = sizeof(void*); 466 467 vg_assert((min_sblock_szB % VKI_PAGE_SIZE) == 0); 468 a->name = name; 469 a->clientmem = ( VG_AR_CLIENT == aid ? True : False ); 470 471 // The size of the low and high admin sections in a block must be a 472 // multiple of VG_MIN_MALLOC_SZB. So we round up the asked-for 473 // redzone size if necessary to achieve this. 474 a->rz_szB = rz_szB; 475 while (0 != overhead_szB_lo(a) % VG_MIN_MALLOC_SZB) a->rz_szB++; 476 vg_assert(overhead_szB_lo(a) - hp_overhead_szB() == overhead_szB_hi(a)); 477 478 a->min_sblock_szB = min_sblock_szB; 479 for (i = 0; i < N_MALLOC_LISTS; i++) a->freelist[i] = NULL; 480 481 a->sblocks = & a->sblocks_initial[0]; 482 a->sblocks_size = SBLOCKS_SIZE_INITIAL; 483 a->sblocks_used = 0; 484 a->bytes_on_loan = 0; 485 a->bytes_mmaped = 0; 486 a->bytes_on_loan_max = 0; 487 a->next_profile_at = 25 * 1000 * 1000; 488 vg_assert(sizeof(a->sblocks_initial) 489 == SBLOCKS_SIZE_INITIAL * sizeof(Superblock*)); 490 } 491 492 /* Print vital stats for an arena. */ 493 void VG_(print_all_arena_stats) ( void ) 494 { 495 UInt i; 496 for (i = 0; i < VG_N_ARENAS; i++) { 497 Arena* a = arenaId_to_ArenaP(i); 498 VG_(message)(Vg_DebugMsg, 499 "%8s: %8ld mmap'd, %8ld/%8ld max/curr\n", 500 a->name, a->bytes_mmaped, a->bytes_on_loan_max, a->bytes_on_loan 501 ); 502 } 503 } 504 505 void VG_(print_arena_cc_analysis) ( void ) 506 { 507 UInt i; 508 vg_assert( VG_(clo_profile_heap) ); 509 for (i = 0; i < VG_N_ARENAS; i++) { 510 cc_analyse_alloc_arena(i); 511 } 512 } 513 514 515 /* This library is self-initialising, as it makes this more self-contained, 516 less coupled with the outside world. Hence VG_(arena_malloc)() and 517 VG_(arena_free)() below always call ensure_mm_init() to ensure things are 518 correctly initialised. 519 520 We initialise the client arena separately (and later) because the core 521 must do non-client allocation before the tool has a chance to set the 522 client arena's redzone size. 523 */ 524 static Bool client_inited = False; 525 static Bool nonclient_inited = False; 526 527 static 528 void ensure_mm_init ( ArenaId aid ) 529 { 530 static SizeT client_rz_szB = 8; // default: be paranoid 531 532 /* We use checked red zones (of various sizes) for our internal stuff, 533 and an unchecked zone of arbitrary size for the client. Of 534 course the client's red zone can be checked by the tool, eg. 535 by using addressibility maps, but not by the mechanism implemented 536 here, which merely checks at the time of freeing that the red 537 zone bytes are unchanged. 538 539 Nb: redzone sizes are *minimums*; they could be made bigger to ensure 540 alignment. Eg. with 8 byte alignment, on 32-bit machines 4 stays as 541 4, but 16 becomes 20; but on 64-bit machines 4 becomes 8, and 16 542 stays as 16 --- the extra 4 bytes in both are accounted for by the 543 larger prev/next ptr. 544 */ 545 if (VG_AR_CLIENT == aid) { 546 Int ar_client_sbszB; 547 if (client_inited) { 548 // This assertion ensures that a tool cannot try to change the client 549 // redzone size with VG_(needs_malloc_replacement)() after this module 550 // has done its first allocation from the client arena. 551 if (VG_(needs).malloc_replacement) 552 vg_assert(client_rz_szB == VG_(tdict).tool_client_redzone_szB); 553 return; 554 } 555 556 // Check and set the client arena redzone size 557 if (VG_(needs).malloc_replacement) { 558 client_rz_szB = VG_(tdict).tool_client_redzone_szB; 559 // 128 is no special figure, just something not too big 560 if (client_rz_szB > 128) { 561 VG_(printf)( "\nTool error:\n" 562 " specified redzone size is too big (%llu)\n", 563 (ULong)client_rz_szB); 564 VG_(exit)(1); 565 } 566 } 567 // Initialise the client arena. On AIX it's important to have 568 // relatively large client blocks so as not to cause excessively 569 // fine-grained interleaving of V and C address space. On Linux 570 // this is irrelevant since aspacem can keep the two spaces 571 // well apart, but not so on AIX. On all platforms though, 572 // increasing the superblock size reduces the number of superblocks 573 // in the client arena, which makes findSb cheaper. 574 # if defined(VGO_aix5) 575 ar_client_sbszB = 16777216; 576 # else 577 ar_client_sbszB = 4194304; 578 # endif 579 arena_init ( VG_AR_CLIENT, "client", client_rz_szB, ar_client_sbszB ); 580 client_inited = True; 581 582 } else { 583 if (nonclient_inited) { 584 return; 585 } 586 // Initialise the non-client arenas 587 arena_init ( VG_AR_CORE, "core", 4, 1048576 ); 588 arena_init ( VG_AR_TOOL, "tool", 4, 4194304 ); 589 arena_init ( VG_AR_DINFO, "dinfo", 4, 1048576 ); 590 arena_init ( VG_AR_DEMANGLE, "demangle", 4, 65536 ); 591 arena_init ( VG_AR_EXECTXT, "exectxt", 4, 1048576 ); 592 arena_init ( VG_AR_ERRORS, "errors", 4, 65536 ); 593 arena_init ( VG_AR_TTAUX, "ttaux", 4, 65536 ); 594 nonclient_inited = True; 595 } 596 597 # ifdef DEBUG_MALLOC 598 VG_(printf)("ZZZ1\n"); 599 VG_(sanity_check_malloc_all)(); 600 VG_(printf)("ZZZ2\n"); 601 # endif 602 } 603 604 605 /*------------------------------------------------------------*/ 606 /*--- Superblock management ---*/ 607 /*------------------------------------------------------------*/ 608 609 __attribute__((noreturn)) 610 void VG_(out_of_memory_NORETURN) ( HChar* who, SizeT szB ) 611 { 612 static Bool alreadyCrashing = False; 613 ULong tot_alloc = VG_(am_get_anonsize_total)(); 614 Char* s1 = 615 "\n" 616 " Valgrind's memory management: out of memory:\n" 617 " %s's request for %llu bytes failed.\n" 618 " %llu bytes have already been allocated.\n" 619 " Valgrind cannot continue. Sorry.\n\n" 620 " There are several possible reasons for this.\n" 621 " - You have some kind of memory limit in place. Look at the\n" 622 " output of 'ulimit -a'. Is there a limit on the size of\n" 623 " virtual memory or address space?\n" 624 " - You have run out of swap space.\n" 625 " - Valgrind has a bug. If you think this is the case or you are\n" 626 " not sure, please let us know and we'll try to fix it.\n" 627 " Please note that programs can take substantially more memory than\n" 628 " normal when running under Valgrind tools, eg. up to twice or\n" 629 " more, depending on the tool. On a 64-bit machine, Valgrind\n" 630 " should be able to make use of up 32GB memory. On a 32-bit\n" 631 " machine, Valgrind should be able to use all the memory available\n" 632 " to a single process, up to 4GB if that's how you have your\n" 633 " kernel configured. Most 32-bit Linux setups allow a maximum of\n" 634 " 3GB per process.\n\n" 635 " Whatever the reason, Valgrind cannot continue. Sorry.\n"; 636 637 if (!alreadyCrashing) { 638 alreadyCrashing = True; 639 VG_(message)(Vg_UserMsg, s1, who, (ULong)szB, tot_alloc); 640 } else { 641 VG_(debugLog)(0,"mallocfree", s1, who, (ULong)szB, tot_alloc); 642 } 643 644 VG_(exit)(1); 645 } 646 647 648 // Align ptr p upwards to an align-sized boundary. 649 static 650 void* align_upwards ( void* p, SizeT align ) 651 { 652 Addr a = (Addr)p; 653 if ((a % align) == 0) return (void*)a; 654 return (void*)(a - (a % align) + align); 655 } 656 657 // Support for memfs (tmpfs or hugetlbfs) allocation. 658 // The code is tcmalloc memfs allocator does a similar thing: 659 // http://code.google.com/p/google-perftools/source/browse/trunk/src/memfs_malloc.cc 660 661 static int memfs_fd = -1; 662 static SizeT memfs_base = 0; 663 static SizeT memfs_page_size = 0; 664 665 static void MemfsOpen(void) { 666 if (VG_(clo_memfs_malloc_path) && memfs_fd == -1) { 667 VG_(printf)("MemfsOpen: attempting to open memfs mount: %s; " 668 "memfs page size=%d ", VG_(clo_memfs_malloc_path), 669 VG_(clo_memfs_page_size)); 670 SysRes sres = VG_(open)(VG_(clo_memfs_malloc_path), 671 VKI_O_RDWR | VKI_O_CREAT | VKI_O_TRUNC, 0666); 672 if (!sr_isError(sres)) { 673 memfs_fd = sr_Res(sres); 674 tl_assert(memfs_fd >= 0); 675 VG_(printf)("... ok\n"); 676 memfs_page_size = VG_(clo_memfs_page_size) * 1024; 677 } else { 678 VG_(clo_memfs_malloc_path) = NULL; 679 VG_(printf)("... failed\n"); 680 } 681 } 682 } 683 684 static SizeT MemfsRoundUp(SizeT size) { 685 SizeT new_size = size; 686 if (memfs_page_size != 0) { 687 new_size = ((size + memfs_page_size - 1) / memfs_page_size) 688 * memfs_page_size; 689 } 690 return new_size; 691 } 692 693 static SysRes MemfsAlloc(SizeT size) { 694 VG_(printf)("MemfsAlloc: size=%ld base=%ld ", size, memfs_base); 695 696 /* Make sure the file is large enough. 697 Not needed for hugetlbfs, but needed for tmpfs and regular files. */ 698 VG_(ftruncate)(memfs_fd, memfs_base + size); 699 700 SysRes sres = VG_(am_mmap_file_float_valgrind_with_flags) 701 (size, VKI_PROT_WRITE|VKI_PROT_READ, VKI_MAP_SHARED, memfs_fd, memfs_base); 702 703 memfs_base += size; 704 705 // try to access mem to fail early if something is wrong. 706 char *mem = (char*)sr_Res(sres); 707 mem[0] = 0; 708 mem[size / 2] = 0; 709 mem[size - 1] = 0; 710 711 if (sr_isError(sres)) { 712 VG_(printf)("... failed\n"); 713 } else { 714 VG_(printf)("... ok; res=%p\n", (void*)sr_Res(sres)); 715 } 716 return sres; 717 } 718 719 // If not enough memory available, either aborts (for non-client memory) 720 // or returns 0 (for client memory). 721 static 722 Superblock* newSuperblock ( Arena* a, SizeT cszB ) 723 { 724 Superblock* sb; 725 SysRes sres; 726 727 // Take into account admin bytes in the Superblock. 728 cszB += sizeof(Superblock); 729 730 if (cszB < a->min_sblock_szB) cszB = a->min_sblock_szB; 731 cszB = VG_PGROUNDUP(cszB); 732 733 MemfsOpen(); 734 cszB = MemfsRoundUp(cszB); 735 736 if (a->clientmem) { 737 // client allocation -- return 0 to client if it fails 738 if (memfs_fd >= 0) { 739 sres = MemfsAlloc(cszB); 740 } else { 741 sres = VG_(am_sbrk_anon_float_client) 742 ( cszB, VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC ); 743 } 744 if (sr_isError(sres)) 745 return 0; 746 sb = (Superblock*)(AddrH)sr_Res(sres); 747 // Mark this segment as containing client heap. The leak 748 // checker needs to be able to identify such segments so as not 749 // to use them as sources of roots during leak checks. 750 VG_(am_set_segment_isCH_if_SkAnonC)( 751 (NSegment*) VG_(am_find_nsegment)( (Addr)sb ) 752 ); 753 } else { 754 // non-client allocation -- abort if it fails 755 if (memfs_fd >= 0) { 756 sres = MemfsAlloc(cszB); 757 } else { 758 sres = VG_(am_sbrk_anon_float_valgrind)( cszB ); 759 } 760 if (sr_isError(sres)) { 761 VG_(out_of_memory_NORETURN)("newSuperblock", cszB); 762 /* NOTREACHED */ 763 sb = NULL; /* keep gcc happy */ 764 } else { 765 sb = (Superblock*)(AddrH)sr_Res(sres); 766 } 767 } 768 vg_assert(NULL != sb); 769 //zzVALGRIND_MAKE_MEM_UNDEFINED(sb, cszB); 770 vg_assert(0 == (Addr)sb % VG_MIN_MALLOC_SZB); 771 sb->n_payload_bytes = cszB - sizeof(Superblock); 772 a->bytes_mmaped += cszB; 773 VG_(debugLog)(1, "mallocfree", 774 "newSuperblock at %p (pszB %7ld) owner %s/%s\n", 775 sb, sb->n_payload_bytes, 776 a->clientmem ? "CLIENT" : "VALGRIND", a->name ); 777 return sb; 778 } 779 780 // Find the superblock containing the given chunk. 781 static 782 Superblock* findSb ( Arena* a, Block* b ) 783 { 784 SizeT min = 0; 785 SizeT max = a->sblocks_used; 786 787 while (min <= max) { 788 Superblock * sb; 789 SizeT pos = min + (max - min)/2; 790 791 vg_assert(pos >= 0 && pos < a->sblocks_used); 792 sb = a->sblocks[pos]; 793 if ((Block*)&sb->payload_bytes[0] <= b 794 && b < (Block*)&sb->payload_bytes[sb->n_payload_bytes]) 795 { 796 return sb; 797 } else if ((Block*)&sb->payload_bytes[0] <= b) { 798 min = pos + 1; 799 } else { 800 max = pos - 1; 801 } 802 } 803 VG_(printf)("findSb: can't find pointer %p in arena '%s'\n", 804 b, a->name ); 805 VG_(core_panic)("findSb: VG_(arena_free)() in wrong arena?"); 806 return NULL; /*NOTREACHED*/ 807 } 808 809 810 /*------------------------------------------------------------*/ 811 /*--- Functions for working with freelists. ---*/ 812 /*------------------------------------------------------------*/ 813 814 // Nb: Determination of which freelist a block lives on is based on the 815 // payload size, not block size. 816 817 // Convert a payload size in bytes to a freelist number. 818 static 819 UInt pszB_to_listNo ( SizeT pszB ) 820 { 821 SizeT n = pszB / VG_MIN_MALLOC_SZB; 822 vg_assert(0 == pszB % VG_MIN_MALLOC_SZB); 823 824 // The first 64 lists hold blocks of size VG_MIN_MALLOC_SZB * list_num. 825 // The final 48 hold bigger blocks. 826 if (n < 64) return (UInt)n; 827 /* Exponential slope up, factor 1.05 */ 828 if (n < 67) return 64; 829 if (n < 70) return 65; 830 if (n < 74) return 66; 831 if (n < 77) return 67; 832 if (n < 81) return 68; 833 if (n < 85) return 69; 834 if (n < 90) return 70; 835 if (n < 94) return 71; 836 if (n < 99) return 72; 837 if (n < 104) return 73; 838 if (n < 109) return 74; 839 if (n < 114) return 75; 840 if (n < 120) return 76; 841 if (n < 126) return 77; 842 if (n < 133) return 78; 843 if (n < 139) return 79; 844 /* Exponential slope up, factor 1.10 */ 845 if (n < 153) return 80; 846 if (n < 169) return 81; 847 if (n < 185) return 82; 848 if (n < 204) return 83; 849 if (n < 224) return 84; 850 if (n < 247) return 85; 851 if (n < 272) return 86; 852 if (n < 299) return 87; 853 if (n < 329) return 88; 854 if (n < 362) return 89; 855 if (n < 398) return 90; 856 if (n < 438) return 91; 857 if (n < 482) return 92; 858 if (n < 530) return 93; 859 if (n < 583) return 94; 860 if (n < 641) return 95; 861 /* Exponential slope up, factor 1.20 */ 862 if (n < 770) return 96; 863 if (n < 924) return 97; 864 if (n < 1109) return 98; 865 if (n < 1331) return 99; 866 if (n < 1597) return 100; 867 if (n < 1916) return 101; 868 if (n < 2300) return 102; 869 if (n < 2760) return 103; 870 if (n < 3312) return 104; 871 if (n < 3974) return 105; 872 if (n < 4769) return 106; 873 if (n < 5723) return 107; 874 if (n < 6868) return 108; 875 if (n < 8241) return 109; 876 if (n < 9890) return 110; 877 return 111; 878 } 879 880 // What is the minimum payload size for a given list? 881 static 882 SizeT listNo_to_pszB_min ( UInt listNo ) 883 { 884 /* Repeatedly computing this function at every request is 885 expensive. Hence at the first call just cache the result for 886 every possible argument. */ 887 static SizeT cache[N_MALLOC_LISTS]; 888 static Bool cache_valid = False; 889 if (!cache_valid) { 890 UInt i; 891 for (i = 0; i < N_MALLOC_LISTS; i++) { 892 SizeT pszB = 0; 893 while (pszB_to_listNo(pszB) < i) 894 pszB += VG_MIN_MALLOC_SZB; 895 cache[i] = pszB; 896 } 897 cache_valid = True; 898 } 899 /* Returned cached answer. */ 900 vg_assert(listNo <= N_MALLOC_LISTS); 901 return cache[listNo]; 902 } 903 904 // What is the maximum payload size for a given list? 905 static 906 SizeT listNo_to_pszB_max ( UInt listNo ) 907 { 908 vg_assert(listNo <= N_MALLOC_LISTS); 909 if (listNo == N_MALLOC_LISTS-1) { 910 return MAX_PSZB; 911 } else { 912 return listNo_to_pszB_min(listNo+1) - 1; 913 } 914 } 915 916 917 /* A nasty hack to try and reduce fragmentation. Try and replace 918 a->freelist[lno] with another block on the same list but with a 919 lower address, with the idea of attempting to recycle the same 920 blocks rather than cruise through the address space. */ 921 static 922 void swizzle ( Arena* a, UInt lno ) 923 { 924 Block* p_best; 925 Block* pp; 926 Block* pn; 927 UInt i; 928 929 p_best = a->freelist[lno]; 930 if (p_best == NULL) return; 931 932 pn = pp = p_best; 933 934 // This loop bound was 20 for a long time, but experiments showed that 935 // reducing it to 10 gave the same result in all the tests, and 5 got the 936 // same result in 85--100% of cases. And it's called often enough to be 937 // noticeable in programs that allocated a lot. 938 for (i = 0; i < 5; i++) { 939 pn = get_next_b(pn); 940 pp = get_prev_b(pp); 941 if (pn < p_best) p_best = pn; 942 if (pp < p_best) p_best = pp; 943 } 944 if (p_best < a->freelist[lno]) { 945 # ifdef VERBOSE_MALLOC 946 VG_(printf)("retreat by %ld\n", (Word)(a->freelist[lno] - p_best)); 947 # endif 948 a->freelist[lno] = p_best; 949 } 950 } 951 952 953 /*------------------------------------------------------------*/ 954 /*--- Sanity-check/debugging machinery. ---*/ 955 /*------------------------------------------------------------*/ 956 957 #define REDZONE_LO_MASK 0x31 958 #define REDZONE_HI_MASK 0x7c 959 960 // Do some crude sanity checks on a Block. 961 static 962 Bool blockSane ( Arena* a, Block* b ) 963 { 964 # define BLEAT(str) VG_(printf)("blockSane: fail -- %s\n",str) 965 UInt i; 966 // The lo and hi size fields will be checked (indirectly) by the call 967 // to get_rz_hi_byte(). 968 if (!a->clientmem && is_inuse_block(b)) { 969 for (i = 0; i < a->rz_szB; i++) { 970 if (get_rz_lo_byte(b, i) != 971 (UByte)(((Addr)b&0xff) ^ REDZONE_LO_MASK)) 972 {BLEAT("redzone-lo");return False;} 973 if (get_rz_hi_byte(b, i) != 974 (UByte)(((Addr)b&0xff) ^ REDZONE_HI_MASK)) 975 {BLEAT("redzone-hi");return False;} 976 } 977 } 978 return True; 979 # undef BLEAT 980 } 981 982 // Print superblocks (only for debugging). 983 static 984 void ppSuperblocks ( Arena* a ) 985 { 986 UInt i, j, blockno = 1; 987 SizeT b_bszB; 988 989 for (j = 0; j < a->sblocks_used; ++j) { 990 Superblock * sb = a->sblocks[j]; 991 992 VG_(printf)( "\n" ); 993 VG_(printf)( "superblock %d at %p, sb->n_pl_bs = %lu\n", 994 blockno++, sb, sb->n_payload_bytes); 995 for (i = 0; i < sb->n_payload_bytes; i += b_bszB) { 996 Block* b = (Block*)&sb->payload_bytes[i]; 997 b_bszB = get_bszB(b); 998 VG_(printf)( " block at %d, bszB %lu: ", i, b_bszB ); 999 VG_(printf)( "%s, ", is_inuse_block(b) ? "inuse" : "free"); 1000 VG_(printf)( "%s\n", blockSane(a, b) ? "ok" : "BAD" ); 1001 } 1002 vg_assert(i == sb->n_payload_bytes); // no overshoot at end of Sb 1003 } 1004 VG_(printf)( "end of superblocks\n\n" ); 1005 } 1006 1007 // Sanity check both the superblocks and the chains. 1008 static void sanity_check_malloc_arena ( ArenaId aid ) 1009 { 1010 UInt i, j, superblockctr, blockctr_sb, blockctr_li; 1011 UInt blockctr_sb_free, listno; 1012 SizeT b_bszB, b_pszB, list_min_pszB, list_max_pszB; 1013 Bool thisFree, lastWasFree, sblockarrOK; 1014 Block* b; 1015 Block* b_prev; 1016 SizeT arena_bytes_on_loan; 1017 Arena* a; 1018 1019 # define BOMB VG_(core_panic)("sanity_check_malloc_arena") 1020 1021 a = arenaId_to_ArenaP(aid); 1022 1023 // Check the superblock array. 1024 sblockarrOK 1025 = a->sblocks != NULL 1026 && a->sblocks_size >= SBLOCKS_SIZE_INITIAL 1027 && a->sblocks_used <= a->sblocks_size 1028 && (a->sblocks_size == SBLOCKS_SIZE_INITIAL 1029 ? (a->sblocks == &a->sblocks_initial[0]) 1030 : (a->sblocks != &a->sblocks_initial[0])); 1031 if (!sblockarrOK) { 1032 VG_(printf)("sanity_check_malloc_arena: sblock array BAD\n"); 1033 BOMB; 1034 } 1035 1036 // First, traverse all the superblocks, inspecting the Blocks in each. 1037 superblockctr = blockctr_sb = blockctr_sb_free = 0; 1038 arena_bytes_on_loan = 0; 1039 for (j = 0; j < a->sblocks_used; ++j) { 1040 Superblock * sb = a->sblocks[j]; 1041 lastWasFree = False; 1042 superblockctr++; 1043 for (i = 0; i < sb->n_payload_bytes; i += mk_plain_bszB(b_bszB)) { 1044 blockctr_sb++; 1045 b = (Block*)&sb->payload_bytes[i]; 1046 b_bszB = get_bszB_as_is(b); 1047 if (!blockSane(a, b)) { 1048 VG_(printf)("sanity_check_malloc_arena: sb %p, block %d " 1049 "(bszB %lu): BAD\n", sb, i, b_bszB ); 1050 BOMB; 1051 } 1052 thisFree = !is_inuse_block(b); 1053 if (thisFree && lastWasFree) { 1054 VG_(printf)("sanity_check_malloc_arena: sb %p, block %d " 1055 "(bszB %lu): UNMERGED FREES\n", sb, i, b_bszB ); 1056 BOMB; 1057 } 1058 if (thisFree) blockctr_sb_free++; 1059 if (!thisFree) 1060 arena_bytes_on_loan += bszB_to_pszB(a, b_bszB); 1061 lastWasFree = thisFree; 1062 } 1063 if (i > sb->n_payload_bytes) { 1064 VG_(printf)( "sanity_check_malloc_arena: sb %p: last block " 1065 "overshoots end\n", sb); 1066 BOMB; 1067 } 1068 } 1069 1070 if (arena_bytes_on_loan != a->bytes_on_loan) { 1071 # ifdef VERBOSE_MALLOC 1072 VG_(printf)( "sanity_check_malloc_arena: a->bytes_on_loan %ld, " 1073 "arena_bytes_on_loan %ld: " 1074 "MISMATCH\n", a->bytes_on_loan, arena_bytes_on_loan); 1075 # endif 1076 ppSuperblocks(a); 1077 BOMB; 1078 } 1079 1080 /* Second, traverse each list, checking that the back pointers make 1081 sense, counting blocks encountered, and checking that each block 1082 is an appropriate size for this list. */ 1083 blockctr_li = 0; 1084 for (listno = 0; listno < N_MALLOC_LISTS; listno++) { 1085 list_min_pszB = listNo_to_pszB_min(listno); 1086 list_max_pszB = listNo_to_pszB_max(listno); 1087 b = a->freelist[listno]; 1088 if (b == NULL) continue; 1089 while (True) { 1090 b_prev = b; 1091 b = get_next_b(b); 1092 if (get_prev_b(b) != b_prev) { 1093 VG_(printf)( "sanity_check_malloc_arena: list %d at %p: " 1094 "BAD LINKAGE\n", 1095 listno, b ); 1096 BOMB; 1097 } 1098 b_pszB = get_pszB(a, b); 1099 if (b_pszB < list_min_pszB || b_pszB > list_max_pszB) { 1100 VG_(printf)( 1101 "sanity_check_malloc_arena: list %d at %p: " 1102 "WRONG CHAIN SIZE %luB (%luB, %luB)\n", 1103 listno, b, b_pszB, list_min_pszB, list_max_pszB ); 1104 BOMB; 1105 } 1106 blockctr_li++; 1107 if (b == a->freelist[listno]) break; 1108 } 1109 } 1110 1111 if (blockctr_sb_free != blockctr_li) { 1112 # ifdef VERBOSE_MALLOC 1113 VG_(printf)( "sanity_check_malloc_arena: BLOCK COUNT MISMATCH " 1114 "(via sbs %d, via lists %d)\n", 1115 blockctr_sb_free, blockctr_li ); 1116 # endif 1117 ppSuperblocks(a); 1118 BOMB; 1119 } 1120 1121 if (VG_(clo_verbosity) > 2) 1122 VG_(message)(Vg_DebugMsg, 1123 "%8s: %2d sbs, %5d bs, %2d/%-2d free bs, " 1124 "%7ld mmap, %7ld loan\n", 1125 a->name, 1126 superblockctr, 1127 blockctr_sb, blockctr_sb_free, blockctr_li, 1128 a->bytes_mmaped, a->bytes_on_loan); 1129 # undef BOMB 1130 } 1131 1132 1133 #define N_AN_CCS 1000 1134 1135 typedef struct { ULong nBytes; ULong nBlocks; HChar* cc; } AnCC; 1136 1137 static AnCC anCCs[N_AN_CCS]; 1138 1139 static Int cmp_AnCC_by_vol ( void* v1, void* v2 ) { 1140 AnCC* ancc1 = (AnCC*)v1; 1141 AnCC* ancc2 = (AnCC*)v2; 1142 if (ancc1->nBytes < ancc2->nBytes) return -1; 1143 if (ancc1->nBytes > ancc2->nBytes) return 1; 1144 return 0; 1145 } 1146 1147 static void cc_analyse_alloc_arena ( ArenaId aid ) 1148 { 1149 Word i, j, k; 1150 Arena* a; 1151 Block* b; 1152 Bool thisFree, lastWasFree; 1153 SizeT b_bszB; 1154 1155 HChar* cc; 1156 UInt n_ccs = 0; 1157 //return; 1158 a = arenaId_to_ArenaP(aid); 1159 if (a->name == NULL) { 1160 /* arena is not in use, is not initialised and will fail the 1161 sanity check that follows. */ 1162 return; 1163 } 1164 1165 sanity_check_malloc_arena(aid); 1166 1167 VG_(printf)( 1168 "-------- Arena \"%s\": %ld mmap'd, %ld/%ld max/curr --------\n", 1169 a->name, a->bytes_mmaped, a->bytes_on_loan_max, a->bytes_on_loan 1170 ); 1171 1172 for (j = 0; j < a->sblocks_used; ++j) { 1173 Superblock * sb = a->sblocks[j]; 1174 lastWasFree = False; 1175 for (i = 0; i < sb->n_payload_bytes; i += mk_plain_bszB(b_bszB)) { 1176 b = (Block*)&sb->payload_bytes[i]; 1177 b_bszB = get_bszB_as_is(b); 1178 if (!blockSane(a, b)) { 1179 VG_(printf)("sanity_check_malloc_arena: sb %p, block %ld " 1180 "(bszB %lu): BAD\n", sb, i, b_bszB ); 1181 tl_assert(0); 1182 } 1183 thisFree = !is_inuse_block(b); 1184 if (thisFree && lastWasFree) { 1185 VG_(printf)("sanity_check_malloc_arena: sb %p, block %ld " 1186 "(bszB %lu): UNMERGED FREES\n", sb, i, b_bszB ); 1187 tl_assert(0); 1188 } 1189 lastWasFree = thisFree; 1190 1191 if (thisFree) continue; 1192 1193 if (0) 1194 VG_(printf)("block: inUse=%d pszB=%d cc=%s\n", 1195 (Int)(!thisFree), 1196 (Int)bszB_to_pszB(a, b_bszB), 1197 get_cc(b)); 1198 cc = get_cc(b); 1199 tl_assert(cc); 1200 for (k = 0; k < n_ccs; k++) { 1201 tl_assert(anCCs[k].cc); 1202 if (0 == VG_(strcmp)(cc, anCCs[k].cc)) 1203 break; 1204 } 1205 tl_assert(k >= 0 && k <= n_ccs); 1206 1207 if (k == n_ccs) { 1208 tl_assert(n_ccs < N_AN_CCS-1); 1209 n_ccs++; 1210 anCCs[k].nBytes = 0; 1211 anCCs[k].nBlocks = 0; 1212 anCCs[k].cc = cc; 1213 } 1214 1215 tl_assert(k >= 0 && k < n_ccs && k < N_AN_CCS); 1216 anCCs[k].nBytes += (ULong)bszB_to_pszB(a, b_bszB); 1217 anCCs[k].nBlocks++; 1218 } 1219 if (i > sb->n_payload_bytes) { 1220 VG_(printf)( "sanity_check_malloc_arena: sb %p: last block " 1221 "overshoots end\n", sb); 1222 tl_assert(0); 1223 } 1224 } 1225 1226 VG_(ssort)( &anCCs[0], n_ccs, sizeof(anCCs[0]), cmp_AnCC_by_vol ); 1227 1228 for (k = 0; k < n_ccs; k++) { 1229 VG_(printf)("%'13llu in %'9llu: %s\n", 1230 anCCs[k].nBytes, anCCs[k].nBlocks, anCCs[k].cc ); 1231 } 1232 1233 VG_(printf)("\n"); 1234 } 1235 1236 1237 void VG_(sanity_check_malloc_all) ( void ) 1238 { 1239 UInt i; 1240 for (i = 0; i < VG_N_ARENAS; i++) { 1241 if (i == VG_AR_CLIENT && !client_inited) 1242 continue; 1243 sanity_check_malloc_arena ( i ); 1244 } 1245 } 1246 1247 1248 /*------------------------------------------------------------*/ 1249 /*--- Creating and deleting blocks. ---*/ 1250 /*------------------------------------------------------------*/ 1251 1252 // Mark the bytes at b .. b+bszB-1 as not in use, and add them to the 1253 // relevant free list. 1254 1255 static 1256 void mkFreeBlock ( Arena* a, Block* b, SizeT bszB, UInt b_lno ) 1257 { 1258 SizeT pszB = bszB_to_pszB(a, bszB); 1259 vg_assert(b_lno == pszB_to_listNo(pszB)); 1260 //zzVALGRIND_MAKE_MEM_UNDEFINED(b, bszB); 1261 // Set the size fields and indicate not-in-use. 1262 set_bszB(b, mk_free_bszB(bszB)); 1263 1264 // Add to the relevant list. 1265 if (a->freelist[b_lno] == NULL) { 1266 set_prev_b(b, b); 1267 set_next_b(b, b); 1268 a->freelist[b_lno] = b; 1269 } else { 1270 Block* b_prev = get_prev_b(a->freelist[b_lno]); 1271 Block* b_next = a->freelist[b_lno]; 1272 set_next_b(b_prev, b); 1273 set_prev_b(b_next, b); 1274 set_next_b(b, b_next); 1275 set_prev_b(b, b_prev); 1276 } 1277 # ifdef DEBUG_MALLOC 1278 (void)blockSane(a,b); 1279 # endif 1280 } 1281 1282 // Mark the bytes at b .. b+bszB-1 as in use, and set up the block 1283 // appropriately. 1284 static 1285 void mkInuseBlock ( Arena* a, Block* b, SizeT bszB ) 1286 { 1287 UInt i; 1288 vg_assert(bszB >= min_useful_bszB(a)); 1289 //zzVALGRIND_MAKE_MEM_UNDEFINED(b, bszB); 1290 set_bszB(b, mk_inuse_bszB(bszB)); 1291 set_prev_b(b, NULL); // Take off freelist 1292 set_next_b(b, NULL); // ditto 1293 if (!a->clientmem) { 1294 for (i = 0; i < a->rz_szB; i++) { 1295 set_rz_lo_byte(b, i, (UByte)(((Addr)b&0xff) ^ REDZONE_LO_MASK)); 1296 set_rz_hi_byte(b, i, (UByte)(((Addr)b&0xff) ^ REDZONE_HI_MASK)); 1297 } 1298 } 1299 # ifdef DEBUG_MALLOC 1300 (void)blockSane(a,b); 1301 # endif 1302 } 1303 1304 // Remove a block from a given list. Does no sanity checking. 1305 static 1306 void unlinkBlock ( Arena* a, Block* b, UInt listno ) 1307 { 1308 vg_assert(listno < N_MALLOC_LISTS); 1309 if (get_prev_b(b) == b) { 1310 // Only one element in the list; treat it specially. 1311 vg_assert(get_next_b(b) == b); 1312 a->freelist[listno] = NULL; 1313 } else { 1314 Block* b_prev = get_prev_b(b); 1315 Block* b_next = get_next_b(b); 1316 a->freelist[listno] = b_prev; 1317 set_next_b(b_prev, b_next); 1318 set_prev_b(b_next, b_prev); 1319 swizzle ( a, listno ); 1320 } 1321 set_prev_b(b, NULL); 1322 set_next_b(b, NULL); 1323 } 1324 1325 1326 /*------------------------------------------------------------*/ 1327 /*--- Core-visible functions. ---*/ 1328 /*------------------------------------------------------------*/ 1329 1330 // Align the request size. 1331 static __inline__ 1332 SizeT align_req_pszB ( SizeT req_pszB ) 1333 { 1334 SizeT n = VG_MIN_MALLOC_SZB-1; 1335 return ((req_pszB + n) & (~n)); 1336 } 1337 1338 void* VG_(arena_malloc) ( ArenaId aid, HChar* cc, SizeT req_pszB ) 1339 { 1340 SizeT req_bszB, frag_bszB, b_bszB; 1341 UInt lno, i; 1342 Superblock* new_sb; 1343 Block* b = NULL; 1344 Arena* a; 1345 void* v; 1346 1347 ensure_mm_init(aid); 1348 a = arenaId_to_ArenaP(aid); 1349 1350 vg_assert(req_pszB < MAX_PSZB); 1351 req_pszB = align_req_pszB(req_pszB); 1352 req_bszB = pszB_to_bszB(a, req_pszB); 1353 1354 // You must provide a cost-center name against which to charge 1355 // this allocation; it isn't optional. 1356 vg_assert(cc); 1357 1358 // Scan through all the big-enough freelists for a block. 1359 // 1360 // Nb: this scanning might be expensive in some cases. Eg. if you 1361 // allocate lots of small objects without freeing them, but no 1362 // medium-sized objects, it will repeatedly scanning through the whole 1363 // list, and each time not find any free blocks until the last element. 1364 // 1365 // If this becomes a noticeable problem... the loop answers the question 1366 // "where is the first nonempty list above me?" And most of the time, 1367 // you ask the same question and get the same answer. So it would be 1368 // good to somehow cache the results of previous searches. 1369 // One possibility is an array (with N_MALLOC_LISTS elements) of 1370 // shortcuts. shortcut[i] would give the index number of the nearest 1371 // larger list above list i which is non-empty. Then this loop isn't 1372 // necessary. However, we'd have to modify some section [ .. i-1] of the 1373 // shortcut array every time a list [i] changes from empty to nonempty or 1374 // back. This would require care to avoid pathological worst-case 1375 // behaviour. 1376 // 1377 for (lno = pszB_to_listNo(req_pszB); lno < N_MALLOC_LISTS; lno++) { 1378 b = a->freelist[lno]; 1379 if (NULL == b) continue; // If this list is empty, try the next one. 1380 while (True) { 1381 b_bszB = get_bszB(b); 1382 if (b_bszB >= req_bszB) goto obtained_block; // success! 1383 b = get_next_b(b); 1384 if (b == a->freelist[lno]) break; // traversed entire freelist 1385 } 1386 } 1387 1388 // If we reach here, no suitable block found, allocate a new superblock 1389 vg_assert(lno == N_MALLOC_LISTS); 1390 new_sb = newSuperblock(a, req_bszB); 1391 if (NULL == new_sb) { 1392 // Should only fail if for client, otherwise, should have aborted 1393 // already. 1394 vg_assert(VG_AR_CLIENT == aid); 1395 return NULL; 1396 } 1397 1398 vg_assert(a->sblocks_used <= a->sblocks_size); 1399 if (a->sblocks_used == a->sblocks_size) { 1400 Superblock ** array; 1401 SysRes sres = VG_(am_sbrk_anon_float_valgrind)(sizeof(Superblock *) * 1402 a->sblocks_size * 2); 1403 if (sr_isError(sres)) { 1404 VG_(out_of_memory_NORETURN)("arena_init", sizeof(Superblock *) * 1405 a->sblocks_size * 2); 1406 /* NOTREACHED */ 1407 } 1408 array = (Superblock**)(AddrH)sr_Res(sres); 1409 for (i = 0; i < a->sblocks_used; ++i) array[i] = a->sblocks[i]; 1410 1411 a->sblocks_size *= 2; 1412 a->sblocks = array; 1413 VG_(debugLog)(1, "mallocfree", 1414 "sblock array for arena `%s' resized to %ld\n", 1415 a->name, a->sblocks_size); 1416 } 1417 1418 vg_assert(a->sblocks_used < a->sblocks_size); 1419 1420 i = a->sblocks_used; 1421 while (i > 0) { 1422 if (a->sblocks[i-1] > new_sb) { 1423 a->sblocks[i] = a->sblocks[i-1]; 1424 } else { 1425 break; 1426 } 1427 --i; 1428 } 1429 a->sblocks[i] = new_sb; 1430 a->sblocks_used++; 1431 1432 b = (Block*)&new_sb->payload_bytes[0]; 1433 lno = pszB_to_listNo(bszB_to_pszB(a, new_sb->n_payload_bytes)); 1434 mkFreeBlock ( a, b, new_sb->n_payload_bytes, lno); 1435 if (VG_(clo_profile_heap)) 1436 set_cc(b, "admin.free-new-sb-1"); 1437 // fall through 1438 1439 obtained_block: 1440 // Ok, we can allocate from b, which lives in list lno. 1441 vg_assert(b != NULL); 1442 vg_assert(lno < N_MALLOC_LISTS); 1443 vg_assert(a->freelist[lno] != NULL); 1444 b_bszB = get_bszB(b); 1445 // req_bszB is the size of the block we are after. b_bszB is the 1446 // size of what we've actually got. */ 1447 vg_assert(b_bszB >= req_bszB); 1448 1449 // Could we split this block and still get a useful fragment? 1450 frag_bszB = b_bszB - req_bszB; 1451 if (frag_bszB >= min_useful_bszB(a)) { 1452 // Yes, split block in two, put the fragment on the appropriate free 1453 // list, and update b_bszB accordingly. 1454 // printf( "split %dB into %dB and %dB\n", b_bszB, req_bszB, frag_bszB ); 1455 unlinkBlock(a, b, lno); 1456 mkInuseBlock(a, b, req_bszB); 1457 if (VG_(clo_profile_heap)) 1458 set_cc(b, cc); 1459 mkFreeBlock(a, &b[req_bszB], frag_bszB, 1460 pszB_to_listNo(bszB_to_pszB(a, frag_bszB))); 1461 if (VG_(clo_profile_heap)) 1462 set_cc(&b[req_bszB], "admin.fragmentation-1"); 1463 b_bszB = get_bszB(b); 1464 } else { 1465 // No, mark as in use and use as-is. 1466 unlinkBlock(a, b, lno); 1467 mkInuseBlock(a, b, b_bszB); 1468 if (VG_(clo_profile_heap)) 1469 set_cc(b, cc); 1470 } 1471 1472 // Update stats 1473 a->bytes_on_loan += bszB_to_pszB(a, b_bszB); 1474 if (a->bytes_on_loan > a->bytes_on_loan_max) { 1475 a->bytes_on_loan_max = a->bytes_on_loan; 1476 if (a->bytes_on_loan_max >= a->next_profile_at) { 1477 /* next profile after 10% more growth */ 1478 a->next_profile_at 1479 = (SizeT)( 1480 (((ULong)a->bytes_on_loan_max) * 110ULL) / 100ULL ); 1481 if (VG_(clo_profile_heap)) 1482 cc_analyse_alloc_arena(aid); 1483 } 1484 } 1485 1486 # ifdef DEBUG_MALLOC 1487 sanity_check_malloc_arena(aid); 1488 # endif 1489 1490 v = get_block_payload(a, b); 1491 vg_assert( (((Addr)v) & (VG_MIN_MALLOC_SZB-1)) == 0 ); 1492 1493 /* VALGRIND_MALLOCLIKE_BLOCK(v, req_pszB, 0, False); */ 1494 1495 /* For debugging/testing purposes, fill the newly allocated area 1496 with a definite value in an attempt to shake out any 1497 uninitialised uses of the data (by V core / V tools, not by the 1498 client). Testing on 25 Nov 07 with the values 0x00, 0xFF, 0x55, 1499 0xAA showed no differences in the regression tests on 1500 amd64-linux. Note, is disabled by default. */ 1501 if (0 && aid != VG_AR_CLIENT) 1502 VG_(memset)(v, 0xAA, (SizeT)req_pszB); 1503 1504 return v; 1505 } 1506 1507 1508 void VG_(arena_free) ( ArenaId aid, void* ptr ) 1509 { 1510 Superblock* sb; 1511 UByte* sb_start; 1512 UByte* sb_end; 1513 Block* other_b; 1514 Block* b; 1515 SizeT b_bszB, b_pszB, other_bszB; 1516 UInt b_listno; 1517 Arena* a; 1518 1519 ensure_mm_init(aid); 1520 a = arenaId_to_ArenaP(aid); 1521 1522 if (ptr == NULL) { 1523 return; 1524 } 1525 1526 b = get_payload_block(a, ptr); 1527 1528 /* If this is one of V's areas, check carefully the block we're 1529 getting back. This picks up simple block-end overruns. */ 1530 if (aid != VG_AR_CLIENT) 1531 vg_assert(blockSane(a, b)); 1532 1533 b_bszB = get_bszB(b); 1534 b_pszB = bszB_to_pszB(a, b_bszB); 1535 sb = findSb( a, b ); 1536 sb_start = &sb->payload_bytes[0]; 1537 sb_end = &sb->payload_bytes[sb->n_payload_bytes - 1]; 1538 1539 a->bytes_on_loan -= b_pszB; 1540 1541 /* If this is one of V's areas, fill it up with junk to enhance the 1542 chances of catching any later reads of it. Note, 0xDD is 1543 carefully chosen junk :-), in that: (1) 0xDDDDDDDD is an invalid 1544 and non-word-aligned address on most systems, and (2) 0xDD is a 1545 value which is unlikely to be generated by the new compressed 1546 Vbits representation for memcheck. */ 1547 if (aid != VG_AR_CLIENT) 1548 VG_(memset)(ptr, 0xDD, (SizeT)b_pszB); 1549 1550 // Put this chunk back on a list somewhere. 1551 b_listno = pszB_to_listNo(b_pszB); 1552 mkFreeBlock( a, b, b_bszB, b_listno ); 1553 if (VG_(clo_profile_heap)) 1554 set_cc(b, "admin.free-1"); 1555 1556 // See if this block can be merged with its successor. 1557 // First test if we're far enough before the superblock's end to possibly 1558 // have a successor. 1559 other_b = b + b_bszB; 1560 if (other_b+min_useful_bszB(a)-1 <= (Block*)sb_end) { 1561 // Ok, we have a successor, merge if it's not in use. 1562 other_bszB = get_bszB(other_b); 1563 if (!is_inuse_block(other_b)) { 1564 // VG_(printf)( "merge-successor\n"); 1565 # ifdef DEBUG_MALLOC 1566 vg_assert(blockSane(a, other_b)); 1567 # endif 1568 unlinkBlock( a, b, b_listno ); 1569 unlinkBlock( a, other_b, pszB_to_listNo(bszB_to_pszB(a,other_bszB)) ); 1570 b_bszB += other_bszB; 1571 b_listno = pszB_to_listNo(bszB_to_pszB(a, b_bszB)); 1572 mkFreeBlock( a, b, b_bszB, b_listno ); 1573 if (VG_(clo_profile_heap)) 1574 set_cc(b, "admin.free-2"); 1575 } 1576 } else { 1577 // Not enough space for successor: check that b is the last block 1578 // ie. there are no unused bytes at the end of the Superblock. 1579 vg_assert(other_b-1 == (Block*)sb_end); 1580 } 1581 1582 // Then see if this block can be merged with its predecessor. 1583 // First test if we're far enough after the superblock's start to possibly 1584 // have a predecessor. 1585 if (b >= (Block*)sb_start + min_useful_bszB(a)) { 1586 // Ok, we have a predecessor, merge if it's not in use. 1587 other_b = get_predecessor_block( b ); 1588 other_bszB = get_bszB(other_b); 1589 if (!is_inuse_block(other_b)) { 1590 // VG_(printf)( "merge-predecessor\n"); 1591 unlinkBlock( a, b, b_listno ); 1592 unlinkBlock( a, other_b, pszB_to_listNo(bszB_to_pszB(a, other_bszB)) ); 1593 b = other_b; 1594 b_bszB += other_bszB; 1595 b_listno = pszB_to_listNo(bszB_to_pszB(a, b_bszB)); 1596 mkFreeBlock( a, b, b_bszB, b_listno ); 1597 if (VG_(clo_profile_heap)) 1598 set_cc(b, "admin.free-3"); 1599 } 1600 } else { 1601 // Not enough space for predecessor: check that b is the first block, 1602 // ie. there are no unused bytes at the start of the Superblock. 1603 vg_assert((Block*)sb_start == b); 1604 } 1605 1606 # ifdef DEBUG_MALLOC 1607 sanity_check_malloc_arena(aid); 1608 # endif 1609 1610 //zzVALGRIND_FREELIKE_BLOCK(ptr, 0); 1611 } 1612 1613 1614 /* 1615 The idea for malloc_aligned() is to allocate a big block, base, and 1616 then split it into two parts: frag, which is returned to the the 1617 free pool, and align, which is the bit we're really after. Here's 1618 a picture. L and H denote the block lower and upper overheads, in 1619 bytes. The details are gruesome. Note it is slightly complicated 1620 because the initial request to generate base may return a bigger 1621 block than we asked for, so it is important to distinguish the base 1622 request size and the base actual size. 1623 1624 frag_b align_b 1625 | | 1626 | frag_p | align_p 1627 | | | | 1628 v v v v 1629 1630 +---+ +---+---+ +---+ 1631 | L |----------------| H | L |---------------| H | 1632 +---+ +---+---+ +---+ 1633 1634 ^ ^ ^ 1635 | | : 1636 | base_p this addr must be aligned 1637 | 1638 base_b 1639 1640 . . . . . . . 1641 <------ frag_bszB -------> . . . 1642 . <------------- base_pszB_act -----------> . 1643 . . . . . . . 1644 1645 */ 1646 void* VG_(arena_memalign) ( ArenaId aid, HChar* cc, 1647 SizeT req_alignB, SizeT req_pszB ) 1648 { 1649 SizeT base_pszB_req, base_pszB_act, frag_bszB; 1650 Block *base_b, *align_b; 1651 UByte *base_p, *align_p; 1652 SizeT saved_bytes_on_loan; 1653 Arena* a; 1654 1655 ensure_mm_init(aid); 1656 a = arenaId_to_ArenaP(aid); 1657 1658 vg_assert(req_pszB < MAX_PSZB); 1659 1660 // You must provide a cost-center name against which to charge 1661 // this allocation; it isn't optional. 1662 vg_assert(cc); 1663 1664 // Check that the requested alignment seems reasonable; that is, is 1665 // a power of 2. 1666 if (req_alignB < VG_MIN_MALLOC_SZB 1667 || req_alignB > 1048576 1668 || VG_(log2)( req_alignB ) == -1 /* not a power of 2 */) { 1669 VG_(printf)("VG_(arena_memalign)(%p, %lu, %lu)\n" 1670 "bad alignment value %lu\n" 1671 "(it is too small, too big, or not a power of two)", 1672 a, req_alignB, req_pszB, req_alignB ); 1673 VG_(core_panic)("VG_(arena_memalign)"); 1674 /*NOTREACHED*/ 1675 } 1676 // Paranoid 1677 vg_assert(req_alignB % VG_MIN_MALLOC_SZB == 0); 1678 1679 /* Required payload size for the aligned chunk. */ 1680 req_pszB = align_req_pszB(req_pszB); 1681 1682 /* Payload size to request for the big block that we will split up. */ 1683 base_pszB_req = req_pszB + min_useful_bszB(a) + req_alignB; 1684 1685 /* Payload ptr for the block we are going to split. Note this 1686 changes a->bytes_on_loan; we save and restore it ourselves. */ 1687 saved_bytes_on_loan = a->bytes_on_loan; 1688 base_p = VG_(arena_malloc) ( aid, cc, base_pszB_req ); 1689 a->bytes_on_loan = saved_bytes_on_loan; 1690 1691 /* Give up if we couldn't allocate enough space */ 1692 if (base_p == 0) 1693 return 0; 1694 1695 /* Block ptr for the block we are going to split. */ 1696 base_b = get_payload_block ( a, base_p ); 1697 1698 /* Pointer to the payload of the aligned block we are going to 1699 return. This has to be suitably aligned. */ 1700 align_p = align_upwards ( base_b + 2 * overhead_szB_lo(a) 1701 + overhead_szB_hi(a), 1702 req_alignB ); 1703 align_b = get_payload_block(a, align_p); 1704 1705 /* The block size of the fragment we will create. This must be big 1706 enough to actually create a fragment. */ 1707 frag_bszB = align_b - base_b; 1708 1709 vg_assert(frag_bszB >= min_useful_bszB(a)); 1710 1711 /* The actual payload size of the block we are going to split. */ 1712 base_pszB_act = get_pszB(a, base_b); 1713 1714 /* Create the fragment block, and put it back on the relevant free list. */ 1715 mkFreeBlock ( a, base_b, frag_bszB, 1716 pszB_to_listNo(bszB_to_pszB(a, frag_bszB)) ); 1717 if (VG_(clo_profile_heap)) 1718 set_cc(base_b, "admin.frag-memalign-1"); 1719 1720 /* Create the aligned block. */ 1721 mkInuseBlock ( a, align_b, 1722 base_p + base_pszB_act 1723 + overhead_szB_hi(a) - (UByte*)align_b ); 1724 if (VG_(clo_profile_heap)) 1725 set_cc(align_b, cc); 1726 1727 /* Final sanity checks. */ 1728 vg_assert( is_inuse_block(get_payload_block(a, align_p)) ); 1729 1730 vg_assert(req_pszB <= get_pszB(a, get_payload_block(a, align_p))); 1731 1732 a->bytes_on_loan += get_pszB(a, get_payload_block(a, align_p)); 1733 if (a->bytes_on_loan > a->bytes_on_loan_max) 1734 a->bytes_on_loan_max = a->bytes_on_loan; 1735 1736 # ifdef DEBUG_MALLOC 1737 sanity_check_malloc_arena(aid); 1738 # endif 1739 1740 vg_assert( (((Addr)align_p) % req_alignB) == 0 ); 1741 1742 //zzVALGRIND_MALLOCLIKE_BLOCK(align_p, req_pszB, 0, False); 1743 1744 return align_p; 1745 } 1746 1747 1748 SizeT VG_(arena_malloc_usable_size) ( ArenaId aid, void* ptr ) 1749 { 1750 Arena* a = arenaId_to_ArenaP(aid); 1751 Block* b = get_payload_block(a, ptr); 1752 return get_pszB(a, b); 1753 } 1754 1755 1756 // Implementation of mallinfo(). There is no recent standard that defines 1757 // the behavior of mallinfo(). The meaning of the fields in struct mallinfo 1758 // is as follows: 1759 // 1760 // struct mallinfo { 1761 // int arena; /* total space in arena */ 1762 // int ordblks; /* number of ordinary blocks */ 1763 // int smblks; /* number of small blocks */ 1764 // int hblks; /* number of holding blocks */ 1765 // int hblkhd; /* space in holding block headers */ 1766 // int usmblks; /* space in small blocks in use */ 1767 // int fsmblks; /* space in free small blocks */ 1768 // int uordblks; /* space in ordinary blocks in use */ 1769 // int fordblks; /* space in free ordinary blocks */ 1770 // int keepcost; /* space penalty if keep option */ 1771 // /* is used */ 1772 // }; 1773 // 1774 // The glibc documentation about mallinfo (which is somewhat outdated) can 1775 // be found here: 1776 // http://www.gnu.org/software/libtool/manual/libc/Statistics-of-Malloc.html 1777 // 1778 // See also http://bugs.kde.org/show_bug.cgi?id=160956. 1779 // 1780 // Regarding the implementation of VG_(mallinfo)(): we cannot return the 1781 // whole struct as the library function does, because this is called by a 1782 // client request. So instead we use a pointer to do call by reference. 1783 void VG_(mallinfo) ( ThreadId tid, struct vg_mallinfo* mi ) 1784 { 1785 UWord i, free_blocks, free_blocks_size; 1786 Arena* a = arenaId_to_ArenaP(VG_AR_CLIENT); 1787 1788 // Traverse free list and calculate free blocks statistics. 1789 // This may seem slow but glibc works the same way. 1790 free_blocks_size = free_blocks = 0; 1791 for (i = 0; i < N_MALLOC_LISTS; i++) { 1792 Block* b = a->freelist[i]; 1793 if (b == NULL) continue; 1794 for (;;) { 1795 free_blocks++; 1796 free_blocks_size += (UWord)get_pszB(a, b); 1797 b = get_next_b(b); 1798 if (b == a->freelist[i]) break; 1799 } 1800 } 1801 1802 // We don't have fastbins so smblks & fsmblks are always 0. Also we don't 1803 // have a separate mmap allocator so set hblks & hblkhd to 0. 1804 mi->arena = a->bytes_mmaped; 1805 mi->ordblks = free_blocks + VG_(free_queue_length); 1806 mi->smblks = 0; 1807 mi->hblks = 0; 1808 mi->hblkhd = 0; 1809 mi->usmblks = 0; 1810 mi->fsmblks = 0; 1811 mi->uordblks = a->bytes_on_loan - VG_(free_queue_volume); 1812 mi->fordblks = free_blocks_size + VG_(free_queue_volume); 1813 mi->keepcost = 0; // may want some value in here 1814 } 1815 1816 1817 /*------------------------------------------------------------*/ 1818 /*--- Services layered on top of malloc/free. ---*/ 1819 /*------------------------------------------------------------*/ 1820 1821 void* VG_(arena_calloc) ( ArenaId aid, HChar* cc, 1822 SizeT nmemb, SizeT bytes_per_memb ) 1823 { 1824 SizeT size; 1825 UChar* p; 1826 1827 size = nmemb * bytes_per_memb; 1828 vg_assert(size >= nmemb && size >= bytes_per_memb);// check against overflow 1829 1830 p = VG_(arena_malloc) ( aid, cc, size ); 1831 1832 VG_(memset)(p, 0, size); 1833 1834 //zzVALGRIND_MALLOCLIKE_BLOCK(p, size, 0, True); 1835 1836 return p; 1837 } 1838 1839 1840 void* VG_(arena_realloc) ( ArenaId aid, HChar* cc, 1841 void* ptr, SizeT req_pszB ) 1842 { 1843 Arena* a; 1844 SizeT old_pszB; 1845 UChar *p_new; 1846 Block* b; 1847 1848 ensure_mm_init(aid); 1849 a = arenaId_to_ArenaP(aid); 1850 1851 vg_assert(req_pszB < MAX_PSZB); 1852 1853 if (NULL == ptr) { 1854 return VG_(arena_malloc)(aid, cc, req_pszB); 1855 } 1856 1857 if (req_pszB == 0) { 1858 VG_(arena_free)(aid, ptr); 1859 return NULL; 1860 } 1861 1862 b = get_payload_block(a, ptr); 1863 vg_assert(blockSane(a, b)); 1864 1865 vg_assert(is_inuse_block(b)); 1866 old_pszB = get_pszB(a, b); 1867 1868 if (req_pszB <= old_pszB) { 1869 return ptr; 1870 } 1871 1872 p_new = VG_(arena_malloc) ( aid, cc, req_pszB ); 1873 1874 VG_(memcpy)(p_new, ptr, old_pszB); 1875 1876 VG_(arena_free)(aid, ptr); 1877 1878 return p_new; 1879 } 1880 1881 1882 /* Inline just for the wrapper VG_(strdup) below */ 1883 __inline__ Char* VG_(arena_strdup) ( ArenaId aid, HChar* cc, 1884 const Char* s ) 1885 { 1886 Int i; 1887 Int len; 1888 Char* res; 1889 1890 if (s == NULL) 1891 return NULL; 1892 1893 len = VG_(strlen)(s) + 1; 1894 res = VG_(arena_malloc) (aid, cc, len); 1895 1896 for (i = 0; i < len; i++) 1897 res[i] = s[i]; 1898 return res; 1899 } 1900 1901 1902 /*------------------------------------------------------------*/ 1903 /*--- Tool-visible functions. ---*/ 1904 /*------------------------------------------------------------*/ 1905 1906 // All just wrappers to avoid exposing arenas to tools. 1907 1908 void* VG_(malloc) ( HChar* cc, SizeT nbytes ) 1909 { 1910 return VG_(arena_malloc) ( VG_AR_TOOL, cc, nbytes ); 1911 } 1912 1913 void VG_(free) ( void* ptr ) 1914 { 1915 VG_(arena_free) ( VG_AR_TOOL, ptr ); 1916 } 1917 1918 void* VG_(calloc) ( HChar* cc, SizeT nmemb, SizeT bytes_per_memb ) 1919 { 1920 return VG_(arena_calloc) ( VG_AR_TOOL, cc, nmemb, bytes_per_memb ); 1921 } 1922 1923 void* VG_(realloc) ( HChar* cc, void* ptr, SizeT size ) 1924 { 1925 return VG_(arena_realloc) ( VG_AR_TOOL, cc, ptr, size ); 1926 } 1927 1928 Char* VG_(strdup) ( HChar* cc, const Char* s ) 1929 { 1930 return VG_(arena_strdup) ( VG_AR_TOOL, cc, s ); 1931 } 1932 1933 // Useful for querying user blocks. 1934 SizeT VG_(malloc_usable_size) ( void* p ) 1935 { 1936 return VG_(arena_malloc_usable_size)(VG_AR_CLIENT, p); 1937 } 1938 1939 1940 /*--------------------------------------------------------------------*/ 1941 /*--- end ---*/ 1942 /*--------------------------------------------------------------------*/ 1943