Skip to content

Commit db72e70

Browse files
committed
rg_system: Add timeout parameter to the task messaging functions
1 parent a5cb191 commit db72e70

File tree

6 files changed

+37
-31
lines changed

6 files changed

+37
-31
lines changed

components/retro-go/rg_display.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ static void display_task(void *arg)
347347
{
348348
rg_task_msg_t msg;
349349

350-
while (rg_task_peek(&msg))
350+
while (rg_task_peek(&msg, -1))
351351
{
352352
// Received a shutdown request!
353353
if (msg.type == RG_TASK_MSG_STOP)
@@ -369,7 +369,7 @@ static void display_task(void *arg)
369369

370370
write_update(msg.dataPtr);
371371
// draw_on_screen_display(0, display.screen.height);
372-
rg_task_receive(&msg);
372+
rg_task_receive(&msg, -1);
373373

374374
lcd_sync();
375375
}
@@ -504,7 +504,7 @@ void rg_display_submit(const rg_surface_t *update, uint32_t flags)
504504
display.changed = true;
505505
}
506506

507-
rg_task_send(display_task_queue, &(rg_task_msg_t){.dataPtr = update});
507+
rg_task_send(display_task_queue, &(rg_task_msg_t){.dataPtr = update}, -1);
508508

509509
counters.blockTime += rg_system_timer() - time_start;
510510
counters.totalFrames++;
@@ -615,7 +615,7 @@ void rg_display_clear(uint16_t color_le)
615615

616616
void rg_display_deinit(void)
617617
{
618-
rg_task_send(display_task_queue, &(rg_task_msg_t){.type = RG_TASK_MSG_STOP});
618+
rg_task_send(display_task_queue, &(rg_task_msg_t){.type = RG_TASK_MSG_STOP}, -1);
619619
// lcd_set_backlight(0);
620620
lcd_deinit();
621621
RG_LOGI("Display terminated.\n");

components/retro-go/rg_system.c

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -491,12 +491,6 @@ rg_app_t *rg_system_init(const rg_config_t *config)
491491
app.sampleRate = config->sampleRate;
492492
app.tickRate = config->frameRate;
493493
// app.frameskip = config->frameSkip;
494-
if (config->mallocAlwaysInternal > 0)
495-
{
496-
#ifdef ESP_PLATFORM
497-
heap_caps_malloc_extmem_enable(config->mallocAlwaysInternal);
498-
#endif
499-
}
500494
if (config->storageRequired && !rg_storage_ready())
501495
{
502496
rg_display_clear(C_SKY_BLUE);
@@ -506,6 +500,13 @@ rg_app_t *rg_system_init(const rg_config_t *config)
506500
if (config->romRequired && !app.romPath && !*app.romPath)
507501
{
508502
// show rom picking dialog
503+
// app.romPath = rg_gui_file_picker(_("Choose ROM"), RG_BASE_PATH_ROMS, NULL, true, false);
504+
}
505+
if (config->mallocAlwaysInternal > 0)
506+
{
507+
#ifdef ESP_PLATFORM
508+
heap_caps_malloc_extmem_enable(config->mallocAlwaysInternal);
509+
#endif
509510
}
510511
app.isLauncher = config->isLauncher;
511512
app.handlers = config->handlers;
@@ -641,11 +642,12 @@ rg_task_t *rg_task_current(void)
641642
return NULL;
642643
}
643644

644-
bool rg_task_send(rg_task_t *task, const rg_task_msg_t *msg)
645+
bool rg_task_send(rg_task_t *task, const rg_task_msg_t *msg, int timeoutMS)
645646
{
646647
RG_ASSERT_ARG(task && msg);
647648
#if defined(ESP_PLATFORM)
648-
return xQueueSend(task->queue, msg, portMAX_DELAY) == pdTRUE;
649+
TickType_t timeout = timeoutMS < 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeoutMS);
650+
return xQueueSend(task->queue, msg, timeout) == pdTRUE;
649651
#elif defined(RG_TARGET_SDL2)
650652
while (task->msgWaiting > 0)
651653
continue;
@@ -655,15 +657,16 @@ bool rg_task_send(rg_task_t *task, const rg_task_msg_t *msg)
655657
#endif
656658
}
657659

