diff --git a/libretro-common/queues/message_queue.c b/libretro-common/queues/message_queue.c index d1cbab7992..47bfcf9f27 100644 --- a/libretro-common/queues/message_queue.c +++ b/libretro-common/queues/message_queue.c @@ -108,27 +108,29 @@ void msg_queue_push(msg_queue_t *queue, const char *msg, if (!queue || queue->ptr >= queue->size) return; - new_elem = (struct queue_elem*)calloc(1, sizeof(struct queue_elem)); + new_elem = (struct queue_elem*) + calloc(1, sizeof(struct queue_elem)); if (!new_elem) return; - new_elem->prio = prio; - new_elem->duration = duration; - new_elem->msg = msg ? strdup(msg) : NULL; + new_elem->prio = prio; + new_elem->duration = duration; + new_elem->msg = msg ? strdup(msg) : NULL; - queue->elems[queue->ptr] = new_elem; - tmp_ptr = queue->ptr++; + queue->elems[queue->ptr] = new_elem; + + tmp_ptr = queue->ptr++; while (tmp_ptr > 1) { - struct queue_elem *parent = queue->elems[tmp_ptr >> 1]; - struct queue_elem *child = queue->elems[tmp_ptr]; + struct queue_elem *parent = queue->elems[tmp_ptr >> 1]; + struct queue_elem *child = queue->elems[tmp_ptr]; if (child->prio <= parent->prio) break; queue->elems[tmp_ptr >> 1] = child; - queue->elems[tmp_ptr] = parent; + queue->elems[tmp_ptr] = parent; tmp_ptr >>= 1; } diff --git a/libretro_version_1.c b/libretro_version_1.c index 15611b64ed..31da19a18b 100644 --- a/libretro_version_1.c +++ b/libretro_version_1.c @@ -27,6 +27,7 @@ #include #include "general.h" #include "runloop.h" +#include "runloop_data.h" #include "retroarch.h" #include "performance.h" #include "input/keyboard_line.h" @@ -149,6 +150,7 @@ static void video_frame(const void *data, unsigned width, recording_dump_frame(data, width, height, pitch); msg = rarch_main_msg_queue_pull(); + driver->current_msg = msg; if (video_frame_filter(data, width, height, pitch, diff --git a/runloop.c b/runloop.c index 9b3a671da0..49943972c6 100644 --- a/runloop.c +++ b/runloop.c @@ -889,7 +889,12 @@ static void rarch_main_iterate_linefeed_overlay(void) const char *rarch_main_msg_queue_pull(void) { runloop_t *runloop = rarch_main_get_ptr(); - return msg_queue_pull(runloop->msg_queue); + const char *msg = rarch_main_data_msg_queue_pull(); + + if (!msg && runloop) + msg = msg_queue_pull(runloop->msg_queue); + + return msg; } void rarch_main_msg_queue_push(const char *msg, unsigned prio, unsigned duration, diff --git a/runloop_data.c b/runloop_data.c index 9c18850e90..3403eb6ace 100644 --- a/runloop_data.c +++ b/runloop_data.c @@ -110,6 +110,7 @@ enum typedef struct data_runloop { + msg_queue_t *msg_queue; #ifdef HAVE_NETWORKING http_handle_t http; #endif @@ -163,7 +164,6 @@ static int rarch_main_data_http_iterate_transfer(http_handle_t *http) int percent = 0; if (!net_http_update(http->handle, &pos, &tot)) { -#if 0 char msg[PATH_MAX_LENGTH]; if(tot != 0) @@ -171,14 +171,11 @@ static int rarch_main_data_http_iterate_transfer(http_handle_t *http) else percent=0; - RARCH_LOG("Download progress: %.d%% \r", percent); - - if(percent > 0) + if (percent > 0) { snprintf(msg, sizeof(msg), "Download progress: %d%%", percent); - rarch_main_msg_queue_push(msg, 1, 10, true); + rarch_main_data_msg_queue_push(DATA_TYPE_MSG, msg, NULL, 1, 10, true); } -#endif return -1; } @@ -872,6 +869,9 @@ void rarch_main_data_deinit(void) if (!data_runloop) return; + if (data_runloop->msg_queue) + msg_queue_free(data_runloop->msg_queue); + #ifdef HAVE_THREADS if (data_runloop->thread_inited) { @@ -1036,6 +1036,14 @@ void rarch_main_data_init_queues(void) rarch_assert(data_runloop->nbio.msg_queue = msg_queue_new(8)); if (!data_runloop->nbio.image.msg_queue) rarch_assert(data_runloop->nbio.image.msg_queue = msg_queue_new(8)); + if (!data_runloop->msg_queue) + rarch_assert(data_runloop->msg_queue = msg_queue_new(8)); +} + +const char *rarch_main_data_msg_queue_pull(void) +{ + data_runloop_t *runloop = (data_runloop_t*)rarch_main_data_get_ptr(); + return msg_queue_pull(runloop->msg_queue); } void rarch_main_data_msg_queue_push(unsigned type, @@ -1046,27 +1054,35 @@ void rarch_main_data_msg_queue_push(unsigned type, msg_queue_t *queue = NULL; data_runloop_t *data_runloop = (data_runloop_t*)rarch_main_data_get_ptr(); - snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); - switch(type) { case DATA_TYPE_NONE: break; case DATA_TYPE_FILE: queue = data_runloop->nbio.msg_queue; + snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; case DATA_TYPE_IMAGE: queue = data_runloop->nbio.image.msg_queue; + snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; #ifdef HAVE_NETWORKING case DATA_TYPE_HTTP: queue = data_runloop->http.msg_queue; + snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; #endif #ifdef HAVE_OVERLAY case DATA_TYPE_OVERLAY: + snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; #endif + case DATA_TYPE_MSG: + if (data_runloop->thread_inited) + return; + queue = data_runloop->msg_queue; + snprintf(new_msg, sizeof(new_msg), "%s", msg); + break; } if (!queue) diff --git a/runloop_data.h b/runloop_data.h index fcfcb7cbd9..04dbaf753c 100644 --- a/runloop_data.h +++ b/runloop_data.h @@ -28,6 +28,7 @@ extern "C" { enum runloop_data_type { DATA_TYPE_NONE = 0, + DATA_TYPE_MSG, DATA_TYPE_FILE, DATA_TYPE_IMAGE, DATA_TYPE_HTTP, @@ -40,6 +41,8 @@ void rarch_main_data_msg_queue_push(unsigned type, const char *msg, const char *msg2, unsigned prio, unsigned duration, bool flush); +const char *rarch_main_data_msg_queue_pull(void); + void rarch_main_data_clear_state(void); void rarch_main_data_iterate(void);