diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2004-03-21 21:58:14 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2004-03-21 21:58:14 +0000 |
commit | 8d1f2ba5e1f411836a7470f1b70676d2fe870303 (patch) | |
tree | a66b8c3d95228fc0b7a908ce3eb9e689d54de8d0 /libavcodec/utils.c | |
parent | 2a42b5c37f9bbbbbe38df8344363b45af53b68a0 (diff) | |
download | ffmpeg-8d1f2ba5e1f411836a7470f1b70676d2fe870303.tar.gz |
static allocation rewrite (old code was plain a broken mess)
doesnt call realloc every time
doesnt randomly overwrite memory after after 8-16 calls
doesnt use ugly macro wraper
fewer lines of code
Originally committed as revision 2912 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/utils.c')
-rw-r--r-- | libavcodec/utils.c | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/libavcodec/utils.c b/libavcodec/utils.c index b6b6059e99..df469300d8 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -66,41 +66,35 @@ void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size) } -/* allocation of static arrays - do not use for normal allocation */ static unsigned int last_static = 0; -static char*** array_static = NULL; +static unsigned int allocated_static = 0; +static void** array_static = NULL; static const unsigned int grow_static = 64; // ^2 -void *__av_mallocz_static(void** location, unsigned int size) + +/** + * allocation of static arrays - do not use for normal allocation. + */ +void *av_mallocz_static(unsigned int size) { - unsigned int l = (last_static + grow_static) & ~(grow_static - 1); void *ptr = av_mallocz(size); - if (!ptr) - return NULL; - - if (location) - { - if (l > last_static) - array_static = av_realloc(array_static, l); - array_static[last_static++] = (char**) location; - *location = ptr; + + if(ptr){ + array_static =av_fast_realloc(array_static, &allocated_static, last_static+1); + array_static[last_static++] = ptr; } + return ptr; } -/* free all static arrays and reset pointers to 0 */ + +/** + * free all static arrays and reset pointers to 0. + */ void av_free_static(void) { - if (array_static) - { - unsigned i; - for (i = 0; i < last_static; i++) - { - av_free(*array_static[i]); - *array_static[i] = NULL; - } - av_free(array_static); - array_static = 0; + while(last_static){ + av_freep(&array_static[--last_static]); } - last_static = 0; + av_freep(&array_static); } /** |