From 6b4a68e0e83882bb66b288533220a8514b841f2f Mon Sep 17 00:00:00 2001 From: Thomas Harning Jr Date: Sat, 1 Sep 2007 00:24:11 -0400 Subject: Refactored luaevent.lua (unlearned borked fairness, collapsing useless code). luaevent.lua: * Unlearned fairness since it was likely to be broken... fairness will need to be implemented at app-level where it should be. * Collapsed duplicate code into a local function testClient.lua: * Added a completion message (since the test was so quick I thought it was broken) --- lua/luaevent.lua | 52 +++++++++++++++------------------------------------- test/testClient.lua | 3 ++- 2 files changed, 17 insertions(+), 38 deletions(-) diff --git a/lua/luaevent.lua b/lua/luaevent.lua index ec9bc15..a05de29 100644 --- a/lua/luaevent.lua +++ b/lua/luaevent.lua @@ -7,37 +7,25 @@ require("luaevent.core") local EV_READ = luaevent.core.EV_READ local EV_WRITE = luaevent.core.EV_WRITE -local fair = false -- Not recommended for most cases... local base = luaevent.core.new() -local sockMap = setmetatable({}, {'__mode', 'kv'}) -local function addevent(sock, ...) - local item = base:addevent(sock, ...) - if not item then print("FAILED TO SETUP ITEM") return item end - local fd = sock:getfd() - sockMap[item] = fd - print("SETUP ITEM FOR: ", fd) - if not hookedObjectMt then - hookedObjectMt = true - --[[ - local mt = debug.getmetatable(item) - local oldGC = mt.__gc - mt.__gc = function(...) - print("RELEASING ITEM FOR: ", sockMap[(...)]) - return oldGC(...) - end]] - end - return item + +local function addevent(...) + return base:addevent(...) end --- Weak keys.. the keys are the client sockets -local clientTable = setmetatable({}, {'__mode', 'kv'}) local function getWrapper() local running = coroutine.running() return function(...) - 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', 'kv'}) +local function socketWait(sock, event) + if not clientTable[sock] then clientTable[sock] = addevent(sock, event, getWrapper()) end + coroutine.yield(event) +end + function send(sock, data, start, stop) local s, err @@ -46,15 +34,8 @@ function send(sock, data, start, stop) repeat from = from + sent s, err, sent = sock:send(data, from, stop) - -- Add extra coro swap for fairness - -- CURRENTLY DISABLED FOR TESTING...... - if fair and math.random(100) > 90 then - if not clientTable[sock] then clientTable[sock] = addevent(sock, EV_WRITE, getWrapper()) end - coroutine.yield(EV_WRITE) - end if s or err ~= "timeout" then return s, err, sent end - if not clientTable[sock] then clientTable[sock] = addevent(sock, EV_WRITE, getWrapper()) end - coroutine.yield(EV_WRITE) + socketWait(sock, EV_WRITE) until false end function receive(sock, pattern, part) @@ -63,8 +44,7 @@ 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] = addevent(sock, EV_READ, getWrapper()) end - coroutine.yield(EV_READ) + socketWait(sock, EV_READ) until false end -- same as above but with special treatment when reading chunks, @@ -76,16 +56,14 @@ 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] = addevent(sock, EV_READ, getWrapper()) end - coroutine.yield(EV_READ) + socketWait(sock, EV_READ) until false end 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] = addevent(sock, EV_WRITE, getWrapper()) end - coroutine.yield(EV_WRITE) + socketWait(sock, EV_WRITE) ret, err = sock:connect(...) if err == "already connected" then return 1 @@ -154,4 +132,4 @@ local _skt_mt = {__index = { function wrap(sock) return setmetatable({socket = sock}, _skt_mt) end -loop = function(...) base:loop(...) end \ No newline at end of file +loop = function(...) base:loop(...) end diff --git a/test/testClient.lua b/test/testClient.lua index fbbcf87..871207a 100644 --- a/test/testClient.lua +++ b/test/testClient.lua @@ -12,8 +12,9 @@ local function func() sock = luaevent.wrap(sock) print(assert(sock:connect("localhost", 20000))) for i = 1, 100 do assert(sock:send("Greet me ")) assert(sock:receive(10)) collectgarbage() end + print("COMPLETE") end luaevent.addthread(func) -luaevent.loop() \ No newline at end of file +luaevent.loop() -- cgit v1.2.3