mirror of
https://github.com/libretro/RetroArch
synced 2025-02-28 03:39:59 +00:00
Reimplement content scanning using tasks
This commit is contained in:
parent
12fe5a0e18
commit
c21ffeff71
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user