diff options
author | Eric Wong <normalperson@yhbt.net> | 2008-10-12 03:35:45 -0700 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2008-10-12 05:27:34 -0700 |
commit | bb106c3bf8daf366a4b4ca7229010c038f89755c (patch) | |
tree | 2db77aeed63d095a5533fb6f5d175af4cb10dade /src/dirvec.c | |
parent | d60f11020f4901b806c822ef5ab2d87bbb9e4077 (diff) | |
download | mpd-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.c | 15 |
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); } |