From d6e5e6c773d3ef5299d5153ec1dc9783c4ba2856 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 12 Aug 2016 14:00:11 -0400 Subject: [PATCH] core: Defragment databases on startup Databases can change either as part of an upgrade or through adding and removing entries. We can save a bit of memory by removing unallocated entries during startup. Implements #47: Automatic database defragment Signed-off-by: Anna Schumaker --- core/core.c | 11 +++++++++++ core/tags/album.c | 5 +++++ core/tags/library.c | 5 +++++ core/tags/tags.c | 11 +++++++++++ core/tags/track.c | 5 +++++ include/core/tags/album.h | 3 +++ include/core/tags/library.h | 3 +++ include/core/tags/tags.h | 3 +++ include/core/tags/track.h | 3 +++ 9 files changed, 49 insertions(+) diff --git a/core/core.c b/core/core.c index f6e56bf5..574d3b59 100644 --- a/core/core.c +++ b/core/core.c @@ -9,6 +9,15 @@ #include +static bool core_defragment(void *data) +{ + if (tags_defragment()) { + playlist_save(); + audio_save(); + } + return true; +} + void core_init(int *argc, char ***argv, struct core_init_data *init) { #ifdef CONFIG_TESTING @@ -20,6 +29,8 @@ void core_init(int *argc, char ***argv, struct core_init_data *init) tags_init(); playlist_init(init->playlist_ops); audio_init(argc, argv, init->audio_ops); + + idle_schedule(IDLE_SYNC, core_defragment, NULL); } void core_deinit() diff --git a/core/tags/album.c b/core/tags/album.c index c0b24ea3..86742de9 100644 --- a/core/tags/album.c +++ b/core/tags/album.c @@ -300,6 +300,11 @@ void album_db_deinit() db_deinit(&album_db); } +bool album_db_defrag() +{ + return db_defrag(&album_db); +} + bool album_db_upgrade_done() { struct db_entry *dbe, *next; diff --git a/core/tags/library.c b/core/tags/library.c index 77fe6f19..f755a88f 100644 --- a/core/tags/library.c +++ b/core/tags/library.c @@ -73,6 +73,11 @@ void library_db_deinit() db_deinit(&library_db); } +bool library_db_defrag() +{ + return db_defrag(&library_db); +} + const struct database *library_db_get() { return &library_db; diff --git a/core/tags/tags.c b/core/tags/tags.c index 112d7ace..305d3b08 100644 --- a/core/tags/tags.c +++ b/core/tags/tags.c @@ -35,3 +35,14 @@ void tags_deinit() album_db_deinit(); artist_db_deinit(); } + +bool tags_defragment(void *data) +{ + bool album = album_db_defrag(); + bool library = library_db_defrag(); + bool track = track_db_defrag(); + + if (album || library || track) + track_db_commit(); + return track; +} diff --git a/core/tags/track.c b/core/tags/track.c index 358465ed..3528817d 100644 --- a/core/tags/track.c +++ b/core/tags/track.c @@ -212,6 +212,11 @@ void track_db_commit() db_save(&track_db); } +bool track_db_defrag() +{ + return db_defrag(&track_db); +} + const struct database *track_db_get() { return &track_db; diff --git a/include/core/tags/album.h b/include/core/tags/album.h index ec411ac7..8e2f6d84 100644 --- a/include/core/tags/album.h +++ b/include/core/tags/album.h @@ -36,6 +36,9 @@ void album_db_init(); /* Called to clean up the album database. */ void album_db_deinit(); +/* Called to defragment the album database. */ +bool album_db_defrag(); + /* Called to clean up the album database after an upgrade. */ bool album_db_upgrade_done(); diff --git a/include/core/tags/library.h b/include/core/tags/library.h index a19aabc0..d14cf9b4 100644 --- a/include/core/tags/library.h +++ b/include/core/tags/library.h @@ -30,6 +30,9 @@ void library_db_init(); /* Called to clean up the library database. */ void library_db_deinit(); +/* Called to defragment the library database. */ +bool library_db_defrag(); + /* Called to access the library database. */ const struct database *library_db_get(); diff --git a/include/core/tags/tags.h b/include/core/tags/tags.h index 874f4047..91403273 100644 --- a/include/core/tags/tags.h +++ b/include/core/tags/tags.h @@ -11,4 +11,7 @@ void tags_init(); /* Called to clean up all databases. */ void tags_deinit(); +/* Called to defragment all databases. */ +bool tags_defragment(); + #endif /* OCARINA_CORE_TAGS_TAGS_H */ diff --git a/include/core/tags/track.h b/include/core/tags/track.h index 46380fd0..2f5e2de1 100644 --- a/include/core/tags/track.h +++ b/include/core/tags/track.h @@ -69,6 +69,9 @@ void track_db_deinit(); /* Called to commit the track database. */ void track_db_commit(); +/* Called to defragment the track database. */ +bool track_db_defrag(); + /* Called to access the track database. */ const struct database *track_db_get();