00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #define _XOPEN_SOURCE 600
00028
00029 #include "config.h"
00030
00031 #include <limits.h>
00032 #include <stdlib.h>
00033 #include <string.h>
00034 #if HAVE_MALLOC_H
00035 #include <malloc.h>
00036 #endif
00037
00038 #include "avutil.h"
00039 #include "mem.h"
00040
00041
00042 #undef free
00043 #undef malloc
00044 #undef realloc
00045
00046 #ifdef MALLOC_PREFIX
00047
00048 #define malloc AV_JOIN(MALLOC_PREFIX, malloc)
00049 #define memalign AV_JOIN(MALLOC_PREFIX, memalign)
00050 #define posix_memalign AV_JOIN(MALLOC_PREFIX, posix_memalign)
00051 #define realloc AV_JOIN(MALLOC_PREFIX, realloc)
00052 #define free AV_JOIN(MALLOC_PREFIX, free)
00053
00054 void *malloc(size_t size);
00055 void *memalign(size_t align, size_t size);
00056 int posix_memalign(void **ptr, size_t align, size_t size);
00057 void *realloc(void *ptr, size_t size);
00058 void free(void *ptr);
00059
00060 #endif
00061
00062 #define ALIGN (HAVE_AVX ? 32 : 16)
00063
00064
00065
00066
00067
00068
00069 static size_t max_alloc_size= INT_MAX;
00070
00071 void av_max_alloc(size_t max){
00072 max_alloc_size = max;
00073 }
00074
00075 void *av_malloc(size_t size)
00076 {
00077 void *ptr = NULL;
00078 #if CONFIG_MEMALIGN_HACK
00079 long diff;
00080 #endif
00081
00082
00083 if (size > (max_alloc_size-32))
00084 return NULL;
00085
00086 #if CONFIG_MEMALIGN_HACK
00087 ptr = malloc(size+ALIGN);
00088 if(!ptr)
00089 return ptr;
00090 diff= ((-(long)ptr - 1)&(ALIGN-1)) + 1;
00091 ptr = (char*)ptr + diff;
00092 ((char*)ptr)[-1]= diff;
00093 #elif HAVE_POSIX_MEMALIGN
00094 if (size)
00095 if (posix_memalign(&ptr,ALIGN,size))
00096 ptr = NULL;
00097 #elif HAVE_ALIGNED_MALLOC
00098 ptr = _aligned_malloc(size, ALIGN);
00099 #elif HAVE_MEMALIGN
00100 ptr = memalign(ALIGN,size);
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 #else
00126 ptr = malloc(size);
00127 #endif
00128 if(!ptr && !size) {
00129 size = 1;
00130 ptr= av_malloc(1);
00131 }
00132 #if CONFIG_MEMORY_POISONING
00133 if (ptr)
00134 memset(ptr, 0x2a, size);
00135 #endif
00136 return ptr;
00137 }
00138
00139 void *av_realloc(void *ptr, size_t size)
00140 {
00141 #if CONFIG_MEMALIGN_HACK
00142 int diff;
00143 #endif
00144
00145
00146 if (size > (max_alloc_size-32))
00147 return NULL;
00148
00149 #if CONFIG_MEMALIGN_HACK
00150
00151 if(!ptr) return av_malloc(size);
00152 diff= ((char*)ptr)[-1];
00153 ptr= realloc((char*)ptr - diff, size + diff);
00154 if(ptr) ptr = (char*)ptr + diff;
00155 return ptr;
00156 #elif HAVE_ALIGNED_MALLOC
00157 return _aligned_realloc(ptr, size + !size, ALIGN);
00158 #else
00159 return realloc(ptr, size + !size);
00160 #endif
00161 }
00162
00163 void *av_realloc_f(void *ptr, size_t nelem, size_t elsize)
00164 {
00165 size_t size;
00166 void *r;
00167
00168 if (av_size_mult(elsize, nelem, &size)) {
00169 av_free(ptr);
00170 return NULL;
00171 }
00172 r = av_realloc(ptr, size);
00173 if (!r && size)
00174 av_free(ptr);
00175 return r;
00176 }
00177
00178 void av_free(void *ptr)
00179 {
00180 #if CONFIG_MEMALIGN_HACK
00181 if (ptr)
00182 free((char*)ptr - ((char*)ptr)[-1]);
00183 #elif HAVE_ALIGNED_MALLOC
00184 _aligned_free(ptr);
00185 #else
00186 free(ptr);
00187 #endif
00188 }
00189
00190 void av_freep(void *arg)
00191 {
00192 void **ptr= (void**)arg;
00193 av_free(*ptr);
00194 *ptr = NULL;
00195 }
00196
00197 void *av_mallocz(size_t size)
00198 {
00199 void *ptr = av_malloc(size);
00200 if (ptr)
00201 memset(ptr, 0, size);
00202 return ptr;
00203 }
00204
00205 void *av_calloc(size_t nmemb, size_t size)
00206 {
00207 if (size <= 0 || nmemb >= INT_MAX / size)
00208 return NULL;
00209 return av_mallocz(nmemb * size);
00210 }
00211
00212 char *av_strdup(const char *s)
00213 {
00214 char *ptr= NULL;
00215 if(s){
00216 int len = strlen(s) + 1;
00217 ptr = av_malloc(len);
00218 if (ptr)
00219 memcpy(ptr, s, len);
00220 }
00221 return ptr;
00222 }
00223
00224
00225 void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem)
00226 {
00227
00228 int nb, nb_alloc;
00229 intptr_t *tab;
00230
00231 nb = *nb_ptr;
00232 tab = *(intptr_t**)tab_ptr;
00233 if ((nb & (nb - 1)) == 0) {
00234 if (nb == 0)
00235 nb_alloc = 1;
00236 else
00237 nb_alloc = nb * 2;
00238 tab = av_realloc(tab, nb_alloc * sizeof(intptr_t));
00239 *(intptr_t**)tab_ptr = tab;
00240 }
00241 tab[nb++] = (intptr_t)elem;
00242 *nb_ptr = nb;
00243 }
00244