(Database) Fix database runloop on data runloop

This commit is contained in:
twinaphex 2015-04-14 08:10:12 +02:00
parent f5470d37b2
commit b7321df63c
4 changed files with 42 additions and 31 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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