void rarch_main_data_nbio_iterate(bool is_thread) { nbio_handle_t *nbio = (nbio_handle_t*)nbio_ptr; if (!nbio) return; switch (nbio->status) { case NBIO_STATUS_TRANSFER_PARSE: rarch_main_data_nbio_iterate_parse(nbio); nbio->status = NBIO_STATUS_TRANSFER_PARSE_FREE; break; case NBIO_STATUS_TRANSFER: if (rarch_main_data_nbio_iterate_transfer(nbio) == -1) nbio->status = NBIO_STATUS_TRANSFER_PARSE; break; case NBIO_STATUS_TRANSFER_PARSE_FREE: rarch_main_data_nbio_iterate_parse_free(nbio); nbio->status = NBIO_STATUS_POLL; break; case NBIO_STATUS_POLL: default: if (rarch_main_data_nbio_iterate_poll(nbio) == 0) nbio->status = NBIO_STATUS_TRANSFER; break; } }
static void rarch_main_data_nbio_iterate(nbio_handle_t *nbio) { if (!nbio) return; if (nbio->handle) { if (!nbio->is_blocking) { if (rarch_main_data_nbio_iterate_transfer(nbio) == -1) rarch_main_data_nbio_iterate_parse(nbio); } else if (nbio->is_finished) rarch_main_data_nbio_iterate_parse_free(nbio); } else rarch_main_data_nbio_iterate_poll(nbio); if (nbio->image.handle) { if (nbio->image.is_blocking_on_processing) { if (rarch_main_data_image_iterate_process_transfer(nbio) == -1) rarch_main_data_image_iterate_process_transfer_parse(nbio); } else if (!nbio->image.is_blocking) { if (rarch_main_data_image_iterate_transfer(nbio) == -1) rarch_main_data_image_iterate_transfer_parse(nbio); } else if (nbio->image.is_finished) rarch_main_data_image_iterate_parse_free(nbio); } else rarch_main_data_image_iterate_poll(nbio); }
static void rarch_task_file_load_handler(rarch_task_t *task) { nbio_handle_t *nbio = (nbio_handle_t*)task->state; nbio_image_handle_t *image = nbio ? &nbio->image : NULL; switch (nbio->status) { case NBIO_STATUS_TRANSFER_PARSE: rarch_main_data_nbio_iterate_parse(nbio); nbio->status = NBIO_STATUS_TRANSFER_PARSE_FREE; break; case NBIO_STATUS_TRANSFER: if (rarch_main_data_nbio_iterate_transfer(nbio) == -1) nbio->status = NBIO_STATUS_TRANSFER_PARSE; break; case NBIO_STATUS_TRANSFER_PARSE_FREE: case NBIO_STATUS_POLL: default: break; } if (nbio->image.handle) { switch (image->status) { case NBIO_IMAGE_STATUS_PROCESS_TRANSFER: if (rarch_main_data_image_iterate_process_transfer(nbio) == -1) image->status = NBIO_IMAGE_STATUS_PROCESS_TRANSFER_PARSE; break; case NBIO_IMAGE_STATUS_TRANSFER_PARSE: rarch_main_data_image_iterate_transfer_parse(nbio); if (image->is_blocking_on_processing) image->status = NBIO_IMAGE_STATUS_PROCESS_TRANSFER; break; case NBIO_IMAGE_STATUS_TRANSFER: if (!image->is_blocking) if (rarch_main_data_image_iterate_transfer(nbio) == -1) image->status = NBIO_IMAGE_STATUS_TRANSFER_PARSE; break; case NBIO_IMAGE_STATUS_PROCESS_TRANSFER_PARSE: rarch_main_data_image_iterate_process_transfer_parse(nbio); if (!image->is_finished) break; case NBIO_IMAGE_STATUS_TRANSFER_PARSE_FREE: case NBIO_IMAGE_STATUS_POLL: default: break; } if (nbio->is_finished && nbio->image.is_finished && !task->cancelled) { task->task_data = malloc(sizeof(nbio->image.ti)); memcpy(task->task_data, &nbio->image.ti, sizeof(nbio->image.ti)); goto task_finished; } } else if (nbio->is_finished) goto task_finished; if (task->cancelled) { task->error = strdup("Task canceled."); goto task_finished; } return; task_finished: task->finished = true; if (image->handle) { rpng_nbio_load_image_free(image->handle); image->handle = NULL; image->frame_count = 0; } nbio_free(nbio->handle); nbio->handle = NULL; nbio->is_finished = false; nbio->frame_count = 0; free(nbio); }