Mercurial > libavcodec.hg
comparison utils.c @ 1900:5cde80c5d929 libavcodec
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
author | michael |
---|---|
date | Sun, 21 Mar 2004 21:58:14 +0000 |
parents | ea2a4058441c |
children | bc5039adb9af |
comparison
equal
deleted
inserted
replaced
1899:379a18a7131f | 1900:5cde80c5d929 |
---|---|
64 | 64 |
65 return av_realloc(ptr, *size); | 65 return av_realloc(ptr, *size); |
66 } | 66 } |
67 | 67 |
68 | 68 |
69 /* allocation of static arrays - do not use for normal allocation */ | |
70 static unsigned int last_static = 0; | 69 static unsigned int last_static = 0; |
71 static char*** array_static = NULL; | 70 static unsigned int allocated_static = 0; |
71 static void** array_static = NULL; | |
72 static const unsigned int grow_static = 64; // ^2 | 72 static const unsigned int grow_static = 64; // ^2 |
73 void *__av_mallocz_static(void** location, unsigned int size) | 73 |
74 { | 74 /** |
75 unsigned int l = (last_static + grow_static) & ~(grow_static - 1); | 75 * allocation of static arrays - do not use for normal allocation. |
76 */ | |
77 void *av_mallocz_static(unsigned int size) | |
78 { | |
76 void *ptr = av_mallocz(size); | 79 void *ptr = av_mallocz(size); |
77 if (!ptr) | 80 |
78 return NULL; | 81 if(ptr){ |
79 | 82 array_static =av_fast_realloc(array_static, &allocated_static, last_static+1); |
80 if (location) | 83 array_static[last_static++] = ptr; |
81 { | 84 } |
82 if (l > last_static) | 85 |
83 array_static = av_realloc(array_static, l); | |
84 array_static[last_static++] = (char**) location; | |
85 *location = ptr; | |
86 } | |
87 return ptr; | 86 return ptr; |
88 } | 87 } |
89 /* free all static arrays and reset pointers to 0 */ | 88 |
89 /** | |
90 * free all static arrays and reset pointers to 0. | |
91 */ | |
90 void av_free_static(void) | 92 void av_free_static(void) |
91 { | 93 { |
92 if (array_static) | 94 while(last_static){ |
93 { | 95 av_freep(&array_static[--last_static]); |
94 unsigned i; | 96 } |
95 for (i = 0; i < last_static; i++) | 97 av_freep(&array_static); |
96 { | |
97 av_free(*array_static[i]); | |
98 *array_static[i] = NULL; | |
99 } | |
100 av_free(array_static); | |
101 array_static = 0; | |
102 } | |
103 last_static = 0; | |
104 } | 98 } |
105 | 99 |
106 /** | 100 /** |
107 * Frees memory and sets the pointer to NULL. | 101 * Frees memory and sets the pointer to NULL. |
108 * @param arg pointer to the pointer which should be freed | 102 * @param arg pointer to the pointer which should be freed |