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 "../../runloop_data.h"
#include "../../tasks/tasks.h"
#ifndef BIND_ACTION_SCAN
#define BIND_ACTION_SCAN(cbs, name) \
@ -29,6 +30,11 @@
cbs->action_scan_ident = #name;
#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,
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));
rarch_main_data_msg_queue_push(DATA_TYPE_DB, fullpath,
"cb_db_scan_file", 0, 1, true);
rarch_task_push_dbscan(fullpath, false, handle_dbscan_finished);
return 0;
}
@ -65,8 +71,8 @@ int action_scan_directory(const char *path,
if (path)
fill_pathname_join(fullpath, fullpath, path, sizeof(fullpath));
rarch_main_data_msg_queue_push(DATA_TYPE_DB, fullpath,
"cb_db_scan_folder", 0, 1, true);
rarch_task_push_dbscan(fullpath, true, handle_dbscan_finished);
return 0;
}

View File

@ -79,6 +79,8 @@ void rarch_main_data_deinit(void)
#endif
g_data_runloop.inited = false;
rarch_task_deinit();
}
void rarch_main_data_free(void)
@ -87,9 +89,6 @@ void rarch_main_data_free(void)
#ifdef HAVE_NETWORKING
rarch_main_data_http_uninit();
#endif
#ifdef HAVE_LIBRETRODB
rarch_main_data_db_uninit();
#endif
memset(&g_data_runloop, 0, sizeof(g_data_runloop));
}
@ -105,19 +104,11 @@ static void data_runloop_iterate(bool is_thread)
#ifdef HAVE_NETWORKING
rarch_main_data_http_iterate (is_thread);
#endif
#ifdef HAVE_LIBRETRODB
rarch_main_data_db_iterate (is_thread);
#endif
}
bool rarch_main_data_active(void)
{
#ifdef HAVE_LIBRETRODB
if (rarch_main_data_db_is_active())
return true;
#endif
#ifdef HAVE_OVERLAY
if (input_overlay_data_is_active())
return true;
@ -204,11 +195,6 @@ error:
#ifdef HAVE_MENU
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();
}
#endif
@ -252,6 +238,8 @@ void rarch_main_data_iterate(void)
data_runloop_msg[0] = '\0';
}
rarch_task_check();
#ifdef HAVE_THREADS
if (settings->threaded_data_runloop_enable && g_data_runloop.alive)
return;
@ -268,6 +256,8 @@ static void rarch_main_data_init(void)
#endif
g_data_runloop.inited = true;
rarch_task_init();
}
void rarch_main_data_clear_state(void)
@ -280,9 +270,6 @@ void rarch_main_data_clear_state(void)
#ifdef HAVE_NETWORKING
rarch_main_data_http_init();
#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();
#endif
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));
break;
#endif
#ifdef HAVE_LIBRETRODB
case DATA_TYPE_DB:
queue = rarch_main_data_db_get_msg_queue_ptr();
fill_pathname_join_delim(new_msg, msg, msg2, '|', sizeof(new_msg));
default:
break;
#endif
}
if (!queue)

View File

@ -62,19 +62,6 @@ typedef struct db_handle
unsigned status;
} 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_ZLIB
@ -489,48 +476,6 @@ static int database_info_iterate(database_state_handle_t *db_state, database_inf
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)
{
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;
}
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;
database_state_handle_t *db_state = (db_ptr) ? &db_ptr->state : NULL;
const char *name = db ? db->list->elems[db->list_ptr].data : NULL;
db_handle_t *db = (db_handle_t*)task->state;
database_info_handle_t *dbinfo = db->handle;
database_state_handle_t *dbstate = &db->state;
const char *name = dbinfo ? dbinfo->list->elems[dbinfo->list_ptr].data : NULL;
if (!db)
goto do_poll;
if (!dbinfo)
goto task_finished;
switch (db->status)
switch (dbinfo->status)
{
case DATABASE_STATUS_ITERATE_BEGIN:
if (db_state && !db_state->list)
db_state->list = dir_list_new_special(NULL, DIR_LIST_DATABASES, NULL);
db->status = DATABASE_STATUS_ITERATE_START;
if (dbstate && !dbstate->list)
dbstate->list = dir_list_new_special(NULL, DIR_LIST_DATABASES, NULL);
dbinfo->status = DATABASE_STATUS_ITERATE_START;
break;
case DATABASE_STATUS_ITERATE_START:
rarch_main_data_db_cleanup_state(db_state);
db_state->list_index = 0;
db_state->entry_index = 0;
database_info_iterate_start(db, name);
rarch_main_data_db_cleanup_state(dbstate);
dbstate->list_index = 0;
dbstate->entry_index = 0;
database_info_iterate_start(dbinfo, name);
break;
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;
db->type = DATABASE_TYPE_ITERATE;
dbinfo->status = DATABASE_STATUS_ITERATE_NEXT;
dbinfo->type = DATABASE_TYPE_ITERATE;
}
break;
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;
db->type = DATABASE_TYPE_ITERATE;
dbinfo->status = DATABASE_STATUS_ITERATE_START;
dbinfo->type = DATABASE_TYPE_ITERATE;
}
else
{
rarch_main_msg_queue_push_new(MSG_SCANNING_OF_DIRECTORY_FINISHED, 0, 180, true);
pending_scan_finished = true;
db->status = DATABASE_STATUS_FREE;
goto task_finished;
}
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:
case DATABASE_STATUS_FREE:
case DATABASE_STATUS_NONE:
goto do_poll;
goto task_finished;
break;
}
return;
task_finished:
task->finished = true;
do_poll:
if (database_info_poll(db_ptr) != -1)
{
if (db_ptr->handle)
db_ptr->handle->status = DATABASE_STATUS_ITERATE_BEGIN;
}
if (db->state.list)
dir_list_free(db->state.list);
if (db->state.buf)
free(db->state.buf);
if (db->handle)
database_info_free(db->handle);
free(dbinfo);
free(db);
}
void rarch_main_data_db_init_msg_queue(void)
bool rarch_task_push_dbscan(const char *fullpath, bool directory, rarch_task_callback_t cb)
{
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)
return;
if (!db->msg_queue)
retro_assert(db->msg_queue = msg_queue_new(8));
if (directory)
db->handle = database_info_dir_init(fullpath, DATABASE_TYPE_ITERATE);
else
db->handle = database_info_file_init(fullpath, DATABASE_TYPE_ITERATE);
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

View File

@ -109,20 +109,7 @@ void rarch_main_data_nbio_image_upload_iterate(void);
#endif
#ifdef HAVE_LIBRETRODB
void rarch_main_data_db_iterate(bool is_thread);
#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);
bool rarch_task_push_dbscan(const char *fullpath, bool directory, rarch_task_callback_t cb);
#endif
#ifdef HAVE_OVERLAY