mirror of https://github.com/bjornbytes/lovr.git
Fix crash on repeated calls to Channel:peek;
This commit is contained in:
parent
5382bc3379
commit
aa56cbc7b0
|
@ -57,8 +57,8 @@ int luax_pushvariant(lua_State* L, Variant* variant) {
|
||||||
case TYPE_NIL: lua_pushnil(L); return 1;
|
case TYPE_NIL: lua_pushnil(L); return 1;
|
||||||
case TYPE_BOOLEAN: lua_pushboolean(L, variant->value.boolean); return 1;
|
case TYPE_BOOLEAN: lua_pushboolean(L, variant->value.boolean); return 1;
|
||||||
case TYPE_NUMBER: lua_pushnumber(L, variant->value.number); return 1;
|
case TYPE_NUMBER: lua_pushnumber(L, variant->value.number); return 1;
|
||||||
case TYPE_STRING: lua_pushstring(L, variant->value.string); free(variant->value.string); return 1;
|
case TYPE_STRING: lua_pushstring(L, variant->value.string); return 1;
|
||||||
case TYPE_OBJECT: luax_pushobject(L, variant->value.ref); lovrRelease(variant->value.ref); return 1;
|
case TYPE_OBJECT: luax_pushobject(L, variant->value.ref); return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +109,9 @@ static int nextEvent(lua_State* L) {
|
||||||
|
|
||||||
case EVENT_CUSTOM:
|
case EVENT_CUSTOM:
|
||||||
for (int i = 0; i < event.data.custom.count; i++) {
|
for (int i = 0; i < event.data.custom.count; i++) {
|
||||||
luax_pushvariant(L, &event.data.custom.data[i]);
|
Variant* variant = &event.data.custom.data[i];
|
||||||
|
luax_pushvariant(L, variant);
|
||||||
|
lovrVariantDestroy(variant);
|
||||||
}
|
}
|
||||||
return event.data.custom.count + 1;
|
return event.data.custom.count + 1;
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,9 @@ int l_lovrChannelPop(lua_State* L) {
|
||||||
Channel* channel = luax_checktype(L, 1, Channel);
|
Channel* channel = luax_checktype(L, 1, Channel);
|
||||||
luax_checktimeout(L, 2, &timeout);
|
luax_checktimeout(L, 2, &timeout);
|
||||||
if (lovrChannelPop(channel, &variant, timeout)) {
|
if (lovrChannelPop(channel, &variant, timeout)) {
|
||||||
return luax_pushvariant(L, &variant);
|
luax_pushvariant(L, &variant);
|
||||||
|
lovrVariantDestroy(&variant);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
lua_pushnil(L);
|
lua_pushnil(L);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -5,6 +5,14 @@
|
||||||
|
|
||||||
static EventState state;
|
static EventState state;
|
||||||
|
|
||||||
|
void lovrVariantDestroy(Variant* variant) {
|
||||||
|
switch (variant->type) {
|
||||||
|
case TYPE_STRING: free(variant->value.string); return;
|
||||||
|
case TYPE_OBJECT: lovrRelease(variant->value.ref); return;
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool lovrEventInit() {
|
bool lovrEventInit() {
|
||||||
if (state.initialized) return false;
|
if (state.initialized) return false;
|
||||||
vec_init(&state.pumps);
|
vec_init(&state.pumps);
|
||||||
|
|
|
@ -90,6 +90,8 @@ typedef struct {
|
||||||
vec_event_t events;
|
vec_event_t events;
|
||||||
} EventState;
|
} EventState;
|
||||||
|
|
||||||
|
void lovrVariantDestroy(Variant* variant);
|
||||||
|
|
||||||
bool lovrEventInit();
|
bool lovrEventInit();
|
||||||
void lovrEventDestroy();
|
void lovrEventDestroy();
|
||||||
void lovrEventAddPump(EventPump pump);
|
void lovrEventAddPump(EventPump pump);
|
||||||
|
|
Loading…
Reference in New Issue