Wed, 15 Jul 2009 10:39:10 -0400
Merge branch 'v0.2'
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 | |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
8 | local EV_READ = luaevent.core.EV_READ |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
9 | local EV_WRITE = luaevent.core.EV_WRITE |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
10 | 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
|
11 | |
1a093a31059d
Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents:
15
diff
changeset
|
12 | local function addevent(...) |
1a093a31059d
Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents:
15
diff
changeset
|
13 | return base:addevent(...) |
15
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
14 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
15 | |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
16 | local function getWrapper() |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
17 | local running = coroutine.running() |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
18 | return function(...) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
19 | return select(2, coroutine.resume(running, ...)) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
20 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
21 | end |
17
1a093a31059d
Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents:
15
diff
changeset
|
22 | -- 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
|
23 | 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
|
24 | 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
|
25 | 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
|
26 | coroutine.yield(event) |
1a093a31059d
Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents:
15
diff
changeset
|
27 | end |
1a093a31059d
Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents:
15
diff
changeset
|
28 | |
15
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
29 | |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
30 | function send(sock, data, start, stop) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
31 | local s, err |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
32 | local from = start or 1 |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
33 | local sent = 0 |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
34 | repeat |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
35 | from = from + sent |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
36 | 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
|
37 | 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
|
38 | socketWait(sock, EV_WRITE) |
15
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
39 | until false |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
40 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
41 | function receive(sock, pattern, part) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
42 | local s, err |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
43 | pattern = pattern or '*l' |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
44 | repeat |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
45 | s, err, part = sock:receive(pattern, part) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
46 | 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
|
47 | socketWait(sock, EV_READ) |
15
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
48 | until false |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
49 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
50 | -- 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
|
51 | -- unblocks on any data received. |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
52 | function receivePartial(client, pattern) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
53 | local s, err, part |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
54 | pattern = pattern or "*l" |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
55 | repeat |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
56 | s, err, part = client:receive(pattern) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
57 | 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
|
58 | 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
|
59 | socketWait(sock, EV_READ) |
15
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
60 | until false |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
61 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
62 | function connect(sock, ...) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
63 | sock:settimeout(0) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
64 | local ret, err = sock:connect(...) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
65 | 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
|
66 | socketWait(sock, EV_WRITE) |
15
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
67 | ret, err = sock:connect(...) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
68 | if err == "already connected" then |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
69 | return 1 |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
70 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
71 | return ret, err |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
72 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
73 | -- Deprecated.. |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
74 | function flush(sock) |
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 | local function clientCoroutine(sock, handler) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
77 | -- Figure out what to do ...... |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
78 | return handler(sock) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
79 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
80 | local function handleClient(co, client, handler) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
81 | 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
|
82 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
83 | local function serverCoroutine(sock, callback) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
84 | local listenItem = addevent(sock, EV_READ, getWrapper()) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
85 | repeat |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
86 | local event = coroutine.yield(EV_READ) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
87 | -- Get new socket |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
88 | local client = sock:accept() |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
89 | if client then |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
90 | client:settimeout(0) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
91 | local co = coroutine.create(clientCoroutine) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
92 | handleClient(co, client, callback) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
93 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
94 | until false |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
95 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
96 | function addserver(sock, callback) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
97 | local coro = coroutine.create(serverCoroutine) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
98 | assert(coroutine.resume(coro, sock, callback)) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
99 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
100 | function addthread(func, ...) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
101 | return coroutine.resume(coroutine.create(func), ...) |
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 | local _skt_mt = {__index = { |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
104 | connect = function(self, ...) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
105 | return connect(self.socket, ...) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
106 | end, |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
107 | send = function (self, data) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
108 | return send(self.socket, data) |
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 | |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
111 | receive = function (self, pattern) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
112 | if (self.timeout==0) then |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
113 | return receivePartial(self.socket, pattern) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
114 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
115 | return receive(self.socket, pattern) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
116 | end, |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
117 | |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
118 | flush = function (self) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
119 | return flush(self.socket) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
120 | end, |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
121 | |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
122 | settimeout = function (self,time) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
123 | self.timeout=time |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
124 | return |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
125 | end, |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
126 | |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
127 | close = function(self) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
128 | clientTable[self.socket]:close() |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
129 | self.socket:close() |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
130 | end |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
131 | }} |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
132 | function wrap(sock) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
133 | return setmetatable({socket = sock}, _skt_mt) |
9b91d1bdbb40
Moved lua source into its own directory.
Thomas Harning Jr <harningt@gmail.com>
parents:
diff
changeset
|
134 | end |
17
1a093a31059d
Refactored luaevent.lua (unlearned borked fairness, collapsing useless code).
Thomas Harning Jr <harningt@gmail.com>
parents:
15
diff
changeset
|
135 | loop = function(...) base:loop(...) end |