mirror of
https://github.com/cookiengineer/audacity
synced 2025-07-29 06: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 (*freefunc)();
|
||||
|
||||
if (list == NULL) {
|
||||
nyquist_printf("why did snd_list_unref get %p?\n", list);
|
||||
return;
|
||||
}
|
||||
|
||||
while (! (list == NULL || 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;
|
||||
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");
|
||||
while (list && (list != zero_snd_list)) {
|
||||
snd_list_type next;
|
||||
|
||||
list = next;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
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) {
|
||||
/* 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