Commit 5d5c753c authored by Max Kellermann's avatar Max Kellermann

songvec: move code to songvec_find_pointer()

parent 7e7e3eb8
...@@ -142,30 +142,40 @@ songvec_find(const struct songvec *sv, const char *uri) ...@@ -142,30 +142,40 @@ songvec_find(const struct songvec *sv, const char *uri)
return ret; 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 void
songvec_delete(struct songvec *sv, const struct song *del) songvec_delete(struct songvec *sv, const struct song *del)
{ {
size_t i;
db_lock(); db_lock();
for (i = 0; i < sv->nr; ++i) {
if (sv->base[i] != del) const size_t i = songvec_find_pointer(sv, del);
continue;
/* we _don't_ call song_free() here */ /* we _don't_ call song_free() here */
if (!--sv->nr) { if (!--sv->nr) {
g_free(sv->base); g_free(sv->base);
sv->base = NULL; sv->base = NULL;
} else { } else {
memmove(&sv->base[i], &sv->base[i + 1], memmove(&sv->base[i], &sv->base[i + 1],
(sv->nr - i) * sizeof(struct song *)); (sv->nr - i) * sizeof(struct song *));
sv->base = g_realloc(sv->base, sv_size(sv)); sv->base = g_realloc(sv->base, sv_size(sv));
}
db_unlock();
return;
} }
db_unlock();
assert(false); db_unlock();
} }
void void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment