1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-01 08:29:27 +02:00

Bug1223 again: redo the fix exactly as Roger Dannenberg wants it

This commit is contained in:
Paul Licameli 2016-06-22 15:39:06 -04:00
parent 5b315be2eb
commit ba1b63a435

View File

@ -515,43 +515,38 @@ void snd_list_terminate(snd_list)
void snd_list_unref(snd_list_type list) void snd_list_unref(snd_list_type list)
{ {
void (*freefunc)();
if (list == NULL) { if (list == NULL) {
nyquist_printf("why did snd_list_unref get %p?\n", list); nyquist_printf("why did snd_list_unref get %p?\n", list);
return; return;
} }
while (! (list == NULL || list == zero_snd_list) ) { while (list && (list != zero_snd_list)) {
list->refcnt--;
/* nyquist_printf("snd_list_unref "); print_snd_list_type(list); stdputstr("\n"); */
if (list->refcnt == 0) {
snd_list_type next; snd_list_type next;
list->refcnt--;
if (list->refcnt != 0) {
break; // the rest of the list is shared, nothing more to free
}
// list nodes either point to a block of samples or this is the
// last list node (list->block == NULL) which points to a suspension
// lists can also terminate at the zero_block, which is an infinite
// shared list (zero_block->block == zero_block) of zero samples
if (list->block && list->block != zero_block) { if (list->block && list->block != zero_block) {
/* there is a next snd_list */ /* there is a next snd_list */
next = list->u.next; next = list->u.next;
/* stdputstr("["); */
sample_block_unref(list->block); sample_block_unref(list->block);
/* stdputstr("]"); */ } else if (list->block == NULL) { /* the next thing is the susp */
}
else if (list->block == NULL) { /* the next thing is the susp */
/* free suspension structure */ /* free suspension structure */
/* nyquist_printf("freeing susp@%p\n", list->u.susp); */ /* nyquist_printf("freeing susp@%p\n", list->u.susp); */
freefunc = list->u.susp->free; (*(list->u.susp->free))(list->u.susp);
(*freefunc)(list->u.susp);
next = NULL; next = NULL;
} }
/* nyquist_printf("freeing snd_list@%p\n", list); */ /* if (list == list_watch)
//DBY printf("freeing watched snd_list %p\n", list); */
if (list == list_watch) printf("freeing watched snd_list %p\n", list);
//DBY
ffree_snd_list(list, "snd_list_unref"); ffree_snd_list(list, "snd_list_unref");
list = next; list = next;
} }
else
break;
}
} }