Changeset 5348:83fcc9598253 in roaraudio for libroar
- Timestamp:
- 12/11/11 12:38:30 (12 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/buffer.c
r5300 r5348 181 181 ROAR_DBG("roar_buffer_unref(buf=%p) = ?", buf); 182 182 183 flags = buf->flags & (ROAR_BUFFER_FLAG_USEABLE|ROAR_BUFFER_FLAG_FREED); 184 if ( flags == ROAR_BUFFER_FLAG_FREED ) { 185 roar_panic(ROAR_FATAL_ERROR_MEMORY_DOUBLE_FREE, NULL); 186 } 187 188 _ckmem_corruption(buf, 0); 189 190 ROAR_DBG("roar_buffer_unref(buf=%p) = ?", buf); 191 192 if ( buf->refc == 0 ) { 193 ROAR_WARN("roar_buffer_unref(buf=%p): Ref counter is wrong. assuming one."); 194 buf->refc = 1; 195 roar_panic(ROAR_FATAL_ERROR_MEMORY_CORRUPTION, NULL); 196 } 197 198 buf->refc--; 199 200 if ( buf->refc ) { 201 ROAR_DBG("roar_buffer_unref(buf=%p) = 0", buf); 202 return 0; 203 } 204 205 ROAR_DBG("roar_buffer_unref(buf=%p) = ?", buf); 206 207 cur = buf->next; 183 cur = buf; 208 184 while (cur != NULL) { 209 185 flags = cur->flags & (ROAR_BUFFER_FLAG_USEABLE|ROAR_BUFFER_FLAG_FREED); … … 212 188 } 213 189 190 _ckmem_corruption(cur, 0); 191 192 if ( cur->refc == 0 ) { 193 ROAR_WARN("roar_buffer_unref(buf=%p): Ref counter for buffer at %p is wrong. assuming one.", cur); 194 cur->refc = 1; 195 roar_panic(ROAR_FATAL_ERROR_MEMORY_CORRUPTION, NULL); 196 } else if ( cur->refc > 1 ) { 197 cur->refc--; 198 return 0; 199 } 200 214 201 ROAR_DBG("roar_buffer_unref(buf=%p) = ?", buf); 215 216 _ckmem_corruption(cur, 0);217 202 218 203 if ( roar_buffer_get_flag(cur, ROAR_BUFFER_FLAG_NOFREE) != 1 ) … … 224 209 cur = next; 225 210 } 226 227 ROAR_DBG("roar_buffer_unref(buf=%p) = ?", buf);228 229 if ( !(buf->flags & ROAR_BUFFER_FLAG_NOFREE) )230 roar_mm_free(buf->data);231 232 ROAR_DBG("roar_buffer_unref(buf=%p): setting flags = ROAR_BUFFER_FLAG_FREED", buf);233 buf->flags = ROAR_BUFFER_FLAG_FREED;234 235 roar_mm_free(buf);236 211 237 212 ROAR_DBG("roar_buffer_unref(buf=%p) = 0", buf); … … 247 222 } 248 223 249 ROAR_DBG("buffer_delete(buf=%p, next=%p) = ?", buf, next); 250 251 if ( next != NULL ) 252 *next = buf->next; 253 254 if ( roar_buffer_get_flag(buf, ROAR_BUFFER_FLAG_NOFREE) != 1 ) 255 roar_mm_free(buf->data); 256 257 roar_mm_free(buf); 258 259 ROAR_DBG("buffer_delete(buf=%p, next=%p) = 0", buf, next); 260 return 0; 224 ROAR_DBG("roar_buffer_delete(buf=%p, next=%p) = ?", buf, next); 225 226 if ( next != NULL ) { 227 *next = buf; 228 return roar_buffer_next(next); 229 } else { 230 return roar_buffer_unref(buf); 231 } 261 232 } 262 233 263 234 int roar_buffer_next (struct roar_buffer ** buf) { 264 return roar_buffer_delete(*buf, buf); 235 struct roar_buffer * ret; 236 237 if ( buf == NULL || *buf == NULL ) { 238 roar_err_set(ROAR_ERROR_FAULT); 239 } 240 241 ret = (*buf)->next; 242 243 if ( ret != NULL ) 244 roar_buffer_ref(ret); 245 246 roar_buffer_unref(*buf); 247 248 *buf = ret; 249 250 return 0; 265 251 } 266 252 267 253 int roar_buffer_add (struct roar_buffer * buf, struct roar_buffer * next) { 254 if ( roar_buffer_ref(next) == -1 ) 255 return -1; 268 256 return roar_buffer_moveinto(buf, &next); 269 257 } … … 314 302 *next = buf->next; 315 303 316 return 0;304 return roar_buffer_ref(*next); 317 305 } 318 306
Note: See TracChangeset
for help on using the changeset viewer.