Fix problem with GC'ing the object while in use

This commit is contained in:
Philip Gladstone 2024-04-25 20:26:05 -04:00
parent ba990c89a1
commit eebc8a2dd3
1 changed files with 14 additions and 0 deletions

View File

@ -52,6 +52,7 @@ typedef struct {
state_t state;
bool open;
int character_ref;
int self_ref; // to prevent GC at bad moments.
int callback[CALLBACK_COUNT];
esp_timer_handle_t timer_handle;
int8_t task_queued;
@ -347,6 +348,11 @@ static int lmatrix_setup( lua_State* L )
luaL_getmetatable(L, "matrix.keyboard");
lua_setmetatable(L, -2);
// create a self_ref to prevent GC
lua_pushvalue(L, -1);
d->self_ref = luaL_ref(L, LUA_REGISTRYINDEX);
d->columns = (uint8_t *) (d + 1);
d->rows = d->columns + columns;
d->column_count = columns;
@ -395,6 +401,10 @@ static int lmatrix_close( lua_State* L )
esp_timer_delete(d->timer_handle);
luaL_unref(L, LUA_REGISTRYINDEX, d->character_ref);
if (!HAS_QUEUED_DATA(d)) {
luaL_unref(L, LUA_REGISTRYINDEX, d->self_ref);
}
d->open = false;
}
return 0;
@ -484,6 +494,10 @@ static void lmatrix_task(task_param_t param, task_prio_t prio)
if (need_to_post) {
// If there is pending stuff, queue another task
task_post_medium(tasknumber, param);
} else if (d) {
if (!d->open) {
luaL_unref(L, LUA_REGISTRYINDEX, d->self_ref);
}
}
}