summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/emualloc.h
diff options
context:
space:
mode:
author Aaron Giles <aaron@aarongiles.com>2010-02-14 21:44:50 +0000
committer Aaron Giles <aaron@aarongiles.com>2010-02-14 21:44:50 +0000
commitc3bb16d5739241d9b7b72dc8b2665e0bac80acf5 (patch)
tree5bad29233ae36382135d56be675116dee6452634 /src/emu/emualloc.h
parent07db38f0f2bc7891c53221468f006583bc61d034 (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.h248
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__ */