3 * @brief replacement for GNU tdestroy()
5 /*****************************************************************************
6 * Copyright (C) 2009 RĂ©mi Denis-Courmont
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
27 #if defined(HAVE_SEARCH_H) && !defined(HAVE_TDESTROY) && defined(HAVE_TFIND)
32 #include <vlc_common.h>
40 } list
= { NULL
, 0, VLC_STATIC_MUTEX
};
42 static void list_nodes (const void *node
, const VISIT which
, const int depth
)
46 if (which
!= postorder
&& which
!= leaf
)
49 const void **tab
= realloc (list
.tab
, sizeof (*tab
) * (list
.count
+ 1));
50 if (unlikely(tab
== NULL
))
53 tab
[list
.count
] = *(const void **)node
;
62 } smallest
= { NULL
, VLC_STATIC_MUTEX
};
64 static int cmp_smallest (const void *a
, const void *b
)
68 if (a
== smallest
.node
)
70 if (likely(b
== smallest
.node
))
75 void vlc_tdestroy (void *root
, void (*freenode
) (void *))
80 assert (freenode
!= NULL
);
82 /* Enumerate nodes in order */
83 vlc_mutex_lock (&list
.lock
);
84 assert (list
.count
== 0);
85 twalk (root
, list_nodes
);
90 vlc_mutex_unlock (&list
.lock
);
92 /* Destroy the tree */
93 vlc_mutex_lock (&smallest
.lock
);
94 for (size_t i
= 0; i
< count
; i
++)
99 node
= tdelete (node
, &root
, cmp_smallest
);
100 assert (node
!= NULL
);
102 vlc_mutex_unlock (&smallest
.lock
);
103 assert (root
== NULL
);
105 /* Destroy the nodes */
106 for (size_t i
= 0; i
< count
; i
++)
107 freenode ((void *)(tab
[i
]));