Update main loop to fix reentrancy runtime errors

This commit is contained in:
Alexsander Akers
2022-01-26 20:24:15 -05:00
parent a0f8e9c8bc
commit cb8223217b
7 changed files with 124 additions and 41 deletions

View File

@@ -23,15 +23,16 @@
*/
#include "watch_rtc.h"
#include "watch_main_loop.h"
#include <emscripten.h>
#include <emscripten/html5.h>
static double time_offset = 0;
static long tick_callbacks[8];
static long tick_callbacks[8] = { -1, -1, -1, -1, -1, -1, -1, -1 };
static long alarm_interval_id;
static long alarm_timeout_id;
static long alarm_interval_id = -1;
static long alarm_timeout_id = -1;
static double alarm_interval;
ext_irq_cb_t alarm_callback;
ext_irq_cb_t btn_alarm_callback;
@@ -83,8 +84,6 @@ void watch_rtc_disable_tick_callback(void) {
static void watch_invoke_periodic_callback(void *userData) {
ext_irq_cb_t callback = userData;
callback();
void resume_main_loop(void);
resume_main_loop();
}
@@ -100,32 +99,34 @@ void watch_rtc_register_periodic_callback(ext_irq_cb_t callback, uint8_t frequen
// this also maps nicely to an index for our list of tick callbacks.
double interval = 1000 / frequency; // in msec
if (tick_callbacks[per_n] != -1) emscripten_clear_interval(tick_callbacks[per_n]);
tick_callbacks[per_n] = emscripten_set_interval(watch_invoke_periodic_callback, interval, (void *)callback);
}
void watch_rtc_disable_periodic_callback(uint8_t frequency) {
if (__builtin_popcount(frequency) != 1) return;
uint8_t per_n = __builtin_clz(frequency << 24);
emscripten_clear_interval(tick_callbacks[per_n]);
tick_callbacks[per_n] = 0;
if (tick_callbacks[per_n] != -1) {
emscripten_clear_interval(tick_callbacks[per_n]);
tick_callbacks[per_n] = -1;
}
}
void watch_rtc_disable_all_periodic_callbacks(void) {
for (int i = 0; i < 8; i++) {
if (tick_callbacks[i] != 0) {
if (tick_callbacks[i] != -1) {
emscripten_clear_interval(tick_callbacks[i]);
tick_callbacks[i] = 0;
tick_callbacks[i] = -1;
}
}
}
static void watch_invoke_alarm_interval_callback(void *userData) {
(void)userData;
if (alarm_callback) alarm_callback();
}
static void watch_invoke_alarm_callback(void *userData) {
(void)userData;
if (alarm_callback) alarm_callback();
alarm_interval_id = emscripten_set_interval(watch_invoke_alarm_interval_callback, alarm_interval, NULL);
}
@@ -182,14 +183,14 @@ void watch_rtc_disable_alarm_callback(void) {
alarm_callback = NULL;
alarm_interval = 0;
if (alarm_timeout_id) {
if (alarm_timeout_id != -1) {
emscripten_clear_timeout(alarm_timeout_id);
alarm_timeout_id = 0;
alarm_timeout_id = -1;
}
if (alarm_interval_id) {
if (alarm_interval_id != -1) {
emscripten_clear_interval(alarm_interval_id);
alarm_interval_id = 0;
alarm_interval_id = -1;
}
}