summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/sdl
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/sdl')
-rw-r--r--src/osd/sdl/draw13.c2
-rw-r--r--src/osd/sdl/sdldir.c8
-rw-r--r--src/osd/sdl/sdlfile.c8
-rw-r--r--src/osd/sdl/sdlmain.c3
-rw-r--r--src/osd/sdl/sdlos_macosx.c20
-rw-r--r--src/osd/sdl/sdlos_os2.c18
-rw-r--r--src/osd/sdl/sdlos_unix.c20
-rw-r--r--src/osd/sdl/sdlos_win32.c71
-rw-r--r--src/osd/sdl/sdlwork.c2
-rw-r--r--src/osd/sdl/strconv.c4
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);