Reimplement content scanning using tasks

This commit is contained in:
Higor Eurípedes 2015-11-22 21:52:56 -03:00
parent 12fe5a0e18
commit c21ffeff71
4 changed files with 73 additions and 177 deletions

View File

@ -22,6 +22,7 @@
#include "../menu_setting.h" #include "../menu_setting.h"
#include "../../runloop_data.h" #include "../../runloop_data.h"
#include "../../tasks/tasks.h"
#ifndef BIND_ACTION_SCAN #ifndef BIND_ACTION_SCAN
#define BIND_ACTION_SCAN(cbs, name) \ #define BIND_ACTION_SCAN(cbs, name) \
@ -29,6 +30,11 @@
cbs->action_scan_ident = #name; cbs->action_scan_ident = #name;
#endif #endif
static void handle_dbscan_finished(void *task_data, void *user_data, const char *err)
{
menu_environment_cb(MENU_ENVIRON_RESET_HORIZONTAL_LIST, NULL);
}
int action_scan_file(const char *path, int action_scan_file(const char *path,
const char *label, unsigned type, size_t idx) const char *label, unsigned type, size_t idx)
{ {
@ -43,8 +49,8 @@ int action_scan_file(const char *path,
fill_pathname_join(fullpath, menu_path, path, sizeof(fullpath)); fill_pathname_join(fullpath, menu_path, path, sizeof(fullpath));
rarch_main_data_msg_queue_push(DATA_TYPE_DB, fullpath, rarch_task_push_dbscan(fullpath, false, handle_dbscan_finished);
"cb_db_scan_file", 0, 1, true);
return 0; return 0;
} }
@ -65,8 +71,8 @@ int action_scan_directory(const char *path,
if (path) if (path)
fill_pathname_join(fullpath, fullpath, path, sizeof(fullpath)); fill_pathname_join(fullpath, fullpath, path, sizeof(fullpath));
rarch_main_data_msg_queue_push(DATA_TYPE_DB, fullpath, rarch_task_push_dbscan(fullpath, true, handle_dbscan_finished);
"cb_db_scan_folder", 0, 1, true);
return 0; return 0;
} }

View File

@ -79,6 +79,8 @@ void rarch_main_data_deinit(void)
#endif #endif
g_data_runloop.inited = false; g_data_runloop.inited = false;
rarch_task_deinit();
} }
void rarch_main_data_free(void) void rarch_main_data_free(void)
@ -87,9 +89,6 @@ void rarch_main_data_free(void)
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
rarch_main_data_http_uninit(); rarch_main_data_http_uninit();
#endif #endif
#ifdef HAVE_LIBRETRODB
rarch_main_data_db_uninit();
#endif
memset(&g_data_runloop, 0, sizeof(g_data_runloop)); memset(&g_data_runloop, 0, sizeof(g_data_runloop));
} }
@ -105,19 +104,11 @@ static void data_runloop_iterate(bool is_thread)
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
rarch_main_data_http_iterate (is_thread); rarch_main_data_http_iterate (is_thread);
#endif #endif
#ifdef HAVE_LIBRETRODB
rarch_main_data_db_iterate (is_thread);
#endif
} }
bool rarch_main_data_active(void) bool rarch_main_data_active(void)
{ {
#ifdef HAVE_LIBRETRODB
if (rarch_main_data_db_is_active())
return true;
#endif
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
if (input_overlay_data_is_active()) if (input_overlay_data_is_active())
return true; return true;
@ -204,11 +195,6 @@ error:
#ifdef HAVE_MENU #ifdef HAVE_MENU
static void rarch_main_data_menu_iterate(void) static void rarch_main_data_menu_iterate(void)
{ {
#ifdef HAVE_LIBRETRODB
if (rarch_main_data_db_pending_scan_finished())
menu_environment_cb(MENU_ENVIRON_RESET_HORIZONTAL_LIST, NULL);
#endif
menu_iterate_render(); menu_iterate_render();
} }
#endif #endif
@ -252,6 +238,8 @@ void rarch_main_data_iterate(void)
data_runloop_msg[0] = '\0'; data_runloop_msg[0] = '\0';
} }
rarch_task_check();
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
if (settings->threaded_data_runloop_enable && g_data_runloop.alive) if (settings->threaded_data_runloop_enable && g_data_runloop.alive)
return; return;
@ -268,6 +256,8 @@ static void rarch_main_data_init(void)
#endif #endif
g_data_runloop.inited = true; g_data_runloop.inited = true;
rarch_task_init();
} }
void rarch_main_data_clear_state(void) void rarch_main_data_clear_state(void)
@ -280,9 +270,6 @@ void rarch_main_data_clear_state(void)
#ifdef HAVE_NETWORKING #ifdef HAVE_NETWORKING
rarch_main_data_http_init(); rarch_main_data_http_init();
#endif #endif
#ifdef HAVE_LIBRETRODB
rarch_main_data_db_init();
#endif
} }
@ -292,9 +279,6 @@ void rarch_main_data_init_queues(void)
rarch_main_data_http_init_msg_queue(); rarch_main_data_http_init_msg_queue();
#endif #endif
rarch_main_data_nbio_init_msg_queue(); rarch_main_data_nbio_init_msg_queue();
#ifdef HAVE_LIBRETRODB
rarch_main_data_db_init_msg_queue();
#endif
} }
@ -331,12 +315,9 @@ void rarch_main_data_msg_queue_push(unsigned type,
fill_pathname_join_delim(new_msg, msg, msg2, '|', sizeof(new_msg)); fill_pathname_join_delim(new_msg, msg, msg2, '|', sizeof(new_msg));
break; break;
#endif #endif
#ifdef HAVE_LIBRETRODB
case DATA_TYPE_DB: case DATA_TYPE_DB:
queue = rarch_main_data_db_get_msg_queue_ptr(); default:
fill_pathname_join_delim(new_msg, msg, msg2, '|', sizeof(new_msg));
break; break;
#endif
} }
if (!queue) if (!queue)

