Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
new.cpp
Go to the documentation of this file.
1
29// expand _TEST_EXPORT macros
30#define _RWSTD_TEST_SRC
31
32#include <stdlib.h> // for abort(), getenv()
33#include <string.h> // for memset()
34
35#include <rw_driver.h>
36#include <rw_printf.h>
37#include <rw_new.h>
38#include <rw_exception.h> // for rw_throw()
39
40
42#ifndef _RWSTD_BAD_ALLOC
43 // _RWSTD_BAD_ALLOC is #defined in <new> but some compilers (e.g.,
44 // SunPro) insist on #including their own new no matter what the
45 // preprocessor path or what command line options are used
46# if !defined (_RWSTD_NO_STD_BAD_ALLOC) \
47 || !defined (_RWSTD_NO_RUNTIME_IN_STD)
48# define _RWSTD_BAD_ALLOC _STD::bad_alloc
49 #else // if _RWSTD_NO_STD_BAD_ALLOC && _RWSTD_NO_RUNTIME_IN_STD
50
51 // working around a gcc 2.x bug (PR #24400)
52# if !defined (__GNUG__) || __GNUG__ > 2
53
54# define _RWSTD_BAD_ALLOC _STD::bad_alloc
55# else
56# define _RWSTD_BAD_ALLOC ::bad_alloc
57# endif // gcc > 2.x
58# endif // _RWSTD_NO_STD_BAD_ALLOC || !_RWSTD_NO_RUNTIME_IN_STD
59#endif // _RWSTD_BAD_ALLOC
60
61#ifndef _RWSTD_BAD_ALLOC
62# ifndef _RWSTD_NO_RUNTIME_IN_STD
63# define _RWSTD_BAD_ALLOC std::bad_alloc
64# else
65# define _RWSTD_BAD_ALLOC bad_alloc
66# endif // _RWSTD_NO_RUNTIME_IN_STD
67#endif // _RWSTD_BAD_ALLOC
68
69
71// keeps track of the number of pending calls to global dtors
72static size_t static_dtors;
73
74static size_t throw_at_calls [2] = { _RWSTD_SIZE_MAX, _RWSTD_SIZE_MAX };
75static size_t throw_at_blocks [2] = { _RWSTD_SIZE_MAX, _RWSTD_SIZE_MAX };
76static size_t throw_at_bytes [2] = { _RWSTD_SIZE_MAX, _RWSTD_SIZE_MAX };
77static size_t break_at_seqno = _RWSTD_SIZE_MAX;
78
79// enables tracing to stderr between the two sequence numbers
80static size_t trace_sequence [2] = { 0, 0 };
81
82static rwt_free_store store = {
83 { 0, 0 },
84 { 0, 0 },
85 { 0, 0 },
86 { 0, 0 },
87 { 0, 0 },
88 { 0, 0 },
89 { 0, 0 },
90 { 0, 0 },
91 { throw_at_calls, throw_at_calls + 1 },
92 { throw_at_blocks, throw_at_blocks + 1 },
93 { throw_at_bytes, throw_at_bytes + 1 },
94 &break_at_seqno
95};
96
97static rwt_free_store* pst = &store;
98
99
100struct Header
101{
102 Header *prev_; // link to the previous allocated block
103 Header *next_; // link to the next allocated block
104 void *ptr_; // pointer to user block (== this + 1)
105 size_t size_; // size of user block in bytes
106 size_t id_; // unique id
107 void* self_; // padded to an even multiple of sizeof(size_t)
108 // with the value of this
109};
110
111
112static Header *last; // pointer to the most recently allocated block
113
114
115// guard block stored immediately after the end of the user block
116static const char Guard [8] = {
117 '\xf8', '\xf9', '\xfa', '\xfb', '\xfc', '\xfd', '\xfe', '\xff'
118};
119
120
121static void
122_rw_print_heap ();
123
124// find a block by the user pointer in the list of allocated blocks
125static Header*
126_rw_find_block (void *ptr, bool check_heap, const char *caller)
127{
128 size_t nblocks = 0;
129 size_t nbytes = 0;
130
131 Header *res = 0;
132
133 for (Header *hdr = last; hdr; hdr = hdr->prev_) {
134
135 nblocks += 1;
136 nbytes += hdr->size_;
137
138 if (check_heap) {
139 // check the lead guard
140 if (hdr->self_ != hdr) {
141 rw_error (0, 0, __LINE__,
142 "%s:%d: header guard corruption at %#p: "
143 "expected %#p, got %#p",
144 hdr->ptr_, (const void*)hdr, hdr->self_);
145 abort ();
146 }
147
148 // check that the stored pointer has the expected value
149 if (hdr->ptr_ != hdr + 1) {
150 rw_error (0, 0, __LINE__,
151 "%s:%d: block address mismatch: "
152 "expected %#p, got %#p",
153 __FILE__, __LINE__,
154 (const void*)(hdr + 1), hdr->ptr_);
155
156 abort ();
157 }
158
159 // check the trailing guard
160 const char* const grd = (char*)hdr->ptr_ + hdr->size_;
161
162 if (memcmp (grd, Guard, sizeof Guard)) {
163
164 size_t off = 0;
165 while (grd [off] == Guard [off])
166 ++off;
167
168 typedef unsigned char UChar;
169
170 rw_error (0, 0, __LINE__,
171 "%s:%d: trailing guard corruption at %#p "
172 "+ %zu of a %zu byte block: '0x%02x' != '0x%x'",
173 __FILE__, __LINE__, hdr->ptr_,
174 hdr->size_ + off + 1, hdr->size_,
175 UChar (grd [off]), UChar (Guard [off]));
176
177 abort ();
178 }
179 }
180
181 if (ptr == hdr->ptr_) {
182 res = hdr;
183
184 if (!check_heap)
185 return res;
186 }
187 }
188
189 if (check_heap) {
190 // check that block and byte counters match the totals computed above
191 const size_t sum_blocks = pst->blocks_ [0] + pst->blocks_ [1];
192 const size_t sum_bytes = pst->bytes_ [0] + pst->bytes_ [1];
193
194 if (sum_blocks != nblocks || sum_bytes != nbytes) {
195 rw_error (0, 0, __LINE__,
196 "%s:%d: counts mismatch: found %zu "
197 "bytes in %zu blocks, expected "
198 "%zu in %zu", __FILE__, __LINE__,
199 nbytes, nblocks, sum_bytes, sum_blocks);
200
201 abort ();
202 }
203 }
204
205 if (caller && ptr && !res) {
206
207#if !defined (__DECCXX_VER) || __DECCXX_VER >= 60600000
208
209 rw_error (0, 0, __LINE__,
210 "%s:%d: %s (%#p): invalid pointer",
211 __FILE__, __LINE__, caller, ptr);
212
213 _rw_print_heap ();
214
215 abort ();
216
217#else // Compaq C++ < 6.6
218
219 // working around a bug in Compaq C++ libcxx
220 // Classic Iostreams library (see bug #359)
221 if (static_dtors) {
222
223 rw_error (0, 0, __LINE__,
224 "%s:%d: %s (%#p): invalid pointer",
225 __FILE__, __LINE__, caller, ptr);
226
227 _rw_print_heap ();
228
229 abort ();
230 }
231 else {
232
233 static int warned;
234
235 rw_warn (0 < warned++, 0, __LINE__,
236 "%s:%d: %s (%#p): warning: invalid pointer; "
237 "ignoring memory errors from here on out",
238 __FILE__, __LINE__, caller, ptr);
239 }
240
241#endif // Compaq C++ >= 6.6
242
243 }
244
245 return res;
246}
247
248
249// print the list of allocated blocks and check heap consistency
250static void
251_rw_print_heap ()
252{
253 rw_info (0, 0, __LINE__,
254 "%s:%d: heap dump:\n%zu bytes in %zu blocks%s",
255 __FILE__, __LINE__, pst->bytes_, pst->blocks_, last ? ":" : "");
256
257 for (Header *hdr = last; hdr; hdr = hdr->prev_) {
258
259 const size_t seq = hdr->id_;
260 const bool array = !!(seq >> (_RWSTD_CHAR_BIT * sizeof (size_t) - 1));
261
262 rw_info (0, 0, __LINE__,
263 "%zu: %zu bytes at %#p allocated by operator new%s()",
264 hdr->id_, hdr->size_, hdr->ptr_, array ? "[]" : "");
265 }
266
267 if (last)
268 // check heap consistency
269 _rw_find_block (last, true, 0);
270}
271
272
273static size_t seq_gen; // sequence number generator
274
275
276_TEST_EXPORT void*
277operator_new (size_t nbytes, bool array)
278{
279 if (0 == trace_sequence [0] && trace_sequence [0] == trace_sequence [1]) {
280
281 // the first time opetato new is called try to get options
282 // from the environment by checking the RWSTD_NEW_FLAGS
283 // environment variable in the following format:
284 //
285 // RWSTD_NEW_FLAGS=[<seqrange>][:<break-seqno>]
286 // seqrange ::= <start-seqno>[-<end-seqno>]
287
288 static const char* envvar = getenv ("RWSTD_NEW_FLAGS");
289
290 if (envvar) {
291 char *end = _RWSTD_CONST_CAST (char*, envvar);
292
293 if ('-' == *end) {
294 // begin tracing with the sequence number 0
295 trace_sequence [0] = 0;
296 }
297 else {
298 // begin tracing with the given sequence number
299 trace_sequence [0] = strtoul (end, &end, 10);
300 }
301
302 if ('-' == *end) {
303 // end tracing with the given sequence number
304 ++end;
305 trace_sequence [1] = strtoul (end, &end, 10);
306 }
307 else {
308 // continue tracing indefinitely
309 trace_sequence [1] = _RWSTD_SIZE_MAX;
310 }
311
312 if (':' == *end) {
313 // break at the given seuqence number
314 ++end;
315 *pst->break_at_seqno_ = strtoul (end, &end, 10);
316 }
317 }
318 }
319
320 static const char* const name[] = {
321 "operator new", "operator new[]"
322 };
323
324 // increment the call counter regardless of success
325 ++pst->new_calls_ [array];
326
327 // prevent warnings about unused variable and/or unreachable statement
328 void *ptr = 0;
329
330 const bool reached_call_limit =
331 pst->new_calls_ [array] == *pst->throw_at_calls_ [array];
332 const bool reached_block_limit =
333 pst->blocks_ [array] >= *pst->throw_at_blocks_ [array];
334 const bool reached_size_limit =
335 pst->bytes_ [array] + nbytes >= *pst->throw_at_bytes_ [array];
336
337 const bool reached_breakpoint = seq_gen == *pst->break_at_seqno_;
338
339 if (reached_breakpoint) {
340 char buffer [128];
341 rw_snprintfa (buffer, 128,
342 "%s (%zu): breakpoint at sequence number %zu",
343 name [array], nbytes, *pst->break_at_seqno_);
344
345 // abort() when a breakpoint has been reached
346 _RW::__rw_assert_fail (buffer, __FILE__, __LINE__, 0);
347
348 // should not get here except when the program handles
349 // SIGABRT and returns from the handler
350 }
351
352 if ( reached_call_limit
353 || reached_block_limit
354 || reached_size_limit) {
355
356#ifndef _RWSTD_NO_EXCEPTIONS
357
358 try {
359 const char * threw = "threw bad_alloc:";
360
361 if (reached_call_limit)
363 __FILE__, __LINE__, name [array],
364 "(%zu) %s reached call limit of %zu",
365 nbytes, threw, pst->new_calls_ [array]);
366
367 else if (reached_block_limit)
369 __FILE__, __LINE__, name [array],
370 "(%zu) %s reached block limit of %zu: %zu",
371 nbytes, threw, *pst->throw_at_blocks_ [array],
372 pst->blocks_ [array]);
373
374 else if (reached_size_limit)
376 __FILE__, __LINE__, name [array],
377 "(%zu) %s reached size limit of %zu: %zu",
378 nbytes, threw, *pst->throw_at_bytes_ [array],
379 pst->bytes_ [array]);
380 }
381 catch (const std::exception & ex) {
382 if (trace_sequence [0] <= seq_gen && seq_gen < trace_sequence [1])
383 rw_fprintf (rw_stderr, "%s\n", ex.what ());
384
385 throw;
386 }
387
388#else // if defined (_RWSTD_NO_EXCEPTIONS)
389
390 if (reached_breakpoint) {
391 char buf[4096];
392
393 rw_snprintfa (buf, sizeof(buf),
394 "reached a breakpoint at of %zu calls", *pst->break_at_seqno_);
395
396 _RW::__rw_assert_fail (buf, __FILE__, __LINE__, name [array]);
397 }
398
399 if (trace_sequence [0] <= seq_gen && seq_gen < trace_sequence [1])
400 rw_fprintf (rw_stderr, "%s:%d: %s (%zu) --> %#p\n",
401 __FILE__, __LINE__, name [array], nbytes, ptr);
402
403 return 0;
404
405#endif // _RWSTD_NO_EXCEPTIONS
406
407 }
408
409 const size_t block_size = nbytes + sizeof (Header) + sizeof (Guard);
410
411 // prevent arithmetic overflow
412 if (nbytes < block_size)
413 ptr = malloc (block_size);
414
415 if (!ptr) {
416
417#ifndef _RWSTD_NO_EXCEPTIONS
418
419 try {
421 __FILE__, __LINE__, name [array],
422 "(%zu): malloc() returned 0", nbytes);
423 }
424 catch (const std::exception & ex) {
425 if (trace_sequence [0] <= seq_gen && seq_gen < trace_sequence [1])
426 rw_fprintf (rw_stderr, "%s\n", ex.what ());
427
428 throw;
429 }
430
431#else // if defined (_RWSTD_NO_EXCEPTIONS)
432 return ptr;
433#endif // _RWSTD_NO_EXCEPTIONS
434 }
435
436 // invalidate storage
437 memset (ptr, -1, block_size);
438
439 // increment counters
440 pst->blocks_ [array] += 1;
441 pst->bytes_ [array] += nbytes;
442
443 // adjust the maximum total number of blocks ever allocated
444 if (pst->blocks_ [array] > pst->max_blocks_ [array])
445 pst->max_blocks_ [array] = pst->blocks_ [array];
446
447 // adjust the maximum total number of bytes ever allocated
448 if (pst->bytes_ [array] > pst->max_bytes_ [array])
449 pst->max_bytes_ [array] = pst->bytes_ [array];
450
451 // adjust the size of the single largest block ever allocated
452 if (nbytes > pst->max_block_size_ [array])
453 pst->max_block_size_ [array] = nbytes;
454
455 // copy guard to the end of the allocated block
456 memcpy ((char*)ptr + sizeof (Header) + nbytes, Guard, sizeof (Guard));
457
458 Header* const hdr = (Header*)ptr;
459
460 hdr->ptr_ = (Header*)ptr + 1;
461 hdr->size_ = nbytes;
462 hdr->id_ = array ? ~seq_gen : seq_gen;
463 hdr->self_ = hdr;
464
465 if (0 == last) {
466 hdr->prev_ = 0;
467 hdr->next_ = 0;
468 }
469 else {
470 hdr->next_ = 0;
471 hdr->prev_ = last;
472 last->next_ = hdr;
473 }
474
475 last = hdr;
476
477 if (trace_sequence [0] <= seq_gen && seq_gen < trace_sequence [1])
478 rw_note (0, 0, __LINE__,
479 "%s:%d: %3zi. %s (%zu) --> %#p",
480 __FILE__, __LINE__, seq_gen,
481 name [array], nbytes, hdr->ptr_);
482
483 ++seq_gen;
484
485 _rw_find_block (hdr->ptr_, true, 0);
486
487 return hdr->ptr_;
488}
489
490
491_TEST_EXPORT void
493{
494 static const char* const name[] = {
495 "operator delete", "operator delete[]"
496 };
497
498 // increment the call counter regardless of success
499 ++pst->delete_calls_ [array];
500
501 if (ptr) {
502
503 // find the block of memory that `ptr' was allocated from
504 // and check the whole heap in the process; the call will
505 // abort if any block has been corrupted
506 Header* const hdr = _rw_find_block (ptr, true, name [array]);
507
508 if (!hdr) {
509 // hdr should never be 0 except under special circumstances
510 // such as when the compiler's runtime library itself passes
511 // the wrong argument to operator delete (such as libcxx
512 // on True64 with Compaq C++ -- see bug #359)
513 free (ptr);
514
515 return;
516 }
517
518 const size_t nbytes = hdr->size_;
519
520 bool mismatch;
521
522 size_t seq = hdr->id_;
523 if (seq >> (_RWSTD_CHAR_BIT * sizeof (size_t) - 1)) {
524
525 // the MSB of the stored sequence number is set
526 // for blocks allocated with the array form of
527 // operator new and must be deallocated with
528 // the corresponding array form of operator
529 // delete
530 mismatch = !array;
531 seq = ~seq;
532 }
533 else {
534 mismatch = array;
535 }
536
537 if (trace_sequence [0] <= seq && seq < trace_sequence [1]) {
538 if (mismatch)
539 rw_error (0, 0, __LINE__, "%s:%d: %3zi. %s (%#p); size = %zu"
540 ": array form mismatch",
541 __FILE__, __LINE__, seq, name [array], ptr, nbytes);
542 else
543 rw_note (0, 0, __LINE__, "%s:%d: %3zi. %s (%#p); size = %zu",
544 __FILE__, __LINE__, seq, name [array], ptr, nbytes);
545 }
546 else if (mismatch) {
547
548 const size_t ord = (seq + 1) % 10;
549
550 const char* const ord_sfx =
551 1 == ord ? "st" : 2 == ord ? "nd" : 3 == ord ? "rd" : "th";
552
553 rw_error (0, 0, __LINE__,
554 "%s:%d: deallocation mismatch: "
555 "pointer allocated %zu%s in the program "
556 "with a call to operator new%s(%zu) "
557 "being deallocated with the wrong form of %s(%#p)",
558 __FILE__, __LINE__,
559 seq + 1, ord_sfx, array ? "" : "[]",
560 nbytes, name [array], ptr);
561 abort ();
562 }
563
564 // decrement block and byte counters and remove block
565 // from the list only after all checks have succeeded
566 // so that tests that catch SIGABRT sent by one of the
567 // calls to abort() above and retry the operation may
568 // succeed
569 pst->blocks_ [array] -= 1;
570 pst->bytes_ [array] -= nbytes;
571
572 if (hdr->prev_)
573 hdr->prev_->next_ = hdr->next_;
574 if (hdr->next_)
575 hdr->next_->prev_ = hdr->prev_;
576
577 if (hdr == last)
578 last = hdr->prev_;
579
580 const size_t block_size = nbytes + sizeof (Header) + sizeof (Guard);
581
582 // invalidate the entire block including bookkeeping data
583 memset (hdr, -1, block_size);
584
585 free (hdr);
586 }
587 else {
588 ++pst->delete_0_calls_ [array];
589
590 if (trace_sequence [0] <= seq_gen && seq_gen < trace_sequence [1])
591 rw_note (0, 0, __LINE__, "%s:%d: %s (0)",
592 __FILE__, __LINE__, name [array]);
593 }
594}
595
598{
599 rwt_free_store* const ret = pst;
600
601 if (st)
602 pst = st;
603
604 return ret;
605}
606
607static void
608rwt_checkpoint_compare (size_t* diffs, size_t n,
609 const size_t* st0, const size_t* st1,
610 bool& diff_0)
611{
612 for (size_t i = 0; i != n; ++i) {
613 diffs [i] = st1 [i] - st0 [i];
614 if (diffs [i])
615 diff_0 = false;
616 }
617}
618
621{
622 static rwt_free_store checkpoint;
623
624 if (st0 && st1) {
625
626 // compute the difference between the two states
627 // of the free_store specified by the arguments
628
629 static rwt_free_store diff;
630 memset (&diff, 0, sizeof diff);
631
632 bool diff_0 = true; // difference of 0 (i.e., none)
633
634#define EXTENT(array) (sizeof (array) / sizeof(*array))
635#define COMPARE(member) \
636 rwt_checkpoint_compare (diff.member, EXTENT(diff.member), \
637 st0->member, st1->member, diff_0)
638
639 COMPARE (new_calls_);
640 COMPARE (delete_calls_);
641 COMPARE (delete_0_calls_);
642 COMPARE (blocks_);
643 COMPARE (bytes_);
644 COMPARE (max_blocks_);
645 COMPARE (max_bytes_);
646 COMPARE (max_block_size_);
647
648 if (diff_0)
649 return 0;
650
651 return &diff;
652 }
653
654 if (!st0 && !st1) {
655 // compute the difference between the most recent checkpoint
656 // and the current state of the free store; store the current
657 // state as the new checkpoint
658
659 _rw_find_block (0, true, 0);
660
661 rwt_free_store* const ckpt = rwt_checkpoint (&checkpoint, pst);
662
663 memcpy (&checkpoint, pst, sizeof checkpoint);
664
665 return ckpt;
666 }
667
668 if (st0) {
669 // compute the difference between the checkpoint specified by
670 // the first argument and the current state of the free store
671 // store the current state as the last checkpoint
672
673 return rwt_checkpoint (st0, pst);
674 }
675
676 // compute the difference between the most recent checkpoint and
677 // the checkpoint specified by the second argument
678
679 return rwt_checkpoint (&checkpoint, st1);
680}
681
682
683_TEST_EXPORT _RWSTD_SIZE_T
684rwt_check_leaks (_RWSTD_SIZE_T *bytes, const rwt_free_store *st)
685{
686 const rwt_free_store* const ckpt = rwt_checkpoint (st, 0);
687
688 if (ckpt) {
689 if (bytes)
690 *bytes = ckpt->bytes_ [0] + ckpt->bytes_ [1];
691
692 return ckpt->blocks_ [0] + ckpt->blocks_ [1];
693 }
694
695 if (bytes)
696 *bytes = 0;
697
698 return 0;
699}
700
701
703{
704 ++static_dtors;
705}
706
708{
709 --static_dtors;
710}
#define i
Definition 17.names.cpp:126
#define res
Definition 17.names.cpp:531
#define ptr
Definition 17.names.cpp:525
#define last
Definition 17.names.cpp:487
#define array
Definition 17.names.cpp:447
#define buf
Definition 17.names.cpp:452
#define off
Definition 17.names.cpp:507
#define buffer
Definition 17.names.cpp:453
#define n
Definition 17.names.cpp:130
const int end
void(* operator_delete)(void *, void *)
void *(* operator_new)(size_t, void *)
#define _RWSTD_CONST_CAST(T, x)
Definition _defs.h:536
A TOML array.
Definition array.hpp:258
const char * name
Definition codecvt1.cpp:72
_TEST_EXPORT _RWSTD_SIZE_T rwt_check_leaks(_RWSTD_SIZE_T *bytes, const rwt_free_store *st)
Definition new.cpp:684
_TEST_EXPORT rwt_free_store * rwt_get_free_store(rwt_free_store *st)
Definition new.cpp:597
#define COMPARE(member)
_TEST_EXPORT rwt_free_store * rwt_checkpoint(const rwt_free_store *st0, const rwt_free_store *st1)
Definition new.cpp:620
UChar bytes[sizeof(int)]
Definition printf.cpp:83
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
Definition driver.cpp:1681
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
Definition driver.cpp:1664
_TEST_EXPORT int rw_error(int, const char *, int, const char *,...)
Definition driver.cpp:1613
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)
Definition driver.cpp:1647
_TEST_EXPORT void rw_throw(ExceptionId exid, const char *file, int line, const char *function, const char *fmt,...)
@ ex_bad_alloc
_TEST_EXPORT rw_file *const rw_stderr
Definition printf.cpp:3348
_TEST_EXPORT char * rw_snprintfa(char *buf, _RWSTD_SIZE_T bufsize, const char *fmt,...)
_TEST_EXPORT int rw_fprintf(rw_file *, const char *,...)
Definition printf.cpp:3397
#define _TEST_EXPORT
Definition rw_testdefs.h:55
unsigned char UChar
Definition collate.cpp:122
void * self_
Definition new.cpp:107
Header * next_
Definition new.cpp:103
size_t size_
Definition new.cpp:105
void * ptr_
Definition new.cpp:104
size_t id_
Definition new.cpp:106
Header * prev_
Definition new.cpp:102
MyNewInit()
Definition new.cpp:702
~MyNewInit()
Definition new.cpp:707
_RWSTD_SIZE_T delete_calls_[2]
Definition rw_new.h:52
_RWSTD_SIZE_T * throw_at_bytes_[2]
Definition rw_new.h:95
_RWSTD_SIZE_T max_blocks_[2]
Definition rw_new.h:69
_RWSTD_SIZE_T max_bytes_[2]
Definition rw_new.h:73
_RWSTD_SIZE_T bytes_[2]
Definition rw_new.h:65
_RWSTD_SIZE_T delete_0_calls_[2]
Definition rw_new.h:57
_RWSTD_SIZE_T * throw_at_calls_[2]
Definition rw_new.h:83
_RWSTD_SIZE_T max_block_size_[2]
Definition rw_new.h:77
_RWSTD_SIZE_T blocks_[2]
Definition rw_new.h:61
_RWSTD_SIZE_T * break_at_seqno_
Definition rw_new.h:99
_RWSTD_SIZE_T new_calls_[2]
Definition rw_new.h:47
_RWSTD_SIZE_T * throw_at_blocks_[2]
Definition rw_new.h:89