From b7321df63c8c7f32a115ff3a67646761a5f3b17d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 14 Apr 2015 08:10:12 +0200 Subject: [PATCH] (Database) Fix database runloop on data runloop --- database_info.c | 22 +++++++++---------- database_info.h | 10 +++++++-- menu/menu_entries_cbs_iterate.c | 2 +- runloop_data.c | 39 +++++++++++++++++++-------------- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/database_info.c b/database_info.c index 240eea69fa..4f7deb51dc 100644 --- a/database_info.c +++ b/database_info.c @@ -61,8 +61,8 @@ static int zlib_compare_crc32(const char *name, const char *valid_exts, database_info_rdl_handle_t *database_info_write_rdl_init(const char *dir) { const char *exts = ""; + global_t *global = global_get_ptr(); database_info_rdl_handle_t *dbl = (database_info_rdl_handle_t*)calloc(1, sizeof(*dbl)); - global_t *global = global_get_ptr(); if (!dbl) return NULL; @@ -71,11 +71,19 @@ database_info_rdl_handle_t *database_info_write_rdl_init(const char *dir) exts = core_info_list_get_all_extensions(global->core_info); dbl->list = dir_list_new(dir, exts, false); + + if (!dbl->list) + goto error; + dbl->list_ptr = 0; - dbl->blocking = false; - dbl->iterating = true; + dbl->status = DATABASE_RDL_ITERATE; return dbl; + +error: + if (dbl) + free(dbl); + return NULL; } void database_info_write_rdl_free(database_info_rdl_handle_t *dbl) @@ -96,14 +104,6 @@ int database_info_write_rdl_iterate(database_info_rdl_handle_t *dbl) if (!dbl || !dbl->list) return -1; - if (dbl->blocking) - return 1; - if (dbl->list_ptr < dbl->list->size) {} - else - { - dbl->iterating = false; - return 1; - } name = dbl->list->elems[dbl->list_ptr].data; diff --git a/database_info.h b/database_info.h index 75d1687bad..bfc8f1b61f 100644 --- a/database_info.h +++ b/database_info.h @@ -27,10 +27,16 @@ extern "C" { #endif +enum database_rdl_action_type +{ + DATABASE_RDL_NONE = 0, + DATABASE_RDL_ITERATE, + DATABASE_RDL_FREE, +}; + typedef struct { - bool blocking; - bool iterating; + enum database_rdl_action_type status; size_t list_ptr; struct string_list *list; } database_info_rdl_handle_t; diff --git a/menu/menu_entries_cbs_iterate.c b/menu/menu_entries_cbs_iterate.c index ef9c33bfa5..05e5d8a98f 100644 --- a/menu/menu_entries_cbs_iterate.c +++ b/menu/menu_entries_cbs_iterate.c @@ -595,7 +595,7 @@ static int action_iterate_main(const char *label, unsigned action) case MENU_ACTION_TEST: #if 0 - menu->rdl = database_info_write_rdl_init("/home/twinaphex/roms"); + menu->rdl = database_info_write_rdl_init("/home/squarepusher/roms"); if (!menu->rdl) return -1; diff --git a/runloop_data.c b/runloop_data.c index 67b3d561af..ba51c699d3 100644 --- a/runloop_data.c +++ b/runloop_data.c @@ -646,34 +646,36 @@ static int rarch_main_data_nbio_iterate_parse(nbio_handle_t *nbio) return 0; } +#ifdef HAVE_LIBRETRODB #ifdef HAVE_MENU static void rarch_main_data_db_iterate(bool is_thread, data_runloop_t *runloop) { - driver_t *driver = driver_get_ptr(); + driver_t *driver = driver_get_ptr(); + menu_handle_t *menu = menu_driver_get_ptr(); + database_info_rdl_handle_t *dbl = menu ? menu->rdl : NULL; - if (!driver || !driver->menu || !driver->menu->rdl) + if (!dbl) return; - if (driver->menu->rdl->blocking) + switch (dbl->status) { - /* Do nonblocking I/O transfers here. */ - return; + case DATABASE_RDL_NONE: + break; + case DATABASE_RDL_ITERATE: + if (dbl->list_ptr < dbl->list->size) + database_info_write_rdl_iterate(dbl); + else + dbl->status = DATABASE_RDL_FREE; + break; + case DATABASE_RDL_FREE: + database_info_write_rdl_free(dbl); + dbl = NULL; + break; } - -#ifdef HAVE_LIBRETRODB - if (!driver->menu->rdl->iterating) - { - database_info_write_rdl_free(driver->menu->rdl); - driver->menu->rdl = NULL; - return; - } - - database_info_write_rdl_iterate(driver->menu->rdl); -#endif - } #endif +#endif static void rarch_main_data_nbio_image_iterate(bool is_thread, @@ -902,9 +904,12 @@ static void data_runloop_iterate(bool is_thread, data_runloop_t *runloop) #ifdef HAVE_NETWORKING rarch_main_data_http_iterate (is_thread, runloop); #endif + #ifdef HAVE_MENU +#ifdef HAVE_LIBRETRODB rarch_main_data_db_iterate (is_thread, runloop); #endif +#endif } #ifdef HAVE_THREADS