luaevent/luaevent.lua

changeset 2
01b3a96ae760
parent 1
31c782cfe7fe
child 3
5999243fab1d
--- 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, ...)

mercurial