mirror of
https://github.com/libretro/RetroArch
synced 2025-04-16 08:43:10 +00:00
(gfx_widgets.c) Put FIFO queue on stack
This commit is contained in:
parent
290c88b865
commit
c2cd39379a
@ -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);
|
||||||
|
@ -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 */
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user