diff options
author | 2010-02-14 21:44:50 +0000 | |
---|---|---|
committer | 2010-02-14 21:44:50 +0000 | |
commit | c3bb16d5739241d9b7b72dc8b2665e0bac80acf5 (patch) | |
tree | 5bad29233ae36382135d56be675116dee6452634 /src/emu/emualloc.h | |
parent | 07db38f0f2bc7891c53221468f006583bc61d034 (diff) |
Moved global new/delete operators into inlines in emualloc.h
to avoid link errors with certain architectures. [couriersud]
Some minor cleanup/normalizing of emualloc in general.
[Aaron Giles]
Diffstat (limited to 'src/emu/emualloc.h')
-rw-r--r-- | src/emu/emualloc.h | 248 |
1 files changed, 163 insertions, 85 deletions
diff --git a/src/emu/emualloc.h b/src/emu/emualloc.h index 4bb6ceadbae..48b6e136c7d 100644 --- a/src/emu/emualloc.h +++ b/src/emu/emualloc.h @@ -46,9 +46,29 @@ #include "osdcore.h" -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ +//************************************************************************** +// MACROS +//************************************************************************** + +// pool allocation helpers +#define pool_alloc(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__) _type) +#define pool_alloc_clear(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__, zeromem) _type) +#define pool_alloc_array(_pool, _type, _num) (_pool).add_array(new(__FILE__, __LINE__) _type[_num], (_num)) +#define pool_alloc_array_clear(_pool, _type, _num) (_pool).add_array(new(__FILE__, __LINE__, zeromem) _type[_num], (_num)) +#define pool_free(_pool, v) (_pool).remove(v) + +// global allocation helpers +#define global_alloc(_type) pool_alloc(global_resource_pool, _type) +#define global_alloc_clear(_type) pool_alloc_clear(global_resource_pool, _type) +#define global_alloc_array(_type, _num) pool_alloc_array(global_resource_pool, _type, _num) +#define global_alloc_array_clear(_type, _num) pool_alloc_array_clear(global_resource_pool, _type, _num) +#define global_free(v) pool_free(global_resource_pool, v) + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** // zeromem_t is a dummy class used to tell new to zero memory after allocation class zeromem_t { }; @@ -62,19 +82,19 @@ private: resource_pool_item &operator=(const resource_pool_item &); public: - resource_pool_item(void *_ptr, size_t _size) - : next(NULL), - ordered_next(NULL), - ordered_prev(NULL), - ptr(_ptr), - size(_size) { } + resource_pool_item(void *ptr, size_t size) + : m_next(NULL), + m_ordered_next(NULL), + m_ordered_prev(NULL), + m_ptr(ptr), + m_size(size) { } virtual ~resource_pool_item() { } - resource_pool_item * next; - resource_pool_item * ordered_next; - resource_pool_item * ordered_prev; - void * ptr; - size_t size; + resource_pool_item * m_next; + resource_pool_item * m_ordered_next; + resource_pool_item * m_ordered_prev; + void * m_ptr; + size_t m_size; }; @@ -86,13 +106,13 @@ private: resource_pool_object<T> &operator=(const resource_pool_object<T> &); public: - resource_pool_object(T *_object) - : resource_pool_item(reinterpret_cast<void *>(_object), sizeof(T)), - object(_object) { } - virtual ~resource_pool_object() { delete object; } + resource_pool_object(T *object) + : resource_pool_item(reinterpret_cast<void *>(object), sizeof(T)), + m_object(object) { } + virtual ~resource_pool_object() { delete m_object; } private: - T *object; + T * m_object; }; @@ -105,15 +125,15 @@ private: resource_pool_array<T> &operator=(const resource_pool_array<T> &); public: - resource_pool_array(T *_array, int _count) - : resource_pool_item(reinterpret_cast<void *>(_array), sizeof(T) * _count), - array(_array), - count(_count) { } - virtual ~resource_pool_array() { delete[] array; } + resource_pool_array(T *array, int count) + : resource_pool_item(reinterpret_cast<void *>(array), sizeof(T) * count), + m_array(array), + m_count(count) { } + virtual ~resource_pool_array() { delete[] m_array; } private: - T *array; - int count; + T * m_array; + int m_count; }; @@ -129,7 +149,7 @@ public: ~resource_pool(); void add(resource_pool_item &item); - void remove(resource_pool_item &item) { remove(item.ptr); } + void remove(resource_pool_item &item) { remove(item.m_ptr); } void remove(void *ptr); void remove(const void *ptr) { remove(const_cast<void *>(ptr)); } resource_pool_item *find(void *ptr); @@ -140,49 +160,18 @@ public: template<class T> T *add_array(T* array, int count) { add(*new(__FILE__, __LINE__) resource_pool_array<T>(array, count)); return array; } private: - static const int hash_prime = 193; + static const int k_hash_prime = 193; - osd_lock * listlock; - resource_pool_item * hash[hash_prime]; - resource_pool_item * ordered_head; + osd_lock * m_listlock; + resource_pool_item * m_hash[k_hash_prime]; + resource_pool_item * m_ordered_head; }; -/*************************************************************************** - MACROS -***************************************************************************/ - -// re-route classic malloc-style allocations -#undef malloc -#undef calloc -#undef realloc -#undef free - -#define malloc(x) malloc_file_line(x, __FILE__, __LINE__) -#define calloc(x,y) __error_use_auto_alloc_clear_or_global_alloc_clear_instead__ -#define realloc(x,y) __error_realloc_is_dangerous__ -#define free(x) free_file_line(x, __FILE__, __LINE__) - -// pool allocation helpers -#define pool_alloc(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__) _type) -#define pool_alloc_clear(_pool, _type) (_pool).add_object(new(__FILE__, __LINE__, zeromem) _type) -#define pool_alloc_array(_pool, _type, _num) (_pool).add_array(new(__FILE__, __LINE__) _type[_num], (_num)) -#define pool_alloc_array_clear(_pool, _type, _num) (_pool).add_array(new(__FILE__, __LINE__, zeromem) _type[_num], (_num)) -#define pool_free(_pool, v) (_pool).remove(v) - -// global allocation helpers -#define global_alloc(_type) pool_alloc(global_resource_pool, _type) -#define global_alloc_clear(_type) pool_alloc_clear(global_resource_pool, _type) -#define global_alloc_array(_type, _num) pool_alloc_array(global_resource_pool, _type, _num) -#define global_alloc_array_clear(_type, _num) pool_alloc_array_clear(global_resource_pool, _type, _num) -#define global_free(v) pool_free(global_resource_pool, v) - - - -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** // global resource pool extern resource_pool global_resource_pool; @@ -192,9 +181,9 @@ extern const zeromem_t zeromem; -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ +//************************************************************************** +// FUNCTION PROTOTYPES +//************************************************************************** // allocate memory with file and line number information void *malloc_file_line(size_t size, const char *file, int line); @@ -202,36 +191,125 @@ void *malloc_file_line(size_t size, const char *file, int line); // free memory with file and line number information void free_file_line(void *memory, const char *file, int line); -// called from the exit path of any code that wants to check for unfreed memory +// called from the exit path of any code that wants to check for unfreed memory void dump_unfreed_mem(); + + +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** + // standard new/delete operators (try to avoid using) -void *operator new(std::size_t size) throw (std::bad_alloc); -void *operator new[](std::size_t size) throw (std::bad_alloc); -void operator delete(void *ptr); -void operator delete[](void *ptr); +inline void *operator new(std::size_t size) throw (std::bad_alloc) +{ + void *result = malloc_file_line(size, NULL, 0); + if (result == NULL) + throw std::bad_alloc(); + return result; +} + +inline void *operator new[](std::size_t size) throw (std::bad_alloc) +{ + void *result = malloc_file_line(size, NULL, 0); + if (result == NULL) + throw std::bad_alloc(); + return result; +} + +inline void operator delete(void *ptr) +{ + if (ptr != NULL) + free_file_line(ptr, NULL, 0); +} + +inline void operator delete[](void *ptr) +{ + if (ptr != NULL) + free_file_line(ptr, NULL, 0); +} + // 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); +inline void *operator new(std::size_t size, const char *file, int line) throw (std::bad_alloc) +{ + void *result = malloc_file_line(size, file, line); + if (result == NULL) + throw std::bad_alloc(); + return result; +} + +inline void *operator new[](std::size_t size, const char *file, int line) throw (std::bad_alloc) +{ + void *result = malloc_file_line(size, file, line); + if (result == NULL) + throw std::bad_alloc(); + return result; +} + +inline void operator delete(void *ptr, const char *file, int line) +{ + if (ptr != NULL) + free_file_line(ptr, file, line); +} + +inline void operator delete[](void *ptr, const char *file, int line) +{ + if (ptr != NULL) + free_file_line(ptr, file, 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 &); +inline void *operator new(std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc) +{ + void *result = malloc_file_line(size, file, line); + if (result == NULL) + throw std::bad_alloc(); + memset(result, 0, size); + return result; +} + +inline void *operator new[](std::size_t size, const char *file, int line, const zeromem_t &) throw (std::bad_alloc) +{ + void *result = malloc_file_line(size, file, line); + if (result == NULL) + throw std::bad_alloc(); + memset(result, 0, size); + return result; +} + +inline void operator delete(void *ptr, const char *file, int line, const zeromem_t &) +{ + if (ptr != NULL) + free_file_line(ptr, file, line); +} +inline void operator delete[](void *ptr, const char *file, int line, const zeromem_t &) +{ + if (ptr != NULL) + free_file_line(ptr, file, line); +} -/*************************************************************************** - ADDITIONAL MACROS -***************************************************************************/ + +//************************************************************************** +// ADDDITIONAL MACROS +//************************************************************************** + +// re-route classic malloc-style allocations +#undef malloc +#undef calloc +#undef realloc +#undef free + +#define malloc(x) malloc_file_line(x, __FILE__, __LINE__) +#define calloc(x,y) __error_use_auto_alloc_clear_or_global_alloc_clear_instead__ +#define realloc(x,y) __error_realloc_is_dangerous__ +#define free(x) free_file_line(x, __FILE__, __LINE__) // disable direct deletion #define delete __error_use_pool_free_mechanisms__ - #endif /* __EMUALLOC_H__ */ |