aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/songvec.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/src/songvec.c b/src/songvec.c
index 5f5b43f08..9e0321583 100644
--- a/src/songvec.c
+++ b/src/songvec.c
@@ -142,30 +142,40 @@ songvec_find(const struct songvec *sv, const char *uri)
return ret;
}
+/**
+ * Determine the index of the specified #song inside the #songvec, and
+ * returns the index. The caller must hold the db_mutex.
+ */
+G_GNUC_PURE
+static size_t
+songvec_find_pointer(const struct songvec *sv, const struct song *song)
+{
+ for (size_t i = 0;; ++i) {
+ assert(i < sv->nr); /* the song must exist */
+
+ if (sv->base[i] == song)
+ return i;
+ }
+}
+
void
songvec_delete(struct songvec *sv, const struct song *del)
{
- size_t i;
-
db_lock();
- for (i = 0; i < sv->nr; ++i) {
- if (sv->base[i] != del)
- continue;
- /* we _don't_ call song_free() here */
- if (!--sv->nr) {
- g_free(sv->base);
- sv->base = NULL;
- } else {
- memmove(&sv->base[i], &sv->base[i + 1],
- (sv->nr - i) * sizeof(struct song *));
- sv->base = g_realloc(sv->base, sv_size(sv));
- }
- db_unlock();
- return;
+
+ const size_t i = songvec_find_pointer(sv, del);
+
+ /* we _don't_ call song_free() here */
+ if (!--sv->nr) {
+ g_free(sv->base);
+ sv->base = NULL;
+ } else {
+ memmove(&sv->base[i], &sv->base[i + 1],
+ (sv->nr - i) * sizeof(struct song *));
+ sv->base = g_realloc(sv->base, sv_size(sv));
}
- db_unlock();
- assert(false);
+ db_unlock();
}
void