1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/************************************************************************************************
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott NC_ALLOC.CPP
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1997
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Mark of the Unicorn, Inc.
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use, copy, modify, distribute and sell this software
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * and its documentation for any purpose is hereby granted without fee,
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided that the above copyright notice appear in all copies and
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * that both that copyright notice and this permission notice appear
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * in supporting documentation.  Mark of the Unicorn makes no
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * representations about the suitability of this software for any
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * purpose.  It is provided "as is" without express or implied warranty.
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott************************************************************************************************/
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "nc_alloc.h"
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <string>
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (EH_NEW_HEADERS)
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <new>
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <cassert>
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <cstdlib>
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <assert.h>
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <stdlib.h>
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <new.h>
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (EH_NEW_IOSTREAMS)
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <iostream>
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <iostream.h>
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlong alloc_count = 0;
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlong object_count = 0;
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlong TestController::possible_failure_count = 0;
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* TestController::current_test = "<unknown>";
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* TestController::current_test_category = "no category";
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* TestController::current_container = 0;
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool  TestController::nc_verbose = true;
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool  TestController::never_fail = false;
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool  TestController::track_allocations = false;
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool  TestController::leak_detection_enabled = false;
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottTestController gTestController;
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//************************************************************************************************
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid TestController::maybe_fail(long) {
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (never_fail || Failure_threshold() == kNotInExceptionTest)
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return;
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // throw if allocation would satisfy the threshold
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (possible_failure_count++ >= Failure_threshold()) {
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // what about doing some standard new_handler() behavior here (to test it!) ???
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // reset and simulate an out-of-memory failure
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    Failure_threshold() = kNotInExceptionTest;
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef EH_NO_EXCEPTIONS
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    throw EH_STD::bad_alloc();
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (EH_HASHED_CONTAINERS_IMPLEMENTED)
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (__SGI_STL)
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if defined (EH_NEW_HEADERS)
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      include <hash_set>
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    else
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      include <hash_set.h>
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  elif defined (__MSL__)
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    include <hashset.h>
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    error what do I include to get hash_set?
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (EH_NEW_HEADERS)
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    include <set>
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  else
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    include <set.h>
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (EH_HASHED_CONTAINERS_IMPLEMENTED)
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef EH_STD::set<void*, EH_STD::less<void*> > allocation_set;
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottUSING_CSTD_NAME(size_t)
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct hash_void {
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  size_t operator()(void* x) const { return (size_t)x; }
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef EH_STD::hash_set<void*, ::hash_void, EH_STD::equal_to<void*> > allocation_set;
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic allocation_set& alloc_set() {
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static allocation_set s;
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return s;
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Prevents infinite recursion during allocation
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic bool using_alloc_set = false;
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (NO_FAST_ALLOCATOR)
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//  FastAllocator -- speeds up construction of TestClass objects when
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TESTCLASS_DEEP_DATA is enabled, and speeds up tracking of allocations
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// when the suite is run with the -t option.
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass FastAllocator {
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic:
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  //FastAllocator() : mFree(0), mUsed(0) {}
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static void *Allocate(size_t s) {
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    void *result = 0;
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (s <= sizeof(Block)) {
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if (mFree != 0) {
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        result = mFree;
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        mFree = mFree->next;
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      else if (mBlocks != 0 && mUsed < kBlockCount) {
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        result =  (void*)&mBlocks[mUsed++];
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return result;
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static bool Free(void* p) {
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    Block* b = (Block*)p;
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (mBlocks == 0 || b < mBlocks || b >= mBlocks + kBlockCount)
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      return false;
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    b->next = mFree;
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    mFree = b;
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return true;
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  struct Block;
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  friend struct Block;
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  enum {
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Number of fast allocation blocks to create.
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    kBlockCount = 1500,
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // You may need to adjust this number for your platform.
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // A good choice will speed tests. A bad choice will still work.
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    kMinBlockSize = 48
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  };
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  struct Block {
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    union {
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      Block *next;
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      double dummy; // fbp - force alignment
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      char dummy2[kMinBlockSize];
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    };
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  };
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static Block* mBlocks;
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static Block *mFree;
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static size_t mUsed;
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottFastAllocator::Block *FastAllocator::mBlocks =
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott(FastAllocator::Block*)EH_CSTD::calloc( sizeof(FastAllocator::Block), FastAllocator::kBlockCount );
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottFastAllocator::Block *FastAllocator::mFree;
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottsize_t FastAllocator::mUsed;
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic FastAllocator gFastAllocator;
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline char* AllocateBlock(size_t s) {
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (NO_FAST_ALLOCATOR)
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char * const p = (char*)gFastAllocator.Allocate( s );
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (p != 0)
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return p;
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return (char*)EH_CSTD::malloc(s);
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void* OperatorNew( size_t s ) {
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!using_alloc_set) {
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    simulate_possible_failure();
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    ++alloc_count;
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  char *p = AllocateBlock(s);
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (gTestController.TrackingEnabled() &&
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      gTestController.LeakDetectionEnabled() &&
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      !using_alloc_set) {
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    using_alloc_set = true;
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    bool inserted = alloc_set().insert(p).second;
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // Suppress warning about unused variable.
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    inserted;
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    EH_ASSERT(inserted);
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    using_alloc_set = false;
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return p;
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid* _STLP_CALL operator new(size_t s)
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef EH_DELETE_HAS_THROW_SPEC
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottthrow(EH_STD::bad_alloc)
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return OperatorNew( s ); }
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifdef EH_USE_NOTHROW
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid* _STLP_CALL operator new(size_t size, const EH_STD::nothrow_t&) throw() {
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return OperatorNew( size );
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return 0;
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if 1 /* defined (EH_VECTOR_OPERATOR_NEW) */
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid* _STLP_CALL operator new[](size_t size ) throw(EH_STD::bad_alloc) {
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return OperatorNew( size );
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  ifdef EH_USE_NOTHROW
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid* _STLP_CALL operator new[](size_t size, const EH_STD::nothrow_t&) throw() {
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return OperatorNew(size);
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return 0;
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL operator delete[](void* ptr) throw()
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ operator delete( ptr ); }
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (EH_DELETE_HAS_THROW_SPEC)
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL operator delete(void* s) throw()
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid _STLP_CALL operator delete(void* s)
246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if ( s != 0 ) {
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if ( !using_alloc_set ) {
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      --alloc_count;
251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      if ( gTestController.TrackingEnabled() && gTestController.LeakDetectionEnabled() ) {
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        using_alloc_set = true;
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        allocation_set::iterator p = alloc_set().find( (char*)s );
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        EH_ASSERT( p != alloc_set().end() );
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        alloc_set().erase( p );
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        using_alloc_set = false;
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if ! defined (NO_FAST_ALLOCATOR)
261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if ( !gFastAllocator.Free( s ) )
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      EH_CSTD::free(s);
264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*===================================================================================
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  ClearAllocationSet  (private helper)
270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  EFFECTS:  Empty the set of allocated blocks.
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott====================================================================================*/
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid TestController::ClearAllocationSet() {
274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (!using_alloc_set) {
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    using_alloc_set = true;
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    alloc_set().clear();
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    using_alloc_set = false;
278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbool TestController::ReportLeaked() {
283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  EndLeakDetection();
284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  EH_ASSERT( !using_alloc_set || (alloc_count == static_cast<int>(alloc_set().size())) );
286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (alloc_count != 0 || object_count != 0) {
288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    EH_STD::cerr<<"\nEH TEST FAILURE !\n";
289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    PrintTestName(true);
290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (alloc_count)
291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      EH_STD::cerr << "ERROR : " << alloc_count << " outstanding allocations.\n";
292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    if (object_count)
293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      EH_STD::cerr << "ERROR : " << object_count << " non-destroyed objects.\n";
294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    alloc_count = object_count = 0;
295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return true;
296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return false;
298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/*===================================================================================
303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  PrintTestName
304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  EFFECTS: Prints information about the current test. If err is false, ends with
306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    an ellipsis, because the test is ongoing. If err is true an error is being
307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    reported, and the output ends with an endl.
308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott====================================================================================*/
309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid TestController::PrintTestName(bool err) {
311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (current_container)
312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    EH_STD::cerr<<"["<<current_container<<"] :";
313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  EH_STD::cerr<<"testing "<<current_test <<" (" << current_test_category <<")";
314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (err)
315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    EH_STD::cerr<<EH_STD::endl;
316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  else
317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    EH_STD::cerr<<" ... ";
318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid TestController::ReportSuccess(int count) {
321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  if (nc_verbose)
322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    EH_STD::cerr<<(count+1)<<" try successful"<<EH_STD::endl;
323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlong& TestController::Failure_threshold() {
326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  static long failure_threshold = kNotInExceptionTest;
327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  return failure_threshold;
328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
329