Turn mq_lock into static local variable and move it to runloop_ctl
This commit is contained in:
parent
bdb54d91b7
commit
1cd32c0dfc
94
runloop.c
94
runloop.c
|
@ -60,7 +60,6 @@
|
||||||
|
|
||||||
#include "verbosity.h"
|
#include "verbosity.h"
|
||||||
|
|
||||||
|
|
||||||
static rarch_dir_list_t runloop_shader_dir;
|
static rarch_dir_list_t runloop_shader_dir;
|
||||||
|
|
||||||
static unsigned runloop_pending_windowed_scale;
|
static unsigned runloop_pending_windowed_scale;
|
||||||
|
@ -73,10 +72,6 @@ static retro_time_t frame_limit_minimum_time;
|
||||||
|
|
||||||
static msg_queue_t *g_msg_queue;
|
static msg_queue_t *g_msg_queue;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
|
||||||
static slock_t *mq_lock = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
global_t *global_get_ptr(void)
|
global_t *global_get_ptr(void)
|
||||||
{
|
{
|
||||||
static struct global g_extern;
|
static struct global g_extern;
|
||||||
|
@ -87,15 +82,11 @@ const char *rarch_main_msg_queue_pull(void)
|
||||||
{
|
{
|
||||||
const char *ret = NULL;
|
const char *ret = NULL;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_LOCK, NULL);
|
||||||
slock_lock(mq_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ret = msg_queue_pull(g_msg_queue);
|
ret = msg_queue_pull(g_msg_queue);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_UNLOCK, NULL);
|
||||||
slock_unlock(mq_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -118,17 +109,13 @@ void rarch_main_msg_queue_push(const char *msg, unsigned prio, unsigned duration
|
||||||
if(!settings->video.font_enable || !g_msg_queue)
|
if(!settings->video.font_enable || !g_msg_queue)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_LOCK, NULL);
|
||||||
slock_lock(mq_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (flush)
|
if (flush)
|
||||||
msg_queue_clear(g_msg_queue);
|
msg_queue_clear(g_msg_queue);
|
||||||
msg_queue_push(g_msg_queue, msg, prio, duration);
|
msg_queue_push(g_msg_queue, msg, prio, duration);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_UNLOCK, NULL);
|
||||||
slock_unlock(mq_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ui_companion_is_on_foreground())
|
if (ui_companion_is_on_foreground())
|
||||||
{
|
{
|
||||||
|
@ -143,42 +130,16 @@ static void rarch_main_msg_queue_free(void)
|
||||||
if (!g_msg_queue)
|
if (!g_msg_queue)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_LOCK, NULL);
|
||||||
slock_lock(mq_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
msg_queue_free(g_msg_queue);
|
msg_queue_free(g_msg_queue);
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_UNLOCK, NULL);
|
||||||
slock_unlock(mq_lock);
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_FREE, NULL);
|
||||||
slock_free(mq_lock);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
g_msg_queue = NULL;
|
g_msg_queue = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rarch_main_msg_queue_init(void)
|
|
||||||
{
|
|
||||||
if (g_msg_queue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_msg_queue = msg_queue_new(8);
|
|
||||||
retro_assert(g_msg_queue);
|
|
||||||
|
|
||||||
#ifdef HAVE_THREADS
|
|
||||||
mq_lock = slock_new();
|
|
||||||
retro_assert(mq_lock);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool check_focus(settings_t *settings)
|
|
||||||
{
|
|
||||||
if (settings->pause_nonactive)
|
|
||||||
return video_driver_ctl(RARCH_DISPLAY_CTL_IS_FOCUSED, NULL);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check_pause:
|
* check_pause:
|
||||||
* @pressed : was libretro pause key pressed?
|
* @pressed : was libretro pause key pressed?
|
||||||
|
@ -412,6 +373,9 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
|
||||||
static bool runloop_exec = false;
|
static bool runloop_exec = false;
|
||||||
static bool runloop_slowmotion = false;
|
static bool runloop_slowmotion = false;
|
||||||
static bool runloop_core_shutdown_initiated = false;
|
static bool runloop_core_shutdown_initiated = false;
|
||||||
|
#ifdef HAVE_THREADS
|
||||||
|
static slock_t *runloop_msg_queue_lock = NULL;
|
||||||
|
#endif
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
|
@ -476,17 +440,19 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
|
||||||
strlcpy(runloop_fullpath, fullpath, sizeof(runloop_fullpath));
|
strlcpy(runloop_fullpath, fullpath, sizeof(runloop_fullpath));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case RUNLOOP_CTL_CHECK_FOCUS:
|
||||||
|
if (settings->pause_nonactive)
|
||||||
|
return video_driver_ctl(RARCH_DISPLAY_CTL_IS_FOCUSED, NULL);
|
||||||
|
return true;
|
||||||
case RUNLOOP_CTL_CHECK_IDLE_STATE:
|
case RUNLOOP_CTL_CHECK_IDLE_STATE:
|
||||||
{
|
{
|
||||||
event_cmd_state_t *cmd = (event_cmd_state_t*)data;
|
event_cmd_state_t *cmd = (event_cmd_state_t*)data;
|
||||||
bool focused = check_focus(settings);
|
bool focused = runloop_ctl(RUNLOOP_CTL_CHECK_FOCUS, NULL);
|
||||||
|
|
||||||
check_pause(settings, focused,
|
check_pause(settings, focused,
|
||||||
cmd->pause_pressed, cmd->frameadvance_pressed);
|
cmd->pause_pressed, cmd->frameadvance_pressed);
|
||||||
|
|
||||||
if (!runloop_ctl(RUNLOOP_CTL_CHECK_PAUSE_STATE, cmd))
|
if (!runloop_ctl(RUNLOOP_CTL_CHECK_PAUSE_STATE, cmd) || !focused)
|
||||||
return false;
|
|
||||||
if (!focused)
|
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -766,12 +732,36 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
|
||||||
break;
|
break;
|
||||||
case RUNLOOP_CTL_IS_PAUSED:
|
case RUNLOOP_CTL_IS_PAUSED:
|
||||||
return runloop_paused;
|
return runloop_paused;
|
||||||
|
case RUNLOOP_CTL_MSG_QUEUE_FREE:
|
||||||
|
#ifdef HAVE_THREADS
|
||||||
|
slock_free(runloop_msg_queue_lock);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
case RUNLOOP_CTL_MSG_QUEUE_DEINIT:
|
case RUNLOOP_CTL_MSG_QUEUE_DEINIT:
|
||||||
rarch_main_msg_queue_free();
|
rarch_main_msg_queue_free();
|
||||||
break;
|
break;
|
||||||
case RUNLOOP_CTL_MSG_QUEUE_INIT:
|
case RUNLOOP_CTL_MSG_QUEUE_INIT:
|
||||||
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_DEINIT, NULL);
|
runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_DEINIT, NULL);
|
||||||
rarch_main_msg_queue_init();
|
if (g_msg_queue)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
g_msg_queue = msg_queue_new(8);
|
||||||
|
retro_assert(g_msg_queue);
|
||||||
|
|
||||||
|
#ifdef HAVE_THREADS
|
||||||
|
runloop_msg_queue_lock = slock_new();
|
||||||
|
retro_assert(runloop_msg_queue_lock);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case RUNLOOP_CTL_MSG_QUEUE_LOCK:
|
||||||
|
#ifdef HAVE_THREADS
|
||||||
|
slock_lock(runloop_msg_queue_lock);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case RUNLOOP_CTL_MSG_QUEUE_UNLOCK:
|
||||||
|
#ifdef HAVE_THREADS
|
||||||
|
slock_unlock(runloop_msg_queue_lock);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case RUNLOOP_CTL_PREPARE_DUMMY:
|
case RUNLOOP_CTL_PREPARE_DUMMY:
|
||||||
{
|
{
|
||||||
|
@ -1087,7 +1077,7 @@ int rarch_main_iterate(unsigned *sleep_ms)
|
||||||
#ifdef HAVE_MENU
|
#ifdef HAVE_MENU
|
||||||
if (menu_driver_alive())
|
if (menu_driver_alive())
|
||||||
{
|
{
|
||||||
bool focused = check_focus(settings) && !ui_companion_is_on_foreground();
|
bool focused = runloop_ctl(RUNLOOP_CTL_CHECK_FOCUS, NULL) && !ui_companion_is_on_foreground();
|
||||||
bool is_idle = runloop_ctl(RUNLOOP_CTL_IS_IDLE, NULL);
|
bool is_idle = runloop_ctl(RUNLOOP_CTL_IS_IDLE, NULL);
|
||||||
|
|
||||||
if (menu_driver_iterate((enum menu_action)menu_input_frame_retropad(input, trigger_input)) == -1)
|
if (menu_driver_iterate((enum menu_action)menu_input_frame_retropad(input, trigger_input)) == -1)
|
||||||
|
|
|
@ -52,6 +52,7 @@ enum runloop_ctl_state
|
||||||
RUNLOOP_CTL_CLEAR_STATE,
|
RUNLOOP_CTL_CLEAR_STATE,
|
||||||
RUNLOOP_CTL_STATE_FREE,
|
RUNLOOP_CTL_STATE_FREE,
|
||||||
RUNLOOP_CTL_GLOBAL_FREE,
|
RUNLOOP_CTL_GLOBAL_FREE,
|
||||||
|
RUNLOOP_CTL_CHECK_FOCUS,
|
||||||
RUNLOOP_CTL_SET_CORE_SHUTDOWN,
|
RUNLOOP_CTL_SET_CORE_SHUTDOWN,
|
||||||
RUNLOOP_CTL_UNSET_CORE_SHUTDOWN,
|
RUNLOOP_CTL_UNSET_CORE_SHUTDOWN,
|
||||||
RUNLOOP_CTL_IS_CORE_SHUTDOWN,
|
RUNLOOP_CTL_IS_CORE_SHUTDOWN,
|
||||||
|
@ -78,6 +79,9 @@ enum runloop_ctl_state
|
||||||
/* Deinitializes message queue. */
|
/* Deinitializes message queue. */
|
||||||
RUNLOOP_CTL_MSG_QUEUE_DEINIT,
|
RUNLOOP_CTL_MSG_QUEUE_DEINIT,
|
||||||
/* Initializes dummy core. */
|
/* Initializes dummy core. */
|
||||||
|
RUNLOOP_CTL_MSG_QUEUE_LOCK,
|
||||||
|
RUNLOOP_CTL_MSG_QUEUE_UNLOCK,
|
||||||
|
RUNLOOP_CTL_MSG_QUEUE_FREE,
|
||||||
RUNLOOP_CTL_PREPARE_DUMMY
|
RUNLOOP_CTL_PREPARE_DUMMY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue