Since all the platform layers were using the same cut-and-paste of the
authorRyan C. Gordon <icculus@icculus.org>
Tue, 20 Mar 2007 18:33:56 +0000
changeset 845 3f150ffcf50c
parent 844 68272bd212a5
child 846 df684fce470e
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.
physfs.c
physfs_internal.h
platform/beos.cpp
platform/os2.c
platform/pocketpc.c
platform/posix.c
platform/unix.c
platform/windows.c
--- 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 */