Use al_malloc/al_free for the UIntMap array
[openal-soft.git] / common / uintmap.c
blob041f46c15825ff9d6148c687af0bf4abbd0fd0b9
2 #include "config.h"
4 #include "uintmap.h"
6 #include <stdlib.h>
7 #include <string.h>
9 #include "almalloc.h"
12 extern inline void LockUIntMapRead(UIntMap *map);
13 extern inline void UnlockUIntMapRead(UIntMap *map);
14 extern inline void LockUIntMapWrite(UIntMap *map);
15 extern inline void UnlockUIntMapWrite(UIntMap *map);
18 void InitUIntMap(UIntMap *map, ALsizei limit)
20 map->array = NULL;
21 map->size = 0;
22 map->capacity = 0;
23 map->limit = limit;
24 RWLockInit(&map->lock);
27 void ResetUIntMap(UIntMap *map)
29 WriteLock(&map->lock);
30 al_free(map->array);
31 map->array = NULL;
32 map->size = 0;
33 map->capacity = 0;
34 WriteUnlock(&map->lock);
37 ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value)
39 ALsizei pos = 0;
41 WriteLock(&map->lock);
42 if(map->size > 0)
44 ALsizei low = 0;
45 ALsizei high = map->size - 1;
46 while(low < high)
48 ALsizei mid = low + (high-low)/2;
49 if(map->array[mid].key < key)
50 low = mid + 1;
51 else
52 high = mid;
54 if(map->array[low].key < key)
55 low++;
56 pos = low;
59 if(pos == map->size || map->array[pos].key != key)
61 if(map->size == map->limit)
63 WriteUnlock(&map->lock);
64 return AL_OUT_OF_MEMORY;
67 if(map->size == map->capacity)
69 ALvoid *temp = NULL;
70 ALsizei newsize;
72 newsize = (map->capacity ? (map->capacity<<1) : 4);
73 if(map->limit > 0 && newsize > map->limit)
74 newsize = map->limit;
75 if(newsize > map->capacity)
76 temp = al_malloc(16, newsize * sizeof(map->array[0]));
77 if(!temp)
79 WriteUnlock(&map->lock);
80 return AL_OUT_OF_MEMORY;
83 if(map->array)
84 memcpy(temp, map->array, map->size*sizeof(map->array[0]));
85 al_free(map->array);
86 map->array = temp;
87 map->capacity = newsize;
90 if(pos < map->size)
91 memmove(&map->array[pos+1], &map->array[pos],
92 (map->size-pos)*sizeof(map->array[0]));
93 map->size++;
95 map->array[pos].key = key;
96 map->array[pos].value = value;
97 WriteUnlock(&map->lock);
99 return AL_NO_ERROR;
102 ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key)
104 ALvoid *ptr = NULL;
105 WriteLock(&map->lock);
106 if(map->size > 0)
108 ALsizei low = 0;
109 ALsizei high = map->size - 1;
110 while(low < high)
112 ALsizei mid = low + (high-low)/2;
113 if(map->array[mid].key < key)
114 low = mid + 1;
115 else
116 high = mid;
118 if(map->array[low].key == key)
120 ptr = map->array[low].value;
121 if(low < map->size-1)
122 memmove(&map->array[low], &map->array[low+1],
123 (map->size-1-low)*sizeof(map->array[0]));
124 map->size--;
127 WriteUnlock(&map->lock);
128 return ptr;
131 ALvoid *RemoveUIntMapKeyNoLock(UIntMap *map, ALuint key)
133 if(map->size > 0)
135 ALsizei low = 0;
136 ALsizei high = map->size - 1;
137 while(low < high)
139 ALsizei mid = low + (high-low)/2;
140 if(map->array[mid].key < key)
141 low = mid + 1;
142 else
143 high = mid;
145 if(map->array[low].key == key)
147 ALvoid *ptr = map->array[low].value;
148 if(low < map->size-1)
149 memmove(&map->array[low], &map->array[low+1],
150 (map->size-1-low)*sizeof(map->array[0]));
151 map->size--;
152 return ptr;
155 return NULL;
158 ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key)
160 ALvoid *ptr = NULL;
161 ReadLock(&map->lock);
162 if(map->size > 0)
164 ALsizei low = 0;
165 ALsizei high = map->size - 1;
166 while(low < high)
168 ALsizei mid = low + (high-low)/2;
169 if(map->array[mid].key < key)
170 low = mid + 1;
171 else
172 high = mid;
174 if(map->array[low].key == key)
175 ptr = map->array[low].value;
177 ReadUnlock(&map->lock);
178 return ptr;
181 ALvoid *LookupUIntMapKeyNoLock(UIntMap *map, ALuint key)
183 if(map->size > 0)
185 ALsizei low = 0;
186 ALsizei high = map->size - 1;
187 while(low < high)
189 ALsizei mid = low + (high-low)/2;
190 if(map->array[mid].key < key)
191 low = mid + 1;
192 else
193 high = mid;
195 if(map->array[low].key == key)
196 return map->array[low].value;
198 return NULL;