mirror of
https://github.com/cookiengineer/audacity
synced 2025-07-31 07:59:27 +02:00
Bug1223 again: redo the fix exactly as Roger Dannenberg wants it
This commit is contained in:
parent
5b315be2eb
commit
ba1b63a435
@ -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--;
|
snd_list_type next;
|
||||||
/* nyquist_printf("snd_list_unref "); print_snd_list_type(list); stdputstr("\n"); */
|
|
||||||
if (list->refcnt == 0) {
|
|
||||||
snd_list_type next;
|
|
||||||
if (list->block && list->block != zero_block) {
|
|
||||||
/* there is a next snd_list */
|
|
||||||
next = list->u.next;
|
|
||||||
/* stdputstr("["); */
|
|
||||||
sample_block_unref(list->block);
|
|
||||||
/* stdputstr("]"); */
|
|
||||||
}
|
|
||||||
else if (list->block == NULL) { /* the next thing is the susp */
|
|
||||||
/* free suspension structure */
|
|
||||||
/* nyquist_printf("freeing susp@%p\n", list->u.susp); */
|
|
||||||
freefunc = list->u.susp->free;
|
|
||||||
(*freefunc)(list->u.susp);
|
|
||||||
next = NULL;
|
|
||||||
}
|
|
||||||
/* nyquist_printf("freeing snd_list@%p\n", list); */
|
|
||||||
//DBY
|
|
||||||
if (list == list_watch) printf("freeing watched snd_list %p\n", list);
|
|
||||||
//DBY
|
|
||||||
ffree_snd_list(list, "snd_list_unref");
|
|
||||||
|
|
||||||
list = next;
|
list->refcnt--;
|
||||||
}
|
if (list->refcnt != 0) {
|
||||||
else
|
break; // the rest of the list is shared, nothing more to free
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
// 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) {
|
||||||
|
/* there is a next snd_list */
|
||||||
|
next = list->u.next;
|
||||||
|
sample_block_unref(list->block);
|
||||||
|
} else if (list->block == NULL) { /* the next thing is the susp */
|
||||||
|
/* free suspension structure */
|
||||||
|
/* nyquist_printf("freeing susp@%p\n", list->u.susp); */
|
||||||
|
(*(list->u.susp->free))(list->u.susp);
|
||||||
|
next = NULL;
|
||||||
|
}
|
||||||
|
/* if (list == list_watch)
|
||||||
|
printf("freeing watched snd_list %p\n", list); */
|
||||||
|
ffree_snd_list(list, "snd_list_unref");
|
||||||
|
list = next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user