From 7284123e3555159c6550d5ac57b8334bdd1af5c1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 8 Oct 2008 01:49:39 -0700 Subject: 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. --- src/songvec.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/songvec.c b/src/songvec.c index ce04a4373..3d512e917 100644 --- a/src/songvec.c +++ b/src/songvec.c @@ -48,10 +48,12 @@ int songvec_delete(struct songvec *sv, const struct mpd_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 mpd_song *)); @@ -76,12 +78,12 @@ void songvec_add(struct songvec *sv, struct mpd_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 songvec_for_each(const struct songvec *sv, -- cgit v1.2.3