From 0bcfa06bfb0a75ab80ff2936528b5eab7414f366 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Fri, 26 Feb 2016 09:35:28 -0500 Subject: [PATCH] core/containers/database: Add a function for loading databases when idle Signed-off-by: Anna Schumaker --- core/containers/database.c | 6 ++++++ include/core/containers/database.h | 3 +++ tests/core/containers/database.c | 17 ++++++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/containers/database.c b/core/containers/database.c index 91d0a493..9974e712 100644 --- a/core/containers/database.c +++ b/core/containers/database.c @@ -2,6 +2,7 @@ * Copyright 2013 (c) Anna Schumaker. */ #include +#include #define DB_ENTRY_AT(db, index) \ (struct db_entry *)g_ptr_array_index(db->db_entries, index) @@ -128,6 +129,11 @@ void db_load(struct database *db) file_close(&db->db_file); } +void db_load_idle(struct database *db) +{ + idle_schedule((void (*)(void *))db_load, db); +} + struct db_entry *db_insert(struct database *db, const gchar *key) { struct db_entry *item = NULL; diff --git a/include/core/containers/database.h b/include/core/containers/database.h index d06cdb3d..8d668f86 100644 --- a/include/core/containers/database.h +++ b/include/core/containers/database.h @@ -106,6 +106,9 @@ void db_autosave(struct database *); /* Called to read the database from disk. */ void db_load(struct database *); +/* Called to read the database from disk, but only when idle. */ +void db_load_idle(struct database *); + /* Returns the size of the backing std::vector. */ unsigned int db_actual_size(const struct database *); diff --git a/tests/core/containers/database.c b/tests/core/containers/database.c index fb096a5d..ee3cebb5 100644 --- a/tests/core/containers/database.c +++ b/tests/core/containers/database.c @@ -3,6 +3,7 @@ * Test a Database */ #include +#include #include #include @@ -251,6 +252,7 @@ static void test_save_load() g_free(key); } + /* Load using the standard db_load() function */ i = 0; db_load(&db2); test_equal(db2.db_size, N); @@ -264,6 +266,7 @@ static void test_save_load() for (i = 0; i < N; i += 2) db_remove(&db1, db_at(&db1, i)); + /* Use db_load() again */ db_deinit(&db2); db2.db_entries = g_ptr_array_new(); db2.db_keys = g_hash_table_new(g_str_hash, g_str_equal); @@ -288,21 +291,29 @@ static void test_save_load() for (i = N; i < (2 * N); i += 2) db_remove(&db1, db_at(&db1, i)); + /* Use db_load_idle() this time */ db_deinit(&db2); db2.db_entries = g_ptr_array_new(); db2.db_keys = g_hash_table_new(g_str_hash, g_str_equal); - db_load(&db2); + + db_load_idle(&db2); + test_equal(db2.db_size, 0); + while (idle_run_task()) {}; test_equal(db2.db_size, N / 2); + /* Use db_load_idle() again */ db_save(&db1); db_deinit(&db2); db2.db_entries = g_ptr_array_new(); db2.db_keys = g_hash_table_new(g_str_hash, g_str_equal); - db_load(&db2); - i = 1; + db_load_idle(&db2); + test_equal(db2.db_size, 0); + while (idle_run_task()) {}; test_equal(db2.db_size, N); test_equal(db_actual_size(&db2), 2 * N); + + i = 1; db_for_each(dbe, next, &db2) { test_loop_equal(INT_ENTRY(dbe)->ie_val, i, i); i += 2;