aboutsummaryrefslogtreecommitdiffstats
path: root/src/dirvec.c
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-10-12 03:35:45 -0700
committerEric Wong <normalperson@yhbt.net>2008-10-12 05:27:34 -0700
commitbb106c3bf8daf366a4b4ca7229010c038f89755c (patch)
tree2db77aeed63d095a5533fb6f5d175af4cb10dade /src/dirvec.c
parentd60f11020f4901b806c822ef5ab2d87bbb9e4077 (diff)
downloadmpd-bb106c3bf8daf366a4b4ca7229010c038f89755c.tar.gz
mpd-bb106c3bf8daf366a4b4ca7229010c038f89755c.tar.xz
mpd-bb106c3bf8daf366a4b4ca7229010c038f89755c.zip
directory: always maintain sorted properties vectors
This allows clients to see sorted results while we're updating the DB and removes the need for us to have to sort manually. We'll have to write separate routines for managing stored playlists with songvecs eventually; but that's for another day.
Diffstat (limited to 'src/dirvec.c')
-rw-r--r--src/dirvec.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/src/dirvec.c b/src/dirvec.c
index 228c54be9..91b371b8a 100644
--- a/src/dirvec.c
+++ b/src/dirvec.c
@@ -18,13 +18,6 @@ static int dirvec_cmp(const void *d1, const void *d2)
return strcmp(a->path, b->path);
}
-void dirvec_sort(struct dirvec *dv)
-{
- pthread_mutex_lock(&nr_lock);
- qsort(dv->base, dv->nr, sizeof(struct directory *), dirvec_cmp);
- pthread_mutex_unlock(&nr_lock);
-}
-
struct directory *dirvec_find(const struct dirvec *dv, const char *path)
{
int i;
@@ -69,10 +62,14 @@ int dirvec_delete(struct dirvec *dv, struct directory *del)
void dirvec_add(struct dirvec *dv, struct directory *add)
{
+ size_t old_nr;
+
pthread_mutex_lock(&nr_lock);
- ++dv->nr;
+ old_nr = dv->nr++;
dv->base = xrealloc(dv->base, dv_size(dv));
- dv->base[dv->nr - 1] = add;
+ dv->base[old_nr] = add;
+ if (old_nr && dirvec_cmp(&dv->base[old_nr - 1], &add) >= 0)
+ qsort(dv->base, dv->nr, sizeof(struct directory *), dirvec_cmp);
pthread_mutex_unlock(&nr_lock);
}