aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-10-13 09:55:07 +0200
committerMax Kellermann <max@duempel.org>2008-10-13 09:55:07 +0200
commit313405edb6bcd83d0a45338d8419fb7065cb565b (patch)
treef371afc72e6233a433f9cd527271a2cceec6a26d
parent3035a3303d8b5696542012e0e05b75daf9601f9b (diff)
downloadmpd-313405edb6bcd83d0a45338d8419fb7065cb565b.tar.gz
mpd-313405edb6bcd83d0a45338d8419fb7065cb565b.tar.xz
mpd-313405edb6bcd83d0a45338d8419fb7065cb565b.zip
songvec: avoid holding nr_lock during free(3)
We only need to lock sv->nr changes to prevent traversals ( why it's called "nr_lock"). free(3) is a "slow" function on my system; so we can avoid unnecessarily holding a lock long for longer than needed.
-rw-r--r--src/songvec.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/songvec.c b/src/songvec.c
index 46c81a82a..80954643e 100644
--- a/src/songvec.c
+++ b/src/songvec.c
@@ -53,10 +53,12 @@ songvec_delete(struct songvec *sv, const struct song *del)
for (i = sv->nr; --i >= 0; ) {
if (sv->base[i] != del)
continue;
- /* we _don't_ call freeSong() here */
+ /* we _don't_ call song_free() here */
if (!--sv->nr) {
+ pthread_mutex_unlock(&nr_lock);
free(sv->base);
sv->base = NULL;
+ return i;
} else {
memmove(&sv->base[i], &sv->base[i + 1],
(sv->nr - i + 1) * sizeof(struct song *));
@@ -82,12 +84,12 @@ songvec_add(struct songvec *sv, struct song *add)
void songvec_destroy(struct songvec *sv)
{
pthread_mutex_lock(&nr_lock);
+ sv->nr = 0;
+ pthread_mutex_unlock(&nr_lock);
if (sv->base) {
free(sv->base);
sv->base = NULL;
}
- sv->nr = 0;
- pthread_mutex_unlock(&nr_lock);
}
int