Update main loop to fix reentrancy runtime errors
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user