--- a/luaevent/luaevent.lua Sun Jun 10 16:52:55 2007 +0000 +++ b/luaevent/luaevent.lua Mon Jun 11 01:08:59 2007 +0000 @@ -9,18 +9,10 @@ local EV_WRITE = luaevent.core.EV_WRITE local fair = false --- Weak keys.. the keys are the client sockets -local clientTable = {} or setmetatable({}, {'__mode', 'k'}) +local hookedObjectMt = false -local function getWrapper() - local running = coroutine.running() - return function(...) - print(coroutine.running(), running) - print(debug.traceback()) - if coroutine.running() == running then return end - return select(2, coroutine.resume(running, ...)) - end -end +-- Weak keys.. the keys are the client sockets +local clientTable = setmetatable({}, {'__mode', 'k'}) function send(sock, data, start, stop) local s, err @@ -35,7 +27,6 @@ coroutine.yield(EV_WRITE) end if s or err ~= "timeout" then return s, err, sent end - if not clientTable[sock] then clientTable[sock] = luaevent.core.addevent(sock, EV_WRITE, getWrapper()) end coroutine.yield(EV_WRITE) until false end @@ -45,7 +36,6 @@ repeat s, err, part = sock:receive(pattern, part) if s or err ~= "timeout" then return s, err, part end - if not clientTable[sock] then clientTable[sock] = luaevent.core.addevent(sock, EV_READ, getWrapper()) end coroutine.yield(EV_READ) until false end @@ -58,7 +48,6 @@ s, err, part = client:receive(pattern) if s or ( (type(pattern)=="number") and part~="" and part ~=nil ) or err ~= "timeout" then return s, err, part end - if not clientTable[sock] then clientTable[sock] = luaevent.core.addevent(sock, EV_READ, getWrapper()) end coroutine.yield(EV_READ) until false end @@ -66,7 +55,6 @@ sock:settimeout(0) local ret, err = sock:connect(...) if ret or err ~= "timeout" then return ret, err end - if not clientTable[sock] then clientTable[sock] = luaevent.core.addevent(sock, EV_WRITE, getWrapper()) end coroutine.yield(EV_WRITE) ret, err = sock:connect(...) if err == "already connected" then @@ -81,28 +69,44 @@ -- Figure out what to do ...... return handler(sock) end -local function handleClient(co, client, handler) - local ok, res, event = coroutine.resume(co, client, handler) -end + local function serverCoroutine(sock, callback) - local listenItem = luaevent.core.addevent(sock, EV_READ, getWrapper()) repeat local event = coroutine.yield(EV_READ) -- Get new socket local client = sock:accept() if client then + --cl[#cl + 1] = client client:settimeout(0) - local co = coroutine.create(clientCoroutine) - handleClient(co, client, callback) + local coFunc = coroutine.wrap(clientCoroutine) + clientTable[client] = luaevent.core.addevent(client, coFunc, client, callback) end until false end + +local oldAddEvent = luaevent.core.addevent +luaevent.core.addevent = function(...) + local item = oldAddEvent(...) + print("SETUP ITEM FOR: ", debug.getmetatable(item).getfd(item)) + if not hookedObjectMt then + hookedObjectMt = true + local mt = debug.getmetatable(item) + local oldGC = mt.__gc + mt.__gc = function(...) + print("RELEASING ITEM FOR: ", mt.getfd(...)) + return oldGC(...) + end + end + return item +end + function addserver(sock, callback) - local coro = coroutine.create(serverCoroutine) - assert(coroutine.resume(coro, sock, callback)) + local coFunc = coroutine.wrap(serverCoroutine) + clientTable[sock] = luaevent.core.addevent(sock, coFunc, sock, callback) end -function addthread(func, ...) - return coroutine.resume(coroutine.create(func), ...) +function addthread(sock, func, ...) + local coFunc = coroutine.wrap(func) + clientTable[sock] = luaevent.core.addevent(sock, coFunc, ...) end local _skt_mt = {__index = { connect = function(self, ...)