658-
bool rg_task_peek(rg_task_msg_t *out)
660+
bool rg_task_peek(rg_task_msg_t *out, int timeoutMS)
659661
{
660662
rg_task_t *task = rg_task_current();
661663
bool success = false;
662664
if (!task || !out)
663665
return false;
664666
// task->blocked = true;
665667
#if defined(ESP_PLATFORM)
666-
success = xQueuePeek(task->queue, out, portMAX_DELAY) == pdTRUE;
668+
TickType_t timeout = timeoutMS < 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeoutMS);
669+
success = xQueuePeek(task->queue, out, timeout) == pdTRUE;
667670
#elif defined(RG_TARGET_SDL2)
668671
while (task->msgWaiting < 1)
669672
continue;
@@ -673,15 +676,16 @@ bool rg_task_peek(rg_task_msg_t *out)
673676
return success;
674677
}
675678

676-
bool rg_task_receive(rg_task_msg_t *out)
679+
bool rg_task_receive(rg_task_msg_t *out, int timeoutMS)
677680
{
678681
rg_task_t *task = rg_task_current();
679682
bool success = false;
680683
if (!task || !out)
681684
return false;
682685
// task->blocked = true;
683686
#if defined(ESP_PLATFORM)
684-
success = xQueueReceive(task->queue, out, portMAX_DELAY) == pdTRUE;
687+
TickType_t timeout = timeoutMS < 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeoutMS);
688+
success = xQueueReceive(task->queue, out, timeout) == pdTRUE;
685689
#elif defined(RG_TARGET_SDL2)
686690
while (task->msgWaiting < 1)
687691
continue;
@@ -759,7 +763,7 @@ bool rg_mutex_take(rg_mutex_t *mutex, int timeoutMS)
759763
{
760764
RG_ASSERT_ARG(mutex);
761765
#if defined(ESP_PLATFORM)
762-
int timeout = timeoutMS >= 0 ? pdMS_TO_TICKS(timeoutMS) : portMAX_DELAY;
766+
int timeout = timeoutMS < 0 ? portMAX_DELAY : pdMS_TO_TICKS(timeoutMS);
763767
return xSemaphoreTake((QueueHandle_t)mutex, timeout) == pdPASS;
764768
#elif defined(RG_TARGET_SDL2)
765769
return SDL_LockMutex((SDL_mutex *)mutex) == 0;

components/retro-go/rg_system.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ typedef struct
255255
rg_task_t *rg_task_create(const char *name, void (*taskFunc)(void *arg), void *arg, size_t stackSize, int priority, int affinity);
256256
rg_task_t *rg_task_find(const char *name);
257257
rg_task_t *rg_task_current(void);
258-
bool rg_task_send(rg_task_t *task, const rg_task_msg_t *msg);
259-
bool rg_task_peek(rg_task_msg_t *out);
260-
bool rg_task_receive(rg_task_msg_t *out);
258+
bool rg_task_send(rg_task_t *task, const rg_task_msg_t *msg, int timeoutMS);
259+
bool rg_task_peek(rg_task_msg_t *out, int timeoutMS);
260+
bool rg_task_receive(rg_task_msg_t *out, int timeoutMS);
261261
bool rg_task_is_blocked(rg_task_t *task);
262262
size_t rg_task_messages_waiting(rg_task_t *task);
263263
// The main difference between rg_task_delay and rg_usleep is that rg_task_delay will yield

fmsx/main/main.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,8 @@ unsigned int GetFreeAudio(void)
335335
void PlayAllSound(int uSec)
336336
{
337337
int64_t start = rg_system_timer();
338-
unsigned int samples = 2 * uSec * AUDIO_SAMPLE_RATE / 1000000;
339-
rg_task_send(audioQueue, &(rg_task_msg_t){.dataInt = samples});
338+
rg_task_msg_t msg = {.dataInt = 2 * uSec * AUDIO_SAMPLE_RATE / 1000000};
339+
rg_task_send(audioQueue, &msg, -1);
340340
FrameStartTime += rg_system_timer() - start;
341341
}
342342

@@ -403,10 +403,10 @@ static void audioTask(void *arg)
403403
{
404404
RG_LOGI("task started");
405405
rg_task_msg_t msg;
406-
while (rg_task_peek(&msg))
406+
while (rg_task_peek(&msg, -1))
407407
{
408408
RenderAndPlayAudio(msg.dataInt);
409-
rg_task_receive(&msg);
409+
rg_task_receive(&msg, -1);
410410
}
411411
}
412412

gwenesis/main/main.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ static rg_gui_event_t core1_sound_update_cb(rg_gui_option_t *option, rg_gui_even
218218
static void core1_task(void *arg)
219219
{
220220
rg_task_msg_t msg;
221-
while (rg_task_receive(&msg))
221+
while (rg_task_receive(&msg, -1))
222222
{
223223
switch (msg.type)
224224
{
@@ -391,7 +391,8 @@ void app_main(void)
391391
if (GWENESIS_AUDIO_ACCURATE == 0) {
392392
if (core1_task_sound)
393393
{
394-
rg_task_send(core1_task_handle, &(rg_task_msg_t){.type = 2, .dataInt = system_clock + VDP_CYCLES_PER_LINE});
394+
rg_task_msg_t msg = {.type = 2, .dataInt = system_clock + VDP_CYCLES_PER_LINE};
395+
rg_task_send(core1_task_handle, &msg, -1);
395396
}
396397
else
397398
{
@@ -404,7 +405,7 @@ void app_main(void)
404405
if (drawFrame && scan_line < screen_height)
405406
{
406407
if (core1_task_rendering)
407-
rg_task_send(core1_task_handle, &(rg_task_msg_t){.type = 1, .dataInt = scan_line});
408+
rg_task_send(core1_task_handle, &(rg_task_msg_t){.type = 1, .dataInt = scan_line}, -1);
408409
else
409410
gwenesis_vdp_render_line(scan_line); /* render scan_line */
410411
}
@@ -448,8 +449,9 @@ void app_main(void)
448449
// Make sure all our previous messages have been processed before we continue
449450
if (core1_task_rendering || core1_task_sound)
450451
{
451-
rg_task_send(core1_task_handle, &(rg_task_msg_t){0});
452-
rg_task_send(core1_task_handle, &(rg_task_msg_t){0});
452+
const rg_task_msg_t msg = {0};
453+
rg_task_send(core1_task_handle, &msg, -1);
454+
rg_task_send(core1_task_handle, &msg, -1);
453455
}
454456

455457
/* Audio

snes9x/main/main_snes.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ static void audio_task(void *arg)
312312
rg_audio_sample_t *audioBuffer = rg_alloc(AUDIO_BUFFER_LENGTH * 4, MEM_FAST);
313313
rg_task_msg_t msg;
314314
bool zeroed = false;
315-
while (rg_task_receive(&msg))
315+
while (rg_task_receive(&msg, -1))
316316
{
317317
if (msg.type == RG_TASK_MSG_STOP)
318318
break;
@@ -491,7 +491,7 @@ void app_main(void)
491491
rg_system_tick(rg_system_timer() - startTime);
492492
rg_task_msg_t msg = {.type = (int)sound_enabled, .dataInt = samples};
493493
if (sound_enabled || app->frameTime - (rg_system_timer() - startTime) > 2000)
494-
rg_task_send(audio_task_handle, &msg);
494+
rg_task_send(audio_task_handle, &msg, -1);
495495
#else
496496
if (sound_enabled && lowpass_filter)
497497
S9xMixSamplesLowPass((int16_t *)audioBuffer, samples << 1, AUDIO_LOW_PASS_RANGE);

0 commit comments

Comments
 (0)