123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- /*
- * DUMA - Red-Zone memory allocator.
- * Copyright (C) 2002-2008 Hayati Ayguen <h_ayguen@web.de>, Procitec GmbH
- * License: GNU LGPL (GNU Lesser General Public License, see COPYING-GPL)
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * FILE CONTENTS:
- * header file for inclusion from YOUR C++ application code
- * various new/delete/new[]/delete[] declarations
- * you must include <new> before including this file.
- */
- /* explicitly no "#ifndef _DUMAPP_H_" to allow mutliple inclusions
- * within single source file with inclusion of noduma.h in between
- */
- #ifndef __cplusplus
- /* avoid usage of C++ operator replacements in C code */
- #error compile with a C++ compiler, or define DUMA_NO_CPP_SUPPORT to remove this error
- #endif
- #include <new>
- #include "duma.h"
- #if __cplusplus < 201103L
- #define DUMA_EXCEPTION_SPECS 1
- #endif
- /* remove previous macro definitions */
- #include "noduma.h"
- #if (defined(DUMA_NO_CPP_SUPPORT) || defined(DUMA_NO_LEAKDETECTION))
- /* define macros as wrapper without special functionality */
- #define NEW_ELEM(TYPE) new TYPE
- #define NEW_ARRAY(TYPE, COUNT) new TYPE[COUNT]
- #define DEL_ELEM(PTR) delete PTR
- #define DEL_ARRAY(PTR) delete[] PTR
- #endif /* ( defined(DUMA_NO_CPP_SUPPORT) || defined(DUMA_NO_LEAKDETECTION) ) \
- */
- #ifndef DUMA_CDECL
- #ifdef _MSC_VER
- #define DUMA_CDECL __cdecl
- #else
- #define DUMA_CDECL
- #endif
- #endif
- #ifndef DUMA_SIZE_T
- #ifdef _MSC_VER
- #define DUMA_SIZE_T size_t
- #else
- #define DUMA_SIZE_T std::size_t
- #endif
- #endif
- #if __cplusplus <= 199711L
- #define NEW_THROW_SPEC throw(std::bad_alloc)
- #else
- #define NEW_THROW_SPEC
- #endif
- #ifndef DUMA_NO_CPP_SUPPORT
- #ifndef DUMA_CPP_OPERATORS_DECLARED /* && !defined(DUMA_NO_CPP_SUPPORT) */
- #define DUMA_CPP_OPERATORS_DECLARED
- /*
- * Classification
- * A allocation <-> F free
- * S single object form <-> A array form
- * W without nothrow <-> N with std::nothrow_t parameter
- */
- /* 1x : SINGLE OBJECT FORM - NO DEBUG INFORMATION */
- /* (11) = (a) ; ASW */
- /* (12) = (b) ; ASN */
- /* (13) = (c) ; FSW */
- /* (14) = (d) ; FSN */
- void *DUMA_CDECL operator new(DUMA_SIZE_T) NEW_THROW_SPEC;
- void *DUMA_CDECL operator new(DUMA_SIZE_T, const std::nothrow_t &) throw();
- void DUMA_CDECL operator delete(void *) throw();
- void DUMA_CDECL operator delete(void *, const std::nothrow_t &) throw();
- /* 2x : ARRAY OBJECT FORM - NO DEBUG INFORMATION */
- /* (21) = (a) ; AAW */
- /* (22) = (b) ; AAN */
- /* (23) = (c) ; FAW */
- /* (24) = (d) ; FAN */
- void *DUMA_CDECL operator new[](DUMA_SIZE_T) NEW_THROW_SPEC;
- void *DUMA_CDECL operator new[](DUMA_SIZE_T, const std::nothrow_t &) throw();
- void DUMA_CDECL operator delete[](void *) throw();
- void DUMA_CDECL operator delete[](void *, const std::nothrow_t &) throw();
- #ifndef DUMA_NO_LEAKDETECTION /* && !defined(DUMA_CPP_OPERATORS_DECLARED) */
- /* 3x : SINGLE OBJECT FORM - WITH DEBUG INFORMATION */
- /* (31) = (a) ; ASW */
- /* (32) = (b) ; ASN */
- /* (33) = (c) ; FSW */
- /* (34) = (d) ; FSN */
- void *DUMA_CDECL operator new(DUMA_SIZE_T, const char *, int) NEW_THROW_SPEC;
- void *DUMA_CDECL operator new(DUMA_SIZE_T, const std::nothrow_t &, const char *,
- int) throw();
- void DUMA_CDECL operator delete(void *, const char *, int) throw();
- void DUMA_CDECL operator delete(void *, const std::nothrow_t &, const char *,
- int) throw();
- /* 4x : ARRAY OBJECT FORM - WITH DEBUG INFORMATION */
- /* (41) = (a) ; AAW */
- /* (42) = (b) ; AAN */
- /* (43) = (c) ; FAW */
- /* (44) = (d) ; FAN */
- void *DUMA_CDECL operator new[](DUMA_SIZE_T, const char *, int) NEW_THROW_SPEC;
- void *DUMA_CDECL operator new[](DUMA_SIZE_T, const std::nothrow_t &,
- const char *, int) throw();
- void DUMA_CDECL operator delete[](void *, const char *, int) throw();
- void DUMA_CDECL operator delete[](void *, const std::nothrow_t &, const char *,
- int) throw();
- #endif /* DUMA_NO_LEAKDETECTION */
- #endif /* DUMA_CPP_OPERATORS_DECLARED */
- #ifndef DUMA_NO_LEAKDETECTION /* && !defined(DUMA_CPP_OPERATORS_DECLARED) */
- #ifndef DUMA_NO_THREAD_SAFETY
- #include "duma_sem.h"
- #endif
- /* define macros as wrapper for our special operators */
- #ifdef DUMA_OLD_NEW_MACRO
- /* throwing variants */
- #define NEW_ELEM(TYPE) new (__FILE__, __LINE__) TYPE
- #define NEW_ARRAY(TYPE, COUNT) new (__FILE__, __LINE__) TYPE[COUNT]
- /* non throwing variant */
- #define NEW_ELEM_NOTHROW(TYPE) new (std::nothrow, __FILE__, __LINE__) TYPE
- #define NEW_ARRAY_NOTHROW(TYPE, COUNT) \
- new (std::nothrow, __FILE__, __LINE__) TYPE[COUNT]
- #else
- /* #define new_NOTHROW new(std::nothrow,__FILE__,__LINE__)
- */
- #define new new (__FILE__, __LINE__)
- #endif /* DUMA_OLD_NEW_MACRO */
- #ifdef DUMA_OLD_DEL_MACRO
- /* always use _duma_g.TLS.DelPtr/DUMA_DeleteFile/DUMA_DeleteLine
- * to allow best possible filename/line reports when
- * non-DUMA deallocations are called from destructors
- */
- /* non-throwing */
- #define DEL_ELEM(PTR) \
- for (++_duma_g.TLS.DelPtr, _duma_g.TLS.Magic = 1; _duma_g.TLS.Magic; \
- _duma_g.TLS.Magic = 0, --_duma_g.TLS.DelPtr) \
- operator delete(PTR, __FILE__, __LINE__)
- #define DEL_ARRAY(PTR) \
- for (++_duma_g.TLS.DelPtr, _duma_g.TLS.Magic = 1; _duma_g.TLS.Magic; \
- _duma_g.TLS.Magic = 0, --_duma_g.TLS.DelPtr) \
- operator delete[](PTR, __FILE__, __LINE__)
- /* explicitly non-throwing */
- #define DEL_ELEM_NOTHROW(PTR) \
- for (++_duma_g.TLS.DelPtr, _duma_g.TLS.Magic = 1; _duma_g.TLS.Magic; \
- _duma_g.TLS.Magic = 0, --_duma_g.TLS.DelPtr) \
- operator delete(PTR, std::nothrow, __FILE__, __LINE__)
- #define DEL_ARRAY_NOTHROW(PTR) \
- for (++_duma_g.TLS.DelPtr, _duma_g.TLS.Magic = 1; _duma_g.TLS.Magic; \
- _duma_g.TLS.Magic = 0, --_duma_g.TLS.DelPtr) \
- operator delete[](PTR, std::nothrow, __FILE__, __LINE__)
- #else
- #ifndef DUMA_NO_THREAD_SAFETY
- /* define a thread safe delete */
- #define delete \
- for (DUMA_GET_SEMAPHORE(), DUMA_GET_SEMAPHORE(), ++_duma_g.TLS.DelPtr, \
- DUMA_ASSERT(_duma_g.TLS.DelPtr < DUMA_MAX_DEL_DEPTH), \
- _duma_g.TLS.Magic = 1, \
- _duma_g.TLS.DelFile[_duma_g.TLS.DelPtr] = __FILE__, \
- _duma_g.TLS.DelLine[_duma_g.TLS.DelPtr] = __LINE__; \
- DUMA_RELEASE_SEMAPHORE(_duma_g.TLS.Magic); \
- _duma_g.TLS.Magic = 0, --_duma_g.TLS.DelPtr) \
- delete
- #else
- /* also thread safe by using TLS variables */
- #define delete \
- for (++_duma_g.TLS.DelPtr, \
- DUMA_ASSERT(_duma_g.TLS.DelPtr < DUMA_MAX_DEL_DEPTH), \
- _duma_g.TLS.Magic = 1, \
- _duma_g.TLS.DelFile[_duma_g.TLS.DelPtr] = __FILE__, \
- _duma_g.TLS.DelLine[_duma_g.TLS.DelPtr] = __LINE__; \
- _duma_g.TLS.Magic; _duma_g.TLS.Magic = 0, --_duma_g.TLS.DelPtr) \
- delete
- #endif /* DUMA_NO_THREAD_SAFETY */
- #endif /* DUMA_OLD_DEL_MACRO */
- #endif /* end ifdef DUMA_NO_LEAKDETECTION */
- #endif /* end ifdef DUMA_NO_CPP_SUPPORT */
- #include "duma.h"
|