diff options
author | 2016-01-02 11:05:16 -0500 | |
---|---|---|
committer | 2016-01-02 11:39:37 -0500 | |
commit | a9b60b05ac596b9db6107daefa8ea35b14f23640 (patch) | |
tree | 8998ee46f3d0f9d5170c3de2f0dd88c407bb9aa5 | |
parent | 3da02a7f640138022f9b93cf3655acfd4fc62c5e (diff) |
Add realloc implementation as required by the C standard (nw)
-rw-r--r-- | src/lib/util/corealloc.cpp | 38 | ||||
-rw-r--r-- | src/lib/util/corealloc.h | 6 |
2 files changed, 43 insertions, 1 deletions
diff --git a/src/lib/util/corealloc.cpp b/src/lib/util/corealloc.cpp index 38f21846f96..eaf0ff40420 100644 --- a/src/lib/util/corealloc.cpp +++ b/src/lib/util/corealloc.cpp @@ -222,6 +222,44 @@ void free_file_line(void *memory, const char *file, int line, bool array) osd_free(memory); } +void *realloc_internal(void *memory, size_t size, const char *file, int line, bool array) +{ + fprintf(stderr, "realloc_internal called for %p in %s(%d)!\n", memory, file, line); + if(size == 0) { + return nullptr; + } + if(memory == nullptr) { + return malloc_file_line(size, file, line, array, false, false); + } + // find the memory entry + memory_entry *entry = memory_entry::find(memory); + + // warn about untracked reallocs + if (entry == nullptr) + { + fprintf(stderr, "Error: attempt to realloc untracked memory %p in %s(%d)!\n", memory, file, line); + osd_break_into_debugger("Error: attempt to realloc untracked memory"); + return memory; + } + + // this is used internally and should always be an array + if(!array || !entry->m_array) + { + fprintf(stderr, "Error: attempt to realloc non-array memory %p in %s(%d). realloc_internal should never be called directly!\n", memory, file, line); + osd_break_into_debugger("Error: attempt to realloc non-array memory"); + } + + size_t o_size = entry->m_size; + void *new_buf = malloc_file_line(size, file, line, array, false, false); + if(new_buf == nullptr) { + fprintf(stderr, "Error: realloc: unable to allocate new buffer %p in %s(%d)!\n", memory, file, line); + return nullptr; + } + memcpy(new_buf, memory, (o_size < size) ? o_size : size); + free_file_line(memory, file, line, array); + return new_buf; +} + //------------------------------------------------- // track_memory - enables or disables the memory diff --git a/src/lib/util/corealloc.h b/src/lib/util/corealloc.h index 5cd481824ed..c4d6793562d 100644 --- a/src/lib/util/corealloc.h +++ b/src/lib/util/corealloc.h @@ -43,6 +43,10 @@ void *malloc_file_line(size_t size, const char *file, int line, bool array, bool 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(); @@ -91,7 +95,7 @@ extern const zeromem_t zeromem; #undef free #define malloc(x) malloc_file_line(x, __FILE__, __LINE__, true, false, false) -#define realloc(x,y) __error_realloc_is_dangerous__ +#define realloc(x,y) realloc_internal(x, y, __FILE__, __LINE__, true, false) #define free(x) free_file_line(x, __FILE__, __LINE__, true) #if !defined(_MSC_VER) || _MSC_VER < 1900 // < VS2015 |