diff options
Diffstat (limited to 'src/lib/util/corealloc.h')
-rw-r--r-- | src/lib/util/corealloc.h | 93 |
1 files changed, 19 insertions, 74 deletions
diff --git a/src/lib/util/corealloc.h b/src/lib/util/corealloc.h index c4d6793562d..d5eec557afa 100644 --- a/src/lib/util/corealloc.h +++ b/src/lib/util/corealloc.h @@ -15,6 +15,8 @@ #include <stdlib.h> #include <new> +#include <type_traits> +#include <utility> #include "osdcore.h" @@ -23,86 +25,29 @@ //************************************************************************** // global allocation helpers -- use these instead of new and delete -#define global_alloc(_type) new(__FILE__, __LINE__) _type -#define global_alloc_clear(_type) new(__FILE__, __LINE__, zeromem) _type -#define global_alloc_array(_type, _num) new(__FILE__, __LINE__) _type[_num] -#define global_alloc_array_clear(_type, _num) new(__FILE__, __LINE__, zeromem) _type[_num] +#define global_alloc(_type) new _type +#define global_alloc_array(_type, _num) new _type[_num] #define global_free(_ptr) do { delete _ptr; } while (0) #define global_free_array(_ptr) do { delete[] _ptr; } while (0) -//************************************************************************** -// FUNCTION PROTOTYPES -//************************************************************************** - -// allocate memory with file and line number information -void *malloc_file_line(size_t size, const char *file, int line, bool array, bool throw_on_fail, bool clear); - -// free memory with file and line number information -void free_file_line(void *memory, const char *file, int line, bool array); -inline void free_file_line(const void *memory, const char *file, int line, bool array) { free_file_line(const_cast<void *>(memory), file, line, array); } - -// realloc with file and line number info for internal use -void *realloc_internal(void *memory, size_t size, const char *file, int line, bool array); - - -// called from the exit path of any code that wants to check for unfreed memory -void track_memory(bool track); -UINT64 next_memory_id(); -void dump_unfreed_mem(UINT64 start = 0); - - - -//************************************************************************** -// OPERATOR OVERLOADS - DECLARATIONS -//************************************************************************** - -// zeromem_t is a dummy class used to tell new to zero memory after allocation -class zeromem_t { }; - -// file/line new/delete operators -void *operator new(std::size_t size, const char *file, int line) throw (std::bad_alloc); -void *operator new[](std::size_t size, const char *file, int line) throw (std::bad_alloc); -void operator delete(void *ptr, const char *file, int line); -void operator delete[](void *ptr, const char *file, int line); - -// file/line new/delete operators with zeroing -void *operator new(std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc); -void *operator new[](std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc); -void operator delete(void *ptr, const char *file, int line, const zeromem_t &); -void operator delete[](void *ptr, const char *file, int line, const zeromem_t &); - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// dummy objects to pass to the specialized new variants -extern const zeromem_t zeromem; - - - -//************************************************************************** -// ADDDITIONAL MACROS -//************************************************************************** - -#ifndef NO_MEM_TRACKING -// re-route classic malloc-style allocations -#undef malloc -#undef realloc -#undef free - -#define malloc(x) malloc_file_line(x, __FILE__, __LINE__, true, false, false) -#define realloc(x,y) realloc_internal(x, y, __FILE__, __LINE__, true, false) -#define free(x) free_file_line(x, __FILE__, __LINE__, true) +template<typename _Tp, typename... _Args> +inline _Tp* global_alloc_clear(_Args&&... __args) +{ + UINT8* ptr = new UINT8[sizeof(_Tp)]; // allocate memory + memset(ptr, 0, sizeof(_Tp)); + return new(ptr) _Tp(std::forward<_Args>(__args)...); +} -#if !defined(_MSC_VER) || _MSC_VER < 1900 // < VS2015 -#undef calloc -#define calloc(x,y) __error_use_auto_alloc_clear_or_global_alloc_clear_instead__ -#endif +template<typename _Tp> +inline _Tp* global_alloc_array_clear(size_t __num) +{ + auto size = sizeof(_Tp) * __num; + UINT8* ptr = new UINT8[size]; // allocate memory + memset(ptr, 0, size); + return new(ptr) _Tp[__num](); +} -#endif #endif /* __COREALLOC_H__ */ |