diff options
Diffstat (limited to 'luaevent/luaevent.lua')
-rw-r--r-- | luaevent/luaevent.lua | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/luaevent/luaevent.lua b/luaevent/luaevent.lua index 3b8ed18..be7f296 100644 --- a/luaevent/luaevent.lua +++ b/luaevent/luaevent.lua @@ -9,18 +9,10 @@ local EV_READ = luaevent.core.EV_READ 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 @@ function send(sock, data, start, stop) 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 @@ function receive(sock, pattern, part) 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 @@ function receivePartial(client, pattern) 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 @@ function connect(sock, ...) 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 @@ local function clientCoroutine(sock, handler) -- 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, ...) |