lua/luaevent.lua

Sat, 15 Jan 2011 20:13:03 -0500

author
Thomas Harning Jr <harningt@gmail.com>
date
Sat, 15 Jan 2011 20:13:03 -0500
changeset 98
36ce9962277c
parent 80
73d56b9d00f5
child 106
f03fc4cde677
permissions
-rw-r--r--

lua: updates reported version details to reflect the mainline use

15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
1 --[[
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
2 LuaEvent - Copyright (C) 2007 Thomas Harning <harningt@gmail.com>
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
3 Licensed as LGPL - See doc/COPYING for details.
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
4 ]]
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
5 module("luaevent", package.seeall)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
6 require("luaevent.core")
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
7
98
36ce9962277c lua: updates reported version details to reflect the mainline use
Thomas Harning Jr <harningt@gmail.com>
parents: 80
diff changeset
8 _NAME = "luaevent";
36ce9962277c lua: updates reported version details to reflect the mainline use
Thomas Harning Jr <harningt@gmail.com>
parents: 80
diff changeset
9 _VERSION = "0.3.0";
70
004edb92a6e8 Add _NAME and _VERSION fields to module
Matthew Wild <mwild1@gmail.com>
parents: 17
diff changeset
10
15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
11 local EV_READ = luaevent.core.EV_READ
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
12 local EV_WRITE = luaevent.core.EV_WRITE
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
13 local base = luaevent.core.new()
17
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
14
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
15 local function addevent(...)
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
16 return base:addevent(...)
15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
17 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
18
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
19 local function getWrapper()
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
20 local running = coroutine.running()
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
21 return function(...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
22 return select(2, coroutine.resume(running, ...))
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
23 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
24 end
17
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
25 -- Weak keys.. the keys are the client sockets
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
26 local clientTable = setmetatable({}, {'__mode', 'kv'})
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
27 local function socketWait(sock, event)
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
28 if not clientTable[sock] then clientTable[sock] = addevent(sock, event, getWrapper()) end
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
29 coroutine.yield(event)
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
30 end
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
31
15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
32
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
33 function send(sock, data, start, stop)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
34 local s, err
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
35 local from = start or 1
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
36 local sent = 0
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
37 repeat
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
38 from = from + sent
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
39 s, err, sent = sock:send(data, from, stop)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
40 if s or err ~= "timeout" then return s, err, sent end
17
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
41 socketWait(sock, EV_WRITE)
15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
42 until false
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
43 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
44 function receive(sock, pattern, part)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
45 local s, err
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
46 pattern = pattern or '*l'
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
47 repeat
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
48 s, err, part = sock:receive(pattern, part)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
49 if s or err ~= "timeout" then return s, err, part end
17
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
50 socketWait(sock, EV_READ)
15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
51 until false
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
52 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
53 -- same as above but with special treatment when reading chunks,
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
54 -- unblocks on any data received.
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
55 function receivePartial(client, pattern)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
56 local s, err, part
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
57 pattern = pattern or "*l"
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
58 repeat
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
59 s, err, part = client:receive(pattern)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
60 if s or ( (type(pattern)=="number") and part~="" and part ~=nil ) or
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
61 err ~= "timeout" then return s, err, part end
17
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
62 socketWait(sock, EV_READ)
15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
63 until false
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
64 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
65 function connect(sock, ...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
66 sock:settimeout(0)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
67 local ret, err = sock:connect(...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
68 if ret or err ~= "timeout" then return ret, err end
17
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
69 socketWait(sock, EV_WRITE)
15
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
70 ret, err = sock:connect(...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
71 if err == "already connected" then
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
72 return 1
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
73 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
74 return ret, err
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
75 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
76 -- Deprecated..
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
77 function flush(sock)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
78 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
79 local function clientCoroutine(sock, handler)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
80 -- Figure out what to do ......
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
81 return handler(sock)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
82 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
83 local function handleClient(co, client, handler)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
84 local ok, res, event = coroutine.resume(co, client, handler)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
85 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
86 local function serverCoroutine(sock, callback)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
87 local listenItem = addevent(sock, EV_READ, getWrapper())
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
88 repeat
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
89 local event = coroutine.yield(EV_READ)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
90 -- Get new socket
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
91 local client = sock:accept()
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
92 if client then
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
93 client:settimeout(0)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
94 local co = coroutine.create(clientCoroutine)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
95 handleClient(co, client, callback)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
96 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
97 until false
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
98 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
99 function addserver(sock, callback)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
100 local coro = coroutine.create(serverCoroutine)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
101 assert(coroutine.resume(coro, sock, callback))
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
102 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
103 function addthread(func, ...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
104 return coroutine.resume(coroutine.create(func), ...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
105 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
106 local _skt_mt = {__index = {
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
107 connect = function(self, ...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
108 return connect(self.socket, ...)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
109 end,
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
110 send = function (self, data)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
111 return send(self.socket, data)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
112 end,
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
113
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
114 receive = function (self, pattern)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
115 if (self.timeout==0) then
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
116 return receivePartial(self.socket, pattern)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
117 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
118 return receive(self.socket, pattern)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
119 end,
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
120
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
121 flush = function (self)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
122 return flush(self.socket)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
123 end,
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
124
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
125 settimeout = function (self,time)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
126 self.timeout=time
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
127 return
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
128 end,
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
129
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
130 close = function(self)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
131 clientTable[self.socket]:close()
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
132 self.socket:close()
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
133 end
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
134 }}
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
135 function wrap(sock)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
136 return setmetatable({socket = sock}, _skt_mt)
9b91d1bdbb40 Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff changeset
137 end
17
1a093a31059d Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents: 15
diff changeset
138 loop = function(...) base:loop(...) end

mercurial