View File

@ -62,19 +62,6 @@ typedef struct db_handle
unsigned status; unsigned status;
} db_handle_t; } db_handle_t;
static db_handle_t *db_ptr;
static bool pending_scan_finished;
bool rarch_main_data_db_pending_scan_finished(void)
{
if (!pending_scan_finished)
return false;
pending_scan_finished = false;
return true;
}
#ifdef HAVE_LIBRETRODB #ifdef HAVE_LIBRETRODB
#ifdef HAVE_ZLIB #ifdef HAVE_ZLIB
@ -489,48 +476,6 @@ static int database_info_iterate(database_state_handle_t *db_state, database_inf
return 0; return 0;
} }
static int database_info_poll(db_handle_t *db)
{
char elem0[PATH_MAX_LENGTH];
uint32_t cb_type_hash = 0;
struct string_list *str_list = NULL;
const char *path = msg_queue_pull(db->msg_queue);
if (!path)
return -1;
str_list = string_split(path, "|");
if (!str_list)
goto error;
if (str_list->size < 1)
goto error;
strlcpy(elem0, str_list->elems[0].data, sizeof(elem0));
if (str_list->size > 1)
cb_type_hash = msg_hash_calculate(str_list->elems[1].data);
switch (cb_type_hash)
{
case CB_DB_SCAN_FILE:
db->handle = database_info_file_init(elem0, DATABASE_TYPE_ITERATE);
break;
case CB_DB_SCAN_FOLDER:
db->handle = database_info_dir_init(elem0, DATABASE_TYPE_ITERATE);
break;
}
string_list_free(str_list);
return 0;
error:
if (str_list)
string_list_free(str_list);
return -1;
}
static void rarch_main_data_db_cleanup_state(database_state_handle_t *db_state) static void rarch_main_data_db_cleanup_state(database_state_handle_t *db_state)
{ {
if (!db_state) if (!db_state)
@ -541,115 +486,92 @@ static void rarch_main_data_db_cleanup_state(database_state_handle_t *db_state)
db_state->buf = NULL; db_state->buf = NULL;
} }
void rarch_main_data_db_iterate(bool is_thread) static void rarch_dbscan_task_handler(rarch_task_t *task)
{ {
database_info_handle_t *db = (db_ptr) ? db_ptr->handle : NULL; db_handle_t *db = (db_handle_t*)task->state;
database_state_handle_t *db_state = (db_ptr) ? &db_ptr->state : NULL; database_info_handle_t *dbinfo = db->handle;
const char *name = db ? db->list->elems[db->list_ptr].data : NULL; database_state_handle_t *dbstate = &db->state;
const char *name = dbinfo ? dbinfo->list->elems[dbinfo->list_ptr].data : NULL;
if (!db) if (!dbinfo)
goto do_poll; goto task_finished;
switch (db->status) switch (dbinfo->status)
{ {
case DATABASE_STATUS_ITERATE_BEGIN: case DATABASE_STATUS_ITERATE_BEGIN:
if (db_state && !db_state->list) if (dbstate && !dbstate->list)
db_state->list = dir_list_new_special(NULL, DIR_LIST_DATABASES, NULL); dbstate->list = dir_list_new_special(NULL, DIR_LIST_DATABASES, NULL);
db->status = DATABASE_STATUS_ITERATE_START; dbinfo->status = DATABASE_STATUS_ITERATE_START;
break; break;
case DATABASE_STATUS_ITERATE_START: case DATABASE_STATUS_ITERATE_START:
rarch_main_data_db_cleanup_state(db_state); rarch_main_data_db_cleanup_state(dbstate);
db_state->list_index = 0; dbstate->list_index = 0;
db_state->entry_index = 0; dbstate->entry_index = 0;
database_info_iterate_start(db, name); database_info_iterate_start(dbinfo, name);
break; break;
case DATABASE_STATUS_ITERATE: case DATABASE_STATUS_ITERATE:
if (database_info_iterate(&db_ptr->state, db) == 0) if (database_info_iterate(&db->state, dbinfo) == 0)
{ {
db->status = DATABASE_STATUS_ITERATE_NEXT; dbinfo->status = DATABASE_STATUS_ITERATE_NEXT;
db->type = DATABASE_TYPE_ITERATE; dbinfo->type = DATABASE_TYPE_ITERATE;
} }
break; break;
case DATABASE_STATUS_ITERATE_NEXT: case DATABASE_STATUS_ITERATE_NEXT:
if (database_info_iterate_next(db) == 0) if (database_info_iterate_next(dbinfo) == 0)
{ {
db->status = DATABASE_STATUS_ITERATE_START; dbinfo->status = DATABASE_STATUS_ITERATE_START;
db->type = DATABASE_TYPE_ITERATE; dbinfo->type = DATABASE_TYPE_ITERATE;
} }
else else
{ {
rarch_main_msg_queue_push_new(MSG_SCANNING_OF_DIRECTORY_FINISHED, 0, 180, true); rarch_main_msg_queue_push_new(MSG_SCANNING_OF_DIRECTORY_FINISHED, 0, 180, true);
pending_scan_finished = true; goto task_finished;
db->status = DATABASE_STATUS_FREE;
} }
break; break;
case DATABASE_STATUS_FREE:
if (db_state->list)
dir_list_free(db_state->list);
db_state->list = NULL;
rarch_main_data_db_cleanup_state(db_state);
database_info_free(db);
if (db_ptr->handle)
free(db_ptr->handle);
db_ptr->handle = NULL;
break;
default: default:
case DATABASE_STATUS_FREE:
case DATABASE_STATUS_NONE: case DATABASE_STATUS_NONE:
goto do_poll; goto task_finished;
break;
} }
return; return;
task_finished:
task->finished = true;
do_poll: if (db->state.list)
if (database_info_poll(db_ptr) != -1) dir_list_free(db->state.list);
{
if (db_ptr->handle) if (db->state.buf)
db_ptr->handle->status = DATABASE_STATUS_ITERATE_BEGIN; free(db->state.buf);
}
if (db->handle)
database_info_free(db->handle);
free(dbinfo);
free(db);
} }
bool rarch_task_push_dbscan(const char *fullpath, bool directory, rarch_task_callback_t cb)
void rarch_main_data_db_init_msg_queue(void)
{ {
db_handle_t *db = (db_handle_t*)db_ptr; rarch_task_t *t = (rarch_task_t*)calloc(1, sizeof(*t));
db_handle_t *db = (db_handle_t*)calloc(1, sizeof(db_handle_t));
t->handler = rarch_dbscan_task_handler;
t->state = db;
t->callback = cb;
if (!db) if (directory)
return; db->handle = database_info_dir_init(fullpath, DATABASE_TYPE_ITERATE);
else
if (!db->msg_queue) db->handle = database_info_file_init(fullpath, DATABASE_TYPE_ITERATE);
retro_assert(db->msg_queue = msg_queue_new(8));
if (db->handle)
db->handle->status = DATABASE_STATUS_ITERATE_BEGIN;
rarch_task_push(t);
return true;
} }
msg_queue_t *rarch_main_data_db_get_msg_queue_ptr(void)
{
db_handle_t *db = (db_handle_t*)db_ptr;
if (!db)
return NULL;
return db->msg_queue;
}
void rarch_main_data_db_uninit(void)
{
if (db_ptr)
free(db_ptr);
db_ptr = NULL;
pending_scan_finished = false;
}
void rarch_main_data_db_init(void)
{
db_ptr = (db_handle_t*)calloc(1, sizeof(*db_ptr));
pending_scan_finished = false;
}
bool rarch_main_data_db_is_active(void)
{
db_handle_t *db = (db_handle_t*)db_ptr;
database_info_handle_t *dbi = db ? db->handle : NULL;
if (dbi && dbi->status != DATABASE_STATUS_NONE)
return true;
return false;
}
#endif #endif

View File

@ -109,20 +109,7 @@ void rarch_main_data_nbio_image_upload_iterate(void);
#endif #endif
#ifdef HAVE_LIBRETRODB #ifdef HAVE_LIBRETRODB
void rarch_main_data_db_iterate(bool is_thread); bool rarch_task_push_dbscan(const char *fullpath, bool directory, rarch_task_callback_t cb);
#ifdef HAVE_MENU
bool rarch_main_data_db_pending_scan_finished(void);
#endif
void rarch_main_data_db_init_msg_queue(void);
msg_queue_t *rarch_main_data_db_get_msg_queue_ptr(void);
void rarch_main_data_db_uninit(void);
void rarch_main_data_db_init(void);
bool rarch_main_data_db_is_active(void);
#endif #endif
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY