diff --git a/physfs.c b/physfs.c index a6eaf19..c12818b 100644 --- a/physfs.c +++ b/physfs.c @@ -2029,14 +2029,40 @@ int PHYSFS_setAllocator(const PHYSFS_Allocator *a) } /* 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 ... */ diff --git a/physfs_internal.h b/physfs_internal.h index 7a0933d..ce76458 100644 --- a/physfs_internal.h +++ b/physfs_internal.h @@ -1719,39 +1719,18 @@ int __PHYSFS_platformGrabMutex(void *mutex); 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. + * 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. */ -int __PHYSFS_platformAllocatorInit(void); - -/* - * Called during PHYSFS_deinit() to deinitialize the allocator, if the user - * hasn't selected their own allocator via PHYSFS_setAllocator(). - */ -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 } diff --git a/platform/beos.cpp b/platform/beos.cpp index fa23052..cd1cc8e 100644 --- a/platform/beos.cpp +++ b/platform/beos.cpp @@ -240,6 +240,12 @@ void __PHYSFS_platformReleaseMutex(void *mutex) 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 ... */ diff --git a/platform/os2.c b/platform/os2.c index bc3f352..0fe2308 100644 --- a/platform/os2.c +++ b/platform/os2.c @@ -690,39 +690,11 @@ void __PHYSFS_platformReleaseMutex(void *mutex) } /* __PHYSFS_platformReleaseMutex */ -int __PHYSFS_platformAllocatorInit(void) +/* !!! FIXME: Don't use C runtime for allocators? */ +int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a) { - 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 */ + return(0); /* just use malloc() and friends. */ +} /* __PHYSFS_platformSetDefaultAllocator */ #endif /* PHYSFS_PLATFORM_OS2 */ diff --git a/platform/pocketpc.c b/platform/pocketpc.c index 9ec01f9..7d116e3 100644 --- a/platform/pocketpc.c +++ b/platform/pocketpc.c @@ -576,39 +576,10 @@ PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname) /* !!! FIXME: Don't use C runtime for allocators? */ -int __PHYSFS_platformAllocatorInit(void) +int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a) { - 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 */ + return(0); /* just use malloc() and friends. */ +} /* __PHYSFS_platformSetDefaultAllocator */ #endif /* PHYSFS_PLATFORM_POCKETPC */ diff --git a/platform/posix.c b/platform/posix.c index 34a8130..d3d33f8 100644 --- a/platform/posix.c +++ b/platform/posix.c @@ -429,41 +429,6 @@ PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname) 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 ... */ diff --git a/platform/unix.c b/platform/unix.c index e8c8112..8ab0919 100644 --- a/platform/unix.c +++ b/platform/unix.c @@ -471,6 +471,12 @@ char *__PHYSFS_platformRealPath(const char *path) } /* __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); } diff --git a/platform/windows.c b/platform/windows.c index c0d7a67..b43e129 100644 --- a/platform/windows.c +++ b/platform/windows.c @@ -1051,39 +1051,10 @@ PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname) /* !!! FIXME: Don't use C runtime for allocators? */ -int __PHYSFS_platformAllocatorInit(void) +int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a) { - 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 */ + return(0); /* just use malloc() and friends. */ +} /* __PHYSFS_platformSetDefaultAllocator */ #endif /* PHYSFS_PLATFORM_WINDOWS */