From c21ffeff7141230a43eeda271b8fdbdbece47240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Sun, 22 Nov 2015 21:52:56 -0300 Subject: [PATCH] Reimplement content scanning using tasks --- menu/cbs/menu_cbs_scan.c | 14 ++- runloop_data.c | 33 ++----- tasks/task_database.c | 188 ++++++++++++--------------------------- tasks/tasks.h | 15 +--- 4 files changed, 73 insertions(+), 177 deletions(-) diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c index 5f64f41e64..6d9c41550e 100644 --- a/menu/cbs/menu_cbs_scan.c +++ b/menu/cbs/menu_cbs_scan.c @@ -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; } diff --git a/runloop_data.c b/runloop_data.c index ddf8fc45d7..d6505b2517 100644 --- a/runloop_data.c +++ b/runloop_data.c @@ -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) diff --git a/tasks/task_database.c b/tasks/task_database.c index 43c257967c..515df71959 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -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 diff --git a/tasks/tasks.h b/tasks/tasks.h index 4133076ed0..07f374404e 100644 --- a/tasks/tasks.h +++ b/tasks/tasks.h @@ -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