diff options
Diffstat (limited to 'src/osd/sdl')
-rw-r--r-- | src/osd/sdl/draw13.c | 2 | ||||
-rw-r--r-- | src/osd/sdl/sdldir.c | 8 | ||||
-rw-r--r-- | src/osd/sdl/sdlfile.c | 8 | ||||
-rw-r--r-- | src/osd/sdl/sdlmain.c | 3 | ||||
-rw-r--r-- | src/osd/sdl/sdlos_macosx.c | 20 | ||||
-rw-r--r-- | src/osd/sdl/sdlos_os2.c | 18 | ||||
-rw-r--r-- | src/osd/sdl/sdlos_unix.c | 20 | ||||
-rw-r--r-- | src/osd/sdl/sdlos_win32.c | 71 | ||||
-rw-r--r-- | src/osd/sdl/sdlwork.c | 2 | ||||
-rw-r--r-- | src/osd/sdl/strconv.c | 4 |
10 files changed, 106 insertions, 50 deletions
diff --git a/src/osd/sdl/draw13.c b/src/osd/sdl/draw13.c index aa20f9ca2a6..b30d3fc2fc4 100644 --- a/src/osd/sdl/draw13.c +++ b/src/osd/sdl/draw13.c @@ -964,7 +964,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf if ( (texture->copyinfo->func != NULL) && (texture->sdl_access == SDL_TEXTUREACCESS_STATIC)) { - texture->pixels = osd_malloc(texture->setup.rotwidth * texture->setup.rotheight * texture->copyinfo->dst_bpp); + texture->pixels = osd_malloc_array(texture->setup.rotwidth * texture->setup.rotheight * texture->copyinfo->dst_bpp); texture->pixels_own=TRUE; } /* add us to the texture list */ diff --git a/src/osd/sdl/sdldir.c b/src/osd/sdl/sdldir.c index d70f81eb07c..b27711f0338 100644 --- a/src/osd/sdl/sdldir.c +++ b/src/osd/sdl/sdldir.c @@ -67,7 +67,7 @@ struct _osd_directory static char *build_full_path(const char *path, const char *file) { - char *ret = (char *) osd_malloc(strlen(path)+strlen(file)+2); + char *ret = (char *) osd_malloc_array(strlen(path)+strlen(file)+2); char *p = ret; strcpy(p, path); @@ -126,13 +126,13 @@ osd_directory *osd_opendir(const char *dirname) dir->fd = NULL; } - tmpstr = (char *) osd_malloc(strlen(dirname)+1); + tmpstr = (char *) osd_malloc_array(strlen(dirname)+1); strcpy(tmpstr, dirname); if (tmpstr[0] == '$') { char *envval; - envstr = (char *) osd_malloc(strlen(tmpstr)+1); + envstr = (char *) osd_malloc_array(strlen(tmpstr)+1); strcpy(envstr, tmpstr); @@ -149,7 +149,7 @@ osd_directory *osd_opendir(const char *dirname) { j = strlen(envval) + strlen(tmpstr) + 1; osd_free(tmpstr); - tmpstr = (char *) osd_malloc(j); + tmpstr = (char *) osd_malloc_array(j); // start with the value of $HOME strcpy(tmpstr, envval); diff --git a/src/osd/sdl/sdlfile.c b/src/osd/sdl/sdlfile.c index 3326c474746..d7fc70fce4b 100644 --- a/src/osd/sdl/sdlfile.c +++ b/src/osd/sdl/sdlfile.c @@ -115,7 +115,7 @@ file_error osd_open(const char *path, UINT32 openflags, osd_file **file, UINT64 tmpstr = NULL; // allocate a file object, plus space for the converted filename - *file = (osd_file *) osd_malloc(sizeof(**file) + sizeof(char) * strlen(path)); + *file = (osd_file *) osd_malloc_array(sizeof(**file) + sizeof(char) * strlen(path)); if (*file == NULL) { filerr = FILERR_OUT_OF_MEMORY; @@ -160,14 +160,14 @@ file_error osd_open(const char *path, UINT32 openflags, osd_file **file, UINT64 goto error; } - tmpstr = (char *) osd_malloc(strlen((*file)->filename)+1); + tmpstr = (char *) osd_malloc_array(strlen((*file)->filename)+1); strcpy(tmpstr, (*file)->filename); // does path start with an environment variable? if (tmpstr[0] == '$') { char *envval; - envstr = (char *) osd_malloc(strlen(tmpstr)+1); + envstr = (char *) osd_malloc_array(strlen(tmpstr)+1); strcpy(envstr, tmpstr); @@ -184,7 +184,7 @@ file_error osd_open(const char *path, UINT32 openflags, osd_file **file, UINT64 { j = strlen(envval) + strlen(tmpstr) + 1; osd_free(tmpstr); - tmpstr = (char *) osd_malloc(j); + tmpstr = (char *) osd_malloc_array(j); // start with the value of $HOME strcpy(tmpstr, envval); diff --git a/src/osd/sdl/sdlmain.c b/src/osd/sdl/sdlmain.c index 747b881d060..e54de5bcf6b 100644 --- a/src/osd/sdl/sdlmain.c +++ b/src/osd/sdl/sdlmain.c @@ -348,7 +348,8 @@ int main(int argc, char *argv[]) { sdl_osd_interface osd; sdl_options options; - res = cli_execute(options, osd, argc, argv); + cli_frontend frontend(options, osd); + res = frontend.execute(argc, argv); } #ifdef MALLOC_DEBUG diff --git a/src/osd/sdl/sdlos_macosx.c b/src/osd/sdl/sdlos_macosx.c index baa8ac2d167..c37eb8ad726 100644 --- a/src/osd/sdl/sdlos_macosx.c +++ b/src/osd/sdl/sdlos_macosx.c @@ -177,6 +177,20 @@ void *osd_malloc(size_t size) //============================================================ +// osd_malloc_array +//============================================================ + +void *osd_malloc_array(size_t size) +{ +#ifndef MALLOC_DEBUG + return malloc(size); +#else +#error "MALLOC_DEBUG not yet supported" +#endif +} + + +//============================================================ // osd_free //============================================================ @@ -277,7 +291,7 @@ char *osd_get_clipboard_text(void) length = CFDataGetLength (data_ref); range = CFRangeMake (0,length); - result = (char *)osd_malloc (length+1); + result = (char *)osd_malloc_array (length+1); if (result != NULL) { CFDataGetBytes (data_ref, range, (unsigned char *)result); @@ -330,7 +344,7 @@ osd_directory_entry *osd_stat(const char *path) // create an osd_directory_entry; be sure to make sure that the caller can // free all resources by just freeing the resulting osd_directory_entry - result = (osd_directory_entry *) osd_malloc(sizeof(*result) + strlen(path) + 1); + result = (osd_directory_entry *) osd_malloc_array(sizeof(*result) + strlen(path) + 1); strcpy(((char *) result) + sizeof(*result), path); result->name = ((char *) result) + sizeof(*result); result->type = S_ISDIR(st.st_mode) ? ENTTYPE_DIR : ENTTYPE_FILE; @@ -367,7 +381,7 @@ file_error osd_get_full_path(char **dst, const char *path) } else { - *dst = (char *)osd_malloc(strlen(path_buffer)+strlen(path)+3); + *dst = (char *)osd_malloc_array(strlen(path_buffer)+strlen(path)+3); // if it's already a full path, just pass it through if (path[0] == '/') diff --git a/src/osd/sdl/sdlos_os2.c b/src/osd/sdl/sdlos_os2.c index 97a0f8419ac..87512222db4 100644 --- a/src/osd/sdl/sdlos_os2.c +++ b/src/osd/sdl/sdlos_os2.c @@ -199,6 +199,20 @@ void *osd_malloc(size_t size) //============================================================ +// osd_malloc_array +//============================================================ + +void *osd_malloc_array(size_t size) +{ +#ifndef MALLOC_DEBUG + return malloc(size); +#else +#error "MALLOC_DEBUG not yet supported" +#endif +} + + +//============================================================ // osd_free //============================================================ @@ -258,7 +272,7 @@ osd_directory_entry *osd_stat(const char *path) // create an osd_directory_entry; be sure to make sure that the caller can // free all resources by just freeing the resulting osd_directory_entry - result = (osd_directory_entry *) osd_malloc(sizeof(*result) + strlen(path) + result = (osd_directory_entry *) osd_malloc_array(sizeof(*result) + strlen(path) 1); strcpy(((char *) result) + sizeof(*result), path); result->name = ((char *) result) + sizeof(*result); @@ -300,7 +314,7 @@ const char *osd_get_volume_name(int idx) file_error osd_get_full_path(char **dst, const char *path) { - *dst = (char *)osd_malloc(CCHMAXPATH + 1); + *dst = (char *)osd_malloc_array(CCHMAXPATH + 1); if (*dst == NULL) return FILERR_OUT_OF_MEMORY; diff --git a/src/osd/sdl/sdlos_unix.c b/src/osd/sdl/sdlos_unix.c index 6d2d92032e5..c1ba9baeea5 100644 --- a/src/osd/sdl/sdlos_unix.c +++ b/src/osd/sdl/sdlos_unix.c @@ -93,6 +93,20 @@ void *osd_malloc(size_t size) //============================================================ +// osd_malloc_array +//============================================================ + +void *osd_malloc_array(size_t size) +{ +#ifndef MALLOC_DEBUG + return malloc(size); +#else +#error "MALLOC_DEBUG not yet supported" +#endif +} + + +//============================================================ // osd_free //============================================================ @@ -207,7 +221,7 @@ char *osd_get_clipboard_text(void) /* return a copy & free original */ if (prop != NULL) { - result = (char *) osd_malloc(strlen((char *)prop)+1); + result = (char *) osd_malloc_array(strlen((char *)prop)+1); strcpy(result, (char *)prop); } else @@ -256,7 +270,7 @@ osd_directory_entry *osd_stat(const char *path) // create an osd_directory_entry; be sure to make sure that the caller can // free all resources by just freeing the resulting osd_directory_entry - result = (osd_directory_entry *) osd_malloc(sizeof(*result) + strlen(path) + 1); + result = (osd_directory_entry *) osd_malloc_array(sizeof(*result) + strlen(path) + 1); strcpy(((char *) result) + sizeof(*result), path); result->name = ((char *) result) + sizeof(*result); result->type = S_ISDIR(st.st_mode) ? ENTTYPE_DIR : ENTTYPE_FILE; @@ -293,7 +307,7 @@ file_error osd_get_full_path(char **dst, const char *path) } else { - *dst = (char *)osd_malloc(strlen(path_buffer)+strlen(path)+3); + *dst = (char *)osd_malloc_array(strlen(path_buffer)+strlen(path)+3); // if it's already a full path, just pass it through if (path[0] == '/') diff --git a/src/osd/sdl/sdlos_win32.c b/src/osd/sdl/sdlos_win32.c index 31be832703b..2ffee467d11 100644 --- a/src/osd/sdl/sdlos_win32.c +++ b/src/osd/sdl/sdlos_win32.c @@ -180,36 +180,49 @@ void *osd_malloc(size_t size) #ifndef MALLOC_DEBUG return HeapAlloc(GetProcessHeap(), 0, size); #else - // add in space for the base pointer + // add in space for the size size += sizeof(size_t); - // small items just come from the heap - void *result; - if (size < GUARD_PAGE_THRESH) - result = HeapAlloc(GetProcessHeap(), 0, size); + // basic objects just come from the heap + void *result = HeapAlloc(GetProcessHeap(), 0, size); - // large items get guard pages - else - { - // round the size up to a page boundary - size_t rounded_size = ((size + sizeof(void *) + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; + // store the size and return and pointer to the data afterward + *reinterpret_cast<size_t *>(result) = size; + return reinterpret_cast<UINT8 *>(result) + sizeof(size_t); +#endif +} - // reserve that much memory, plus two guard pages - void *page_base = VirtualAlloc(NULL, rounded_size + 2 * PAGE_SIZE, MEM_RESERVE, PAGE_NOACCESS); - if (page_base == NULL) - return NULL; - // now allow access to everything but the first and last pages - page_base = VirtualAlloc(reinterpret_cast<UINT8 *>(page_base) + PAGE_SIZE, rounded_size, MEM_COMMIT, PAGE_READWRITE); - if (page_base == NULL) - return NULL; +//============================================================ +// osd_malloc_array +//============================================================ - // work backwards from the page base to get to the block base - result = GUARD_ALIGN_START ? page_base : (reinterpret_cast<UINT8 *>(page_base) + rounded_size - size); - } +void *osd_malloc_array(size_t size) +{ +#ifndef MALLOC_DEBUG + return HeapAlloc(GetProcessHeap(), 0, size); +#else + // add in space for the size + size += sizeof(size_t); - // store the page_base at the start - *reinterpret_cast<size_t *>(result) = size; + // round the size up to a page boundary + size_t rounded_size = ((size + sizeof(void *) + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE; + + // reserve that much memory, plus two guard pages + void *page_base = VirtualAlloc(NULL, rounded_size + 2 * PAGE_SIZE, MEM_RESERVE, PAGE_NOACCESS); + if (page_base == NULL) + return NULL; + + // now allow access to everything but the first and last pages + page_base = VirtualAlloc(reinterpret_cast<UINT8 *>(page_base) + PAGE_SIZE, rounded_size, MEM_COMMIT, PAGE_READWRITE); + if (page_base == NULL) + return NULL; + + // work backwards from the page base to get to the block base + void *result = GUARD_ALIGN_START ? page_base : (reinterpret_cast<UINT8 *>(page_base) + rounded_size - size); + + // store the size at the start with a flag indicating it has a guard page + *reinterpret_cast<size_t *>(result) = size | 0x80000000; return reinterpret_cast<UINT8 *>(result) + sizeof(size_t); #endif } @@ -226,14 +239,14 @@ void osd_free(void *ptr) #else size_t size = reinterpret_cast<size_t *>(ptr)[-1]; - // small items just get freed - if (size < GUARD_PAGE_THRESH) + // if no guard page, just free the pointer + if ((size & 0x80000000) == 0) HeapFree(GetProcessHeap(), 0, reinterpret_cast<UINT8 *>(ptr) - sizeof(size_t)); // large items need more care else { - FPTR page_base = (reinterpret_cast<FPTR>(ptr) - sizeof(size_t)) & ~(PAGE_SIZE - 1); + ULONG_PTR page_base = (reinterpret_cast<ULONG_PTR>(ptr) - sizeof(size_t)) & ~(PAGE_SIZE - 1); VirtualFree(reinterpret_cast<void *>(page_base - PAGE_SIZE), 0, MEM_RELEASE); } #endif @@ -262,7 +275,7 @@ int osd_setenv(const char *name, const char *value, int overwrite) if (osd_getenv(name) != NULL) return 0; } - buf = (char *) osd_malloc(strlen(name)+strlen(value)+2); + buf = (char *) osd_malloc_array(strlen(name)+strlen(value)+2); sprintf(buf, "%s=%s", name, value); result = putenv(buf); @@ -371,7 +384,7 @@ CHAR *astring_from_utf8(const char *utf8string) // convert UTF-16 to "ANSI code page" string char_count = WideCharToMultiByte(CP_ACP, 0, wstring, -1, NULL, 0, NULL, NULL); - result = (CHAR *)osd_malloc(char_count * sizeof(*result)); + result = (CHAR *)osd_malloc_array(char_count * sizeof(*result)); if (result != NULL) WideCharToMultiByte(CP_ACP, 0, wstring, -1, result, char_count, NULL, NULL); @@ -389,7 +402,7 @@ WCHAR *wstring_from_utf8(const char *utf8string) // convert MAME string (UTF-8) to UTF-16 char_count = MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, NULL, 0); - result = (WCHAR *)osd_malloc(char_count * sizeof(*result)); + result = (WCHAR *)osd_malloc_array(char_count * sizeof(*result)); if (result != NULL) MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, result, char_count); diff --git a/src/osd/sdl/sdlwork.c b/src/osd/sdl/sdlwork.c index 4edfcad6463..8959855cc51 100644 --- a/src/osd/sdl/sdlwork.c +++ b/src/osd/sdl/sdlwork.c @@ -183,7 +183,7 @@ osd_work_queue *osd_work_queue_alloc(int flags) queue->threads = MIN(queue->threads, WORK_MAX_THREADS); // allocate memory for thread array (+1 to count the calling thread) - queue->thread = (work_thread_info *)osd_malloc((queue->threads + 1) * sizeof(queue->thread[0])); + queue->thread = (work_thread_info *)osd_malloc_array((queue->threads + 1) * sizeof(queue->thread[0])); if (queue->thread == NULL) goto error; memset(queue->thread, 0, (queue->threads + 1) * sizeof(queue->thread[0])); diff --git a/src/osd/sdl/strconv.c b/src/osd/sdl/strconv.c index 1356b236600..771a302fa92 100644 --- a/src/osd/sdl/strconv.c +++ b/src/osd/sdl/strconv.c @@ -38,7 +38,7 @@ char *utf8_from_astring(const CHAR *astring) // convert UTF-16 to MAME string (UTF-8) char_count = WideCharToMultiByte(CP_UTF8, 0, wstring, -1, NULL, 0, NULL, NULL); - result = (CHAR *)osd_malloc(char_count * sizeof(*result)); + result = (CHAR *)osd_malloc_array(char_count * sizeof(*result)); if (result != NULL) WideCharToMultiByte(CP_UTF8, 0, wstring, -1, result, char_count, NULL, NULL); @@ -56,7 +56,7 @@ char *utf8_from_wstring(const WCHAR *wstring) // convert UTF-16 to MAME string (UTF-8) char_count = WideCharToMultiByte(CP_UTF8, 0, wstring, -1, NULL, 0, NULL, NULL); - result = (char *)osd_malloc(char_count * sizeof(*result)); + result = (char *)osd_malloc_array(char_count * sizeof(*result)); if (result != NULL) WideCharToMultiByte(CP_UTF8, 0, wstring, -1, result, char_count, NULL, NULL); |