# HG changeset patch # User Thomas Harning Jr # Date 1189051555 14400 # Node ID 5778073d290381c7a5875318f99171a75605a0f9 # Parent cda8e1a2dfa2647d64447e1621a44a6e9da27504 Added timertest. Prevented GC-ed events from causing an abort. diff -r cda8e1a2dfa2 -r 5778073d2903 src/event_callback.c --- a/src/event_callback.c Wed Sep 05 23:35:31 2007 -0400 +++ b/src/event_callback.c Thu Sep 06 00:05:55 2007 -0400 @@ -23,7 +23,13 @@ lua_State* L; int ret; double newTimeout = -1; - assert(cb && cb->base && cb->base->loop_L); + assert(cb); + if(!cb->base) { + /* Callback has been collected... die */ + /* TODO: What should really be done here... */ + return; + } + assert(cb->base->loop_L); L = cb->base->loop_L; lua_rawgeti(L, LUA_REGISTRYINDEX, cb->callbackRef); lua_pushinteger(L, event); diff -r cda8e1a2dfa2 -r 5778073d2903 test/timertest.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/timertest.lua Thu Sep 06 00:05:55 2007 -0400 @@ -0,0 +1,19 @@ +require("luaevent.core") + +c = luaevent.core.new() +local f = 100 +local function createEvent() + return c:addevent(nil, luaevent.core.EV_TIMEOUT, function(ev) io.write(".." .. f) f = f - 1 if f < 0 then return -1 end collectgarbage() end, 0.01) +end +ev = createEvent() +print("TESTING Garbage-collect-safe version") +c:loop() +assert(f < 0, "DID NOT FINISH LOOPING") +io.write("\n") +print("TESTING Garbage-collect unsafe version") +f = 100 +createEvent() +c:loop() +assert(f >= 0, "Did not perform expected collection") +io.write("\n") +print("Completed both tests")