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