more thread-awareness in task callbacks (#14337)

* more thread-awareness in task callbacks
This commit is contained in:
Jamiras 2022-08-23 07:11:11 -06:00 committed by GitHub
parent 6f738d4fbd
commit 85c44f9245
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 34 additions and 35 deletions

View File

@ -215,9 +215,6 @@ void gfx_widgets_msg_queue_push(
msg_widget = (disp_widget_msg_t*)malloc(sizeof(*msg_widget));
if (task)
title = task->title;
msg_widget->msg = NULL;
msg_widget->msg_new = NULL;
msg_widget->msg_transition_animation = 0.0f;
@ -237,7 +234,6 @@ void gfx_widgets_msg_queue_push(
msg_widget->expiration_timer_started = false;
msg_widget->task_ptr = task;
msg_widget->task_title_ptr = NULL;
msg_widget->task_count = 0;
msg_widget->task_progress = 0;
@ -262,7 +258,7 @@ void gfx_widgets_msg_queue_push(
if (task)
{
msg_widget->msg = strdup(title);
title = msg_widget->msg = strdup(task->title);
msg_widget->msg_new = strdup(title);
msg_widget->msg_len = (unsigned)strlen(title);
@ -271,7 +267,6 @@ void gfx_widgets_msg_queue_push(
msg_widget->task_finished = task->finished;
msg_widget->task_progress = task->progress;
msg_widget->task_ident = task->ident;
msg_widget->task_title_ptr = task->title;
msg_widget->task_count = 1;
msg_widget->unfolded = true;
@ -351,12 +346,7 @@ void gfx_widgets_msg_queue_push(
if (!string_is_equal(task->title, msg_widget->msg_new))
{
unsigned len = (unsigned)strlen(task->title);
unsigned new_width = font_driver_get_message_width(
p_dispwidget->gfx_widget_fonts.msg_queue.font,
task->title,
len,
1);
unsigned len, new_width;
if (msg_widget->msg_new)
{
@ -364,9 +354,16 @@ void gfx_widgets_msg_queue_push(
msg_widget->msg_new = NULL;
}
msg_widget->msg_new = strdup(task->title);
title = msg_widget->msg_new = strdup(task->title);
len = (unsigned)strlen(title);
new_width = font_driver_get_message_width(
p_dispwidget->gfx_widget_fonts.msg_queue.font,
title,
len,
1);
msg_widget->msg_len = len;
msg_widget->task_title_ptr = task->title;
msg_widget->msg_transition_animation = 0;
if (!task->alternative_look)

View File

@ -115,8 +115,6 @@ typedef struct disp_widget_msg
char *msg;
char *msg_new;
retro_task_t *task_ptr;
/* Used to detect title change */
char *task_title_ptr;
uint32_t task_ident;
unsigned msg_len;

View File

@ -91,6 +91,13 @@ static void task_queue_msg_push(retro_task_t *task,
static void task_queue_push_progress(retro_task_t *task)
{
#ifdef HAVE_THREADS
/* msg_push callback interacts directly with the task properties (particularly title).
* make sure another thread doesn't modify them while rendering
*/
slock_lock(property_lock);
#endif
if (task->title && !task->mute)
{
if (task->finished)
@ -113,6 +120,10 @@ static void task_queue_push_progress(retro_task_t *task)
if (task->progress_cb)
task->progress_cb(task);
}
#ifdef HAVE_THREADS
slock_unlock(property_lock);
#endif
}
static void task_queue_put(task_queue_t *queue, retro_task_t *task)
@ -392,7 +403,6 @@ static void retro_task_threaded_gather(void)
{
retro_task_t *task = NULL;
slock_lock(property_lock);
slock_lock(running_lock);
for (task = tasks_running.front; task; task = task->next)
task_queue_push_progress(task);
@ -401,7 +411,6 @@ static void retro_task_threaded_gather(void)
slock_lock(finished_lock);
retro_task_internal_gather();
slock_unlock(finished_lock);
slock_unlock(property_lock);
}
static void retro_task_threaded_wait(retro_task_condition_fn_t cond, void* data)

View File

@ -576,14 +576,8 @@ void cb_http_task_core_updater_download(
if (!(download_handle = (core_updater_download_handle_t*)transf->user_data))
goto finish;
/* Update download_handle task status
* NOTE: We set decompress_task_complete = true
* here to prevent any lock-ups in the event
* of errors (or lack of decompression support).
* decompress_task_complete will be set false
* if/when we actually call task_push_decompress() */
/* Update download_handle task status */
download_handle->http_task_complete = true;
download_handle->decompress_task_complete = true;
/* Create output directory, if required */
strlcpy(output_dir, transf->path, sizeof(output_dir));
@ -634,8 +628,6 @@ void cb_http_task_core_updater_download(
err = msg_hash_to_str(MSG_DECOMPRESSION_FAILED);
goto finish;
}
download_handle->decompress_task_complete = false;
}
#endif
@ -647,6 +639,10 @@ finish:
if (transf)
free(transf);
/* if no decompress task was queued, mark it as completed */
if (!download_handle->decompress_task)
download_handle->decompress_task_complete = true;
}
static void free_core_updater_download_handle(core_updater_download_handle_t *download_handle)
@ -893,13 +889,12 @@ static void task_core_updater_download_handler(retro_task_t *task)
case CORE_UPDATER_DOWNLOAD_WAIT_DECOMPRESS:
{
/* If decompression task is NULL, then it either
* finished or an error occurred - in either case,
* just move on to the next state */
if (!download_handle->decompress_task)
download_handle->decompress_task_complete = true;
/* Otherwise, check if decompression task is still
* running */
else if (!download_handle->decompress_task_finished)
* hasn't been queued by the download task yet,
* or an error occurred. The latter should set
* the decompress_task_complete flag and we'll
* continue to the next state */
if (download_handle->decompress_task &&
!download_handle->decompress_task_finished)
{
download_handle->decompress_task_finished =
task_get_finished(download_handle->decompress_task);

View File

@ -290,7 +290,7 @@ void *task_push_decompress(
if (!(s = (decompress_state_t*)calloc(1, sizeof(*s))))
return NULL;
if (!(t = (retro_task_t*)calloc(1, sizeof(*t))))
if (!(t = task_init()))
{
free(s);
return NULL;