X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Fmem.c;h=960074c70f48dae3b26de8672b096254cd8dca07;hb=e748e34dd6427271b779978a61156e47bfab3c8e;hp=418e85f6bfcbad428d1092b116e9c5b6ffbdf321;hpb=b78e7197a81e193827cf2408fe25bc1f14843a72;p=ffmpeg diff --git a/libavutil/mem.c b/libavutil/mem.c index 418e85f6bfc..960074c70f4 100644 --- a/libavutil/mem.c +++ b/libavutil/mem.c @@ -26,7 +26,7 @@ #include "common.h" -/* here we can use OS dependant allocation functions */ +/* here we can use OS dependent allocation functions */ #undef malloc #undef free #undef realloc @@ -39,15 +39,10 @@ memory allocator. You do not need to suppress this file because the linker will do it automatically */ -/** - * Memory allocation of size byte with alignment suitable for all - * memory accesses (including vectors if available on the - * CPU). av_malloc(0) must return a non NULL pointer. - */ void *av_malloc(unsigned int size) { void *ptr; -#ifdef MEMALIGN_HACK +#ifdef CONFIG_MEMALIGN_HACK long diff; #endif @@ -55,12 +50,12 @@ void *av_malloc(unsigned int size) if(size > (INT_MAX-16) ) return NULL; -#ifdef MEMALIGN_HACK +#ifdef CONFIG_MEMALIGN_HACK ptr = malloc(size+16); if(!ptr) return ptr; diff= ((-(long)ptr - 1)&15) + 1; - ptr += diff; + ptr = (char*)ptr + diff; ((char*)ptr)[-1]= diff; #elif defined (HAVE_MEMALIGN) ptr = memalign(16,size); @@ -74,10 +69,10 @@ void *av_malloc(unsigned int size) But I don't want to code such logic here! */ /* Why 16? - because some cpus need alignment, for example SSE2 on P4, & most RISC cpus + Because some CPUs need alignment, for example SSE2 on P4, & most RISC CPUs it will just trigger an exception and the unaligned load will be done in the exception handler or it will just segfault (SSE2 on P4) - Why not larger? because i didnt see a difference in benchmarks ... + Why not larger? Because I did not see a difference in benchmarks ... */ /* benchmarks with p3 memalign(64)+1 3071,3051,3032 @@ -96,14 +91,9 @@ void *av_malloc(unsigned int size) return ptr; } -/** - * av_realloc semantics (same as glibc): if ptr is NULL and size > 0, - * identical to malloc(size). If size is zero, it is identical to - * free(ptr) and NULL is returned. - */ void *av_realloc(void *ptr, unsigned int size) { -#ifdef MEMALIGN_HACK +#ifdef CONFIG_MEMALIGN_HACK int diff; #endif @@ -111,36 +101,27 @@ void *av_realloc(void *ptr, unsigned int size) if(size > (INT_MAX-16) ) return NULL; -#ifdef MEMALIGN_HACK +#ifdef CONFIG_MEMALIGN_HACK //FIXME this isn't aligned correctly, though it probably isn't needed if(!ptr) return av_malloc(size); diff= ((char*)ptr)[-1]; - return realloc(ptr - diff, size + diff) + diff; + return (char*)realloc((char*)ptr - diff, size + diff) + diff; #else return realloc(ptr, size); #endif } -/** - * Free memory which has been allocated with av_malloc(z)() or av_realloc(). - * NOTE: ptr = NULL is explicetly allowed - * Note2: it is recommended that you use av_freep() instead - */ void av_free(void *ptr) { /* XXX: this test should not be needed on most libcs */ if (ptr) -#ifdef MEMALIGN_HACK - free(ptr - ((char*)ptr)[-1]); +#ifdef CONFIG_MEMALIGN_HACK + free((char*)ptr - ((char*)ptr)[-1]); #else free(ptr); #endif } -/** - * Frees memory and sets the pointer to NULL. - * @param arg pointer to the pointer which should be freed - */ void av_freep(void *arg) { void **ptr= (void**)arg; @@ -150,9 +131,7 @@ void av_freep(void *arg) void *av_mallocz(unsigned int size) { - void *ptr; - - ptr = av_malloc(size); + void *ptr = av_malloc(size); if (ptr) memset(ptr, 0, size); return ptr; @@ -160,12 +139,13 @@ void *av_mallocz(unsigned int size) char *av_strdup(const char *s) { - char *ptr; - int len; - len = strlen(s) + 1; - ptr = av_malloc(len); - if (ptr) - memcpy(ptr, s, len); + char *ptr= NULL; + if(s){ + int len = strlen(s) + 1; + ptr = av_malloc(len); + if (ptr) + memcpy(ptr, s, len); + } return ptr; }