Fix problem with GC'ing the object while in use
This commit is contained in:
parent
ba990c89a1
commit
eebc8a2dd3
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue