void rarch_main_data_db_iterate(bool is_thread) { 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; if (!db) goto do_poll; switch (db->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; 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); break; case DATABASE_STATUS_ITERATE: if (database_info_iterate(&db_ptr->state, db) == 0) { db->status = DATABASE_STATUS_ITERATE_NEXT; db->type = DATABASE_TYPE_ITERATE; } break; case DATABASE_STATUS_ITERATE_NEXT: if (database_info_iterate_next(db) == 0) { db->status = DATABASE_STATUS_ITERATE_START; db->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; } 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_NONE: goto do_poll; } return; do_poll: if (database_info_poll(db_ptr) != -1) { if (db_ptr->handle) db_ptr->handle->status = DATABASE_STATUS_ITERATE_BEGIN; } }
static void rarch_dbscan_task_handler(retro_task_t *task) { 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 (!dbinfo || task->cancelled) goto task_finished; switch (dbinfo->status) { case DATABASE_STATUS_ITERATE_BEGIN: 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(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->state, dbinfo) == 0) { dbinfo->status = DATABASE_STATUS_ITERATE_NEXT; dbinfo->type = DATABASE_TYPE_ITERATE; } break; case DATABASE_STATUS_ITERATE_NEXT: if (database_info_iterate_next(dbinfo) == 0) { dbinfo->status = DATABASE_STATUS_ITERATE_START; dbinfo->type = DATABASE_TYPE_ITERATE; } else { runloop_msg_queue_push( msg_hash_to_str(MSG_SCANNING_OF_DIRECTORY_FINISHED), 0, 180, true); goto task_finished; } break; default: case DATABASE_STATUS_FREE: case DATABASE_STATUS_NONE: goto task_finished; } return; task_finished: task->finished = true; 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); }