diff options
-rw-r--r-- | Alc/ALc.c | 1 | ||||
-rw-r--r-- | Alc/alcRing.c | 1 | ||||
-rw-r--r-- | Alc/bformatdec.c | 1 | ||||
-rw-r--r-- | Alc/helpers.c | 50 | ||||
-rw-r--r-- | CMakeLists.txt | 3 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 6 | ||||
-rw-r--r-- | OpenAL32/alAuxEffectSlot.c | 2 | ||||
-rw-r--r-- | OpenAL32/alSource.c | 1 | ||||
-rw-r--r-- | OpenAL32/alThunk.c | 2 | ||||
-rw-r--r-- | common/almalloc.c | 62 | ||||
-rw-r--r-- | include/almalloc.h | 18 |
11 files changed, 91 insertions, 56 deletions
@@ -44,6 +44,7 @@ #include "compat.h" #include "threads.h" #include "alstring.h" +#include "almalloc.h" #include "backends/base.h" diff --git a/Alc/alcRing.c b/Alc/alcRing.c index e9a40a12..05db7bc3 100644 --- a/Alc/alcRing.c +++ b/Alc/alcRing.c @@ -25,6 +25,7 @@ #include "alMain.h" #include "threads.h" +#include "almalloc.h" #include "compat.h" diff --git a/Alc/bformatdec.c b/Alc/bformatdec.c index 6dd5ce9a..e4c6da49 100644 --- a/Alc/bformatdec.c +++ b/Alc/bformatdec.c @@ -6,6 +6,7 @@ #include "alu.h" #include "threads.h" +#include "almalloc.h" typedef struct BandSplitter { diff --git a/Alc/helpers.c b/Alc/helpers.c index f596c0d9..c8983c11 100644 --- a/Alc/helpers.c +++ b/Alc/helpers.c @@ -243,56 +243,6 @@ void FillCPUCaps(ALuint capfilter) } -void *al_malloc(size_t alignment, size_t size) -{ -#if defined(HAVE_ALIGNED_ALLOC) - size = (size+(alignment-1))&~(alignment-1); - return aligned_alloc(alignment, size); -#elif defined(HAVE_POSIX_MEMALIGN) - void *ret; - if(posix_memalign(&ret, alignment, size) == 0) - return ret; - return NULL; -#elif defined(HAVE__ALIGNED_MALLOC) - return _aligned_malloc(size, alignment); -#else - char *ret = malloc(size+alignment); - if(ret != NULL) - { - *(ret++) = 0x00; - while(((ptrdiff_t)ret&(alignment-1)) != 0) - *(ret++) = 0x55; - } - return ret; -#endif -} - -void *al_calloc(size_t alignment, size_t size) -{ - void *ret = al_malloc(alignment, size); - if(ret) memset(ret, 0, size); - return ret; -} - -void al_free(void *ptr) -{ -#if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN) - free(ptr); -#elif defined(HAVE__ALIGNED_MALLOC) - _aligned_free(ptr); -#else - if(ptr != NULL) - { - char *finder = ptr; - do { - --finder; - } while(*finder == 0x55); - free(finder); - } -#endif -} - - void SetMixerFPUMode(FPUCtl *ctl) { #ifdef HAVE_FENV_H diff --git a/CMakeLists.txt b/CMakeLists.txt index c3e17967..8c89a0d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -607,7 +607,8 @@ IF(NOT HAVE_STDINT_H) ENDIF() -SET(COMMON_OBJS common/atomic.c +SET(COMMON_OBJS common/almalloc.c + common/atomic.c common/rwlock.c common/threads.c common/uintmap.c diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index 4c737f02..17edd7fc 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -36,6 +36,7 @@ #include "uintmap.h" #include "vector.h" #include "alstring.h" +#include "almalloc.h" #include "hrtf.h" @@ -637,11 +638,6 @@ inline void UnlockContext(ALCcontext *context) { ALCdevice_Unlock(context->Device); } -void *al_malloc(size_t alignment, size_t size); -void *al_calloc(size_t alignment, size_t size); -void al_free(void *ptr); - - typedef struct { #ifdef HAVE_FENV_H DERIVE_FROM_TYPE(fenv_t); diff --git a/OpenAL32/alAuxEffectSlot.c b/OpenAL32/alAuxEffectSlot.c index c80bab22..0364c33c 100644 --- a/OpenAL32/alAuxEffectSlot.c +++ b/OpenAL32/alAuxEffectSlot.c @@ -31,6 +31,8 @@ #include "alError.h" #include "alSource.h" +#include "almalloc.h" + extern inline struct ALeffectslot *LookupEffectSlot(ALCcontext *context, ALuint id); extern inline struct ALeffectslot *RemoveEffectSlot(ALCcontext *context, ALuint id); diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index d7b68185..03eae080 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -37,6 +37,7 @@ #include "backends/base.h" #include "threads.h" +#include "almalloc.h" extern inline struct ALsource *LookupSource(ALCcontext *context, ALuint id); diff --git a/OpenAL32/alThunk.c b/OpenAL32/alThunk.c index 0cebad42..29da9bbd 100644 --- a/OpenAL32/alThunk.c +++ b/OpenAL32/alThunk.c @@ -25,6 +25,8 @@ #include "alMain.h" #include "alThunk.h" +#include "almalloc.h" + static ATOMIC(ALenum) *ThunkArray; static ALuint ThunkArraySize; diff --git a/common/almalloc.c b/common/almalloc.c new file mode 100644 index 00000000..8c1c5794 --- /dev/null +++ b/common/almalloc.c @@ -0,0 +1,62 @@ + +#include "config.h" + +#include "almalloc.h" + +#include <stdlib.h> +#include <string.h> +#ifdef HAVE_MALLOC_H +#include <malloc.h> +#endif +#ifdef HAVE_WINDOWS_H +#include <windows.h> +#endif + +void *al_malloc(size_t alignment, size_t size) +{ +#if defined(HAVE_ALIGNED_ALLOC) + size = (size+(alignment-1))&~(alignment-1); + return aligned_alloc(alignment, size); +#elif defined(HAVE_POSIX_MEMALIGN) + void *ret; + if(posix_memalign(&ret, alignment, size) == 0) + return ret; + return NULL; +#elif defined(HAVE__ALIGNED_MALLOC) + return _aligned_malloc(size, alignment); +#else + char *ret = malloc(size+alignment); + if(ret != NULL) + { + *(ret++) = 0x00; + while(((ptrdiff_t)ret&(alignment-1)) != 0) + *(ret++) = 0x55; + } + return ret; +#endif +} + +void *al_calloc(size_t alignment, size_t size) +{ + void *ret = al_malloc(alignment, size); + if(ret) memset(ret, 0, size); + return ret; +} + +void al_free(void *ptr) +{ +#if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN) + free(ptr); +#elif defined(HAVE__ALIGNED_MALLOC) + _aligned_free(ptr); +#else + if(ptr != NULL) + { + char *finder = ptr; + do { + --finder; + } while(*finder == 0x55); + free(finder); + } +#endif +} diff --git a/include/almalloc.h b/include/almalloc.h new file mode 100644 index 00000000..355db795 --- /dev/null +++ b/include/almalloc.h @@ -0,0 +1,18 @@ +#ifndef AL_MALLOC_H +#define AL_MALLOC_H + +#include <stddef.h> + +#ifdef __cplusplus +extern "C" { +#endif + +void *al_malloc(size_t alignment, size_t size); +void *al_calloc(size_t alignment, size_t size); +void al_free(void *ptr); + +#ifdef __cplusplus +} +#endif + +#endif /* AL_MALLOC_H */ |