Since all the platform layers were using the same cut-and-paste of the
malloc/realloc/free allocator, I moved it into physfs.c as a default, which
is used if the platform layer doesn't offer a platform-specific default
allocator, which none do at this point, but will soon.
--- a/physfs.c Tue Mar 20 17:57:45 2007 +0000
+++ b/physfs.c Tue Mar 20 18:33:56 2007 +0000
@@ -2029,14 +2029,40 @@
} /* PHYSFS_setAllocator */
+static void *mallocAllocatorMalloc(PHYSFS_uint64 s)
+{
+ BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
+ #undef malloc
+ return(malloc((size_t) s));
+} /* mallocAllocatorMalloc */
+
+
+static void *mallocAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
+{
+ BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
+ #undef realloc
+ return(realloc(ptr, (size_t) s));
+} /* mallocAllocatorRealloc */
+
+
+static void mallocAllocatorFree(void *ptr)
+{
+ #undef free
+ free(ptr);
+} /* mallocAllocatorFree */
+
+
static void setDefaultAllocator(void)
{
assert(!externalAllocator);
- allocator.Init = __PHYSFS_platformAllocatorInit;
- allocator.Deinit = __PHYSFS_platformAllocatorDeinit;
- allocator.Malloc = __PHYSFS_platformAllocatorMalloc;
- allocator.Realloc = __PHYSFS_platformAllocatorRealloc;
- allocator.Free = __PHYSFS_platformAllocatorFree;
+ if (!__PHYSFS_platformSetDefaultAllocator(&allocator))
+ {
+ allocator.Init = NULL;
+ allocator.Deinit = NULL;
+ allocator.Malloc = mallocAllocatorMalloc;
+ allocator.Realloc = mallocAllocatorRealloc;
+ allocator.Free = mallocAllocatorFree;
+ } /* if */
} /* setDefaultAllocator */
/* end of physfs.c ... */
--- a/physfs_internal.h Tue Mar 20 17:57:45 2007 +0000
+++ b/physfs_internal.h Tue Mar 20 18:33:56 2007 +0000
@@ -1719,39 +1719,18 @@
void __PHYSFS_platformReleaseMutex(void *mutex);
/*
- * Called during PHYSFS_init() to initialize the allocator, if the user
+ * Called at the start of PHYSFS_init() to prepare the allocator, if the user
* hasn't selected their own allocator via PHYSFS_setAllocator().
- * Return zero on initialization error (which will make PHYSFS_init() fail,
- * too), non-zero on success.
- */
-int __PHYSFS_platformAllocatorInit(void);
-
-/*
- * Called during PHYSFS_deinit() to deinitialize the allocator, if the user
- * hasn't selected their own allocator via PHYSFS_setAllocator().
+ * If the platform has a custom allocator, it should fill in the fields of
+ * (a) with the proper function pointers and return non-zero.
+ * If the platform just wants to use malloc()/free()/etc, return zero
+ * immediately and the higher level will handle it. The Init and Deinit
+ * fields of (a) are optional...set them to NULL if you don't need them.
+ * Everything else must be implemented. All rules follow those for
+ * PHYSFS_setAllocator(). If Init isn't NULL, it will be called shortly
+ * after this function returns non-zero.
*/
-void __PHYSFS_platformAllocatorDeinit(void);
-
-/*
- * Implement malloc. It's safe to just pass through from the C runtime.
- * This is used for allocation if the user hasn't selected their own
- * allocator via PHYSFS_setAllocator().
- */
-void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s);
-
-/*
- * Implement realloc. It's safe to just pass through from the C runtime.
- * This is used for allocation if the user hasn't selected their own
- * allocator via PHYSFS_setAllocator().
- */
-void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s);
-
-/*
- * Implement free. It's safe to just pass through from the C runtime.
- * This is used for deallocation if the user hasn't selected their own
- * allocator via PHYSFS_setAllocator().
- */
-void __PHYSFS_platformAllocatorFree(void *ptr);
+int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a);
#ifdef __cplusplus
}
--- a/platform/beos.cpp Tue Mar 20 17:57:45 2007 +0000
+++ b/platform/beos.cpp Tue Mar 20 18:33:56 2007 +0000
@@ -240,6 +240,12 @@
release_sem(*((sem_id *) mutex));
} /* __PHYSFS_platformReleaseMutex */
+
+int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
+{
+ return(0); /* just use malloc() and friends. */
+} /* __PHYSFS_platformSetDefaultAllocator */
+
#endif /* PHYSFS_PLATFORM_BEOS */
/* end of beos.cpp ... */
--- a/platform/os2.c Tue Mar 20 17:57:45 2007 +0000
+++ b/platform/os2.c Tue Mar 20 18:33:56 2007 +0000
@@ -690,39 +690,11 @@
} /* __PHYSFS_platformReleaseMutex */
-int __PHYSFS_platformAllocatorInit(void)
-{
- return(1); /* always succeeds. */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void __PHYSFS_platformAllocatorDeinit(void)
-{
- /* no-op */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
+/* !!! FIXME: Don't use C runtime for allocators? */
+int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef malloc
- return(malloc((size_t) s));
-} /* __PHYSFS_platformMalloc */
-
-
-void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
-{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef realloc
- return(realloc(ptr, (size_t) s));
-} /* __PHYSFS_platformRealloc */
-
-
-void __PHYSFS_platformAllocatorFree(void *ptr)
-{
- #undef free
- free(ptr);
-} /* __PHYSFS_platformAllocatorFree */
+ return(0); /* just use malloc() and friends. */
+} /* __PHYSFS_platformSetDefaultAllocator */
#endif /* PHYSFS_PLATFORM_OS2 */
--- a/platform/pocketpc.c Tue Mar 20 17:57:45 2007 +0000
+++ b/platform/pocketpc.c Tue Mar 20 18:33:56 2007 +0000
@@ -576,39 +576,10 @@
/* !!! FIXME: Don't use C runtime for allocators? */
-int __PHYSFS_platformAllocatorInit(void)
-{
- return(1); /* always succeeds. */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void __PHYSFS_platformAllocatorDeinit(void)
-{
- /* no-op */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
+int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef malloc
- return(malloc((size_t) s));
-} /* __PHYSFS_platformMalloc */
-
-
-void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
-{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef realloc
- return(realloc(ptr, (size_t) s));
-} /* __PHYSFS_platformRealloc */
-
-
-void __PHYSFS_platformAllocatorFree(void *ptr)
-{
- #undef free
- free(ptr);
-} /* __PHYSFS_platformAllocatorFree */
+ return(0); /* just use malloc() and friends. */
+} /* __PHYSFS_platformSetDefaultAllocator */
#endif /* PHYSFS_PLATFORM_POCKETPC */
--- a/platform/posix.c Tue Mar 20 17:57:45 2007 +0000
+++ b/platform/posix.c Tue Mar 20 18:33:56 2007 +0000
@@ -429,41 +429,6 @@
return statbuf.st_mtime;
} /* __PHYSFS_platformGetLastModTime */
-
-int __PHYSFS_platformAllocatorInit(void)
-{
- return(1); /* always succeeds. */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void __PHYSFS_platformAllocatorDeinit(void)
-{
- /* no-op */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
-{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef malloc
- return(malloc((size_t) s));
-} /* __PHYSFS_platformMalloc */
-
-
-void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
-{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef realloc
- return(realloc(ptr, (size_t) s));
-} /* __PHYSFS_platformRealloc */
-
-
-void __PHYSFS_platformAllocatorFree(void *ptr)
-{
- #undef free
- free(ptr);
-} /* __PHYSFS_platformAllocatorFree */
-
#endif /* PHYSFS_PLATFORM_POSIX */
/* end of posix.c ... */
--- a/platform/unix.c Tue Mar 20 17:57:45 2007 +0000
+++ b/platform/unix.c Tue Mar 20 18:33:56 2007 +0000
@@ -471,6 +471,12 @@
} /* __PHYSFS_platformRealPath */
+int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
+{
+ return(0); /* just use malloc() and friends. */
+} /* __PHYSFS_platformSetDefaultAllocator */
+
+
#if (defined PHYSFS_NO_PTHREADS_SUPPORT)
PHYSFS_uint64 __PHYSFS_platformGetThreadID(void) { return(0x0001); }
--- a/platform/windows.c Tue Mar 20 17:57:45 2007 +0000
+++ b/platform/windows.c Tue Mar 20 18:33:56 2007 +0000
@@ -1051,39 +1051,10 @@
/* !!! FIXME: Don't use C runtime for allocators? */
-int __PHYSFS_platformAllocatorInit(void)
-{
- return(1); /* always succeeds. */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void __PHYSFS_platformAllocatorDeinit(void)
-{
- /* no-op */
-} /* __PHYSFS_platformAllocatorInit */
-
-
-void *__PHYSFS_platformAllocatorMalloc(PHYSFS_uint64 s)
+int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef malloc
- return(malloc((size_t) s));
-} /* __PHYSFS_platformMalloc */
-
-
-void *__PHYSFS_platformAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
-{
- BAIL_IF_MACRO(__PHYSFS_ui64FitsAddressSpace(s), ERR_OUT_OF_MEMORY, NULL);
- #undef realloc
- return(realloc(ptr, (size_t) s));
-} /* __PHYSFS_platformRealloc */
-
-
-void __PHYSFS_platformAllocatorFree(void *ptr)
-{
- #undef free
- free(ptr);
-} /* __PHYSFS_platformAllocatorFree */
+ return(0); /* just use malloc() and friends. */
+} /* __PHYSFS_platformSetDefaultAllocator */
#endif /* PHYSFS_PLATFORM_WINDOWS */