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