(gfx_widgets.c) Put FIFO queue on stack

This commit is contained in:
twinaphex 2020-09-18 02:18:21 +02:00
parent 290c88b865
commit c2cd39379a
3 changed files with 38 additions and 33 deletions

View File

@ -216,7 +216,7 @@ void gfx_widgets_msg_queue_push(
disp_widget_msg_t *msg_widget = NULL; disp_widget_msg_t *msg_widget = NULL;
dispgfx_widget_t *p_dispwidget = (dispgfx_widget_t*)data; dispgfx_widget_t *p_dispwidget = (dispgfx_widget_t*)data;
if (FIFO_WRITE_AVAIL(p_dispwidget->msg_queue) > 0) if (FIFO_WRITE_AVAIL_NONPTR(p_dispwidget->msg_queue) > 0)
{ {
/* Get current msg if it exists */ /* Get current msg if it exists */
if (task && task->frontend_userdata) if (task && task->frontend_userdata)
@ -344,7 +344,8 @@ void gfx_widgets_msg_queue_push(
p_dispwidget->simple_widget_padding / 2; p_dispwidget->simple_widget_padding / 2;
} }
fifo_write(p_dispwidget->msg_queue, &msg_widget, sizeof(msg_widget)); fifo_write(&p_dispwidget->msg_queue,
&msg_widget, sizeof(msg_widget));
} }
/* Update task info */ /* Update task info */
else else
@ -843,7 +844,7 @@ void gfx_widgets_iterate(
/* Messages queue */ /* Messages queue */
/* Consume one message if available */ /* Consume one message if available */
if ((FIFO_READ_AVAIL(p_dispwidget->msg_queue) > 0) if ((FIFO_READ_AVAIL_NONPTR(p_dispwidget->msg_queue) > 0)
&& !p_dispwidget->widgets_moving && !p_dispwidget->widgets_moving
&& (p_dispwidget->current_msgs_size < ARRAY_SIZE(p_dispwidget->current_msgs))) && (p_dispwidget->current_msgs_size < ARRAY_SIZE(p_dispwidget->current_msgs)))
{ {
@ -853,8 +854,9 @@ void gfx_widgets_iterate(
if (p_dispwidget->current_msgs_size < ARRAY_SIZE(p_dispwidget->current_msgs)) if (p_dispwidget->current_msgs_size < ARRAY_SIZE(p_dispwidget->current_msgs))
{ {
if (FIFO_READ_AVAIL(p_dispwidget->msg_queue) > 0) if (FIFO_READ_AVAIL_NONPTR(p_dispwidget->msg_queue) > 0)
fifo_read(p_dispwidget->msg_queue, &msg_widget, sizeof(msg_widget)); fifo_read(&p_dispwidget->msg_queue,
&msg_widget, sizeof(msg_widget));
if (msg_widget) if (msg_widget)
{ {
@ -1580,10 +1582,8 @@ bool gfx_widgets_init(uintptr_t widgets_active_ptr,
widget->init(video_is_threaded, fullscreen); widget->init(video_is_threaded, fullscreen);
} }
p_dispwidget->msg_queue = if (!fifo_initialize(&p_dispwidget->msg_queue,
fifo_new(MSG_QUEUE_PENDING_MAX * sizeof(disp_widget_msg_t*)); MSG_QUEUE_PENDING_MAX * sizeof(disp_widget_msg_t*)))
if (!p_dispwidget->msg_queue)
goto error; goto error;
memset(&p_dispwidget->current_msgs[0], 0, sizeof(p_dispwidget->current_msgs)); memset(&p_dispwidget->current_msgs[0], 0, sizeof(p_dispwidget->current_msgs));
@ -1948,32 +1948,28 @@ static void gfx_widgets_free(dispgfx_widget_t *p_dispwidget)
&p_dispwidget->gfx_widgets_generic_tag); &p_dispwidget->gfx_widgets_generic_tag);
/* Purge everything from the fifo */ /* Purge everything from the fifo */
if (p_dispwidget->msg_queue) while (FIFO_READ_AVAIL_NONPTR(p_dispwidget->msg_queue) > 0)
{ {
while (FIFO_READ_AVAIL(p_dispwidget->msg_queue) > 0) disp_widget_msg_t *msg_widget;
{
disp_widget_msg_t *msg_widget;
fifo_read(p_dispwidget->msg_queue, fifo_read(&p_dispwidget->msg_queue,
&msg_widget, sizeof(msg_widget)); &msg_widget, sizeof(msg_widget));
/* Note: gfx_widgets_free() is only called when /* Note: gfx_widgets_free() is only called when
* main_exit() is invoked. At this stage, we cannot * main_exit() is invoked. At this stage, we cannot
* guarantee that any task pointers are valid (the * guarantee that any task pointers are valid (the
* task may have been free()'d, but we can't know * task may have been free()'d, but we can't know
* that here) - so all we can do is unset the task * that here) - so all we can do is unset the task
* pointer associated with each message * pointer associated with each message
* > If we don't do this, gfx_widgets_msg_queue_free() * > If we don't do this, gfx_widgets_msg_queue_free()
* will generate heap-use-after-free errors */ * will generate heap-use-after-free errors */
msg_widget->task_ptr = NULL; msg_widget->task_ptr = NULL;
gfx_widgets_msg_queue_free(p_dispwidget, msg_widget); gfx_widgets_msg_queue_free(p_dispwidget, msg_widget);
free(msg_widget); free(msg_widget);
}
fifo_free(p_dispwidget->msg_queue);
} }
p_dispwidget->msg_queue = NULL;
fifo_deinitialize(&p_dispwidget->msg_queue);
/* Purge everything from the list */ /* Purge everything from the list */
SLOCK_LOCK(p_dispwidget->current_msgs_lock); SLOCK_LOCK(p_dispwidget->current_msgs_lock);

View File

@ -158,7 +158,7 @@ typedef struct dispgfx_widget
#ifdef HAVE_THREADS #ifdef HAVE_THREADS
slock_t* current_msgs_lock; slock_t* current_msgs_lock;
#endif #endif
fifo_buffer_t *msg_queue; fifo_buffer_t msg_queue;
disp_widget_msg_t* current_msgs[MSG_QUEUE_ONSCREEN_MAX]; disp_widget_msg_t* current_msgs[MSG_QUEUE_ONSCREEN_MAX];
gfx_widget_fonts_t gfx_widget_fonts; /* ptr alignment */ gfx_widget_fonts_t gfx_widget_fonts; /* ptr alignment */

View File

@ -33,6 +33,14 @@
RETRO_BEGIN_DECLS RETRO_BEGIN_DECLS
#define FIFO_READ_AVAIL(buffer) (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first)
#define FIFO_WRITE_AVAIL(buffer) (((buffer)->size - 1) - (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first))
#define FIFO_READ_AVAIL_NONPTR(buffer) (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first)
#define FIFO_WRITE_AVAIL_NONPTR(buffer) (((buffer).size - 1) - (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first))
struct fifo_buffer struct fifo_buffer
{ {
uint8_t *buffer; uint8_t *buffer;
@ -45,6 +53,8 @@ typedef struct fifo_buffer fifo_buffer_t;
fifo_buffer_t *fifo_new(size_t size); fifo_buffer_t *fifo_new(size_t size);
bool fifo_initialize(fifo_buffer_t *buf, size_t size);
static INLINE void fifo_clear(fifo_buffer_t *buffer) static INLINE void fifo_clear(fifo_buffer_t *buffer)
{ {
buffer->first = 0; buffer->first = 0;
@ -57,9 +67,8 @@ void fifo_read(fifo_buffer_t *buffer, void *in_buf, size_t size);
void fifo_free(fifo_buffer_t *buffer); void fifo_free(fifo_buffer_t *buffer);
#define FIFO_READ_AVAIL(buffer) (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first) bool fifo_deinitialize(fifo_buffer_t *buffer);
#define FIFO_WRITE_AVAIL(buffer) (((buffer)->size - 1) - (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first))
RETRO_END_DECLS RETRO_END_DECLS