Mercurial > prosody-hg
annotate net/server_epoll.lua @ 9340:368b092bf4bf
mod_storage_memory: Fix saving of remaining items during deletion
All data is compiled into functions that return new copies in order to
prevent mutation of stored data.
This has downsides.
Also an ugly hack.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 22 Sep 2018 16:03:50 +0200 |
| parents | 146dc1e4c7ff |
| children | 80be543a3785 |
| rev | line source |
|---|---|
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 -- Prosody IM |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 -- Copyright (C) 2016 Kim Alvefur |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 -- |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 -- This project is MIT/X11 licensed. Please see the |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 -- COPYING file in the source package for more information. |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 -- |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 local t_sort = table.sort; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 local t_insert = table.insert; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 local t_remove = table.remove; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 local t_concat = table.concat; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 local setmetatable = setmetatable; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 local tostring = tostring; |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
15 local pcall = pcall; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
16 local type = type; |
|
7797
d0c32d86724f
server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents:
7796
diff
changeset
|
17 local next = next; |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
18 local pairs = pairs; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 local log = require "util.logger".init("server_epoll"); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 local socket = require "socket"; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 local luasec = require "ssl"; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 local gettime = require "util.time".now; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 local createtable = require "util.table".create; |
|
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
24 local _SOCKETINVALID = socket._SOCKETINVALID or -1; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
26 local poll = require "util.poll".new(); |
|
7601
ce20546d7714
net.server_epoll: Make sure a recent LuaSocket is avaliable
Kim Alvefur <zash@zash.se>
parents:
7600
diff
changeset
|
27 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 local _ENV = nil; |
|
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
8552
diff
changeset
|
29 -- luacheck: std none |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
31 local default_config = { __index = { |
|
8983
23f66f04e216
net.server: Set default read timeout to 14 minutes (fixes #971)
Kim Alvefur <zash@zash.se>
parents:
8781
diff
changeset
|
32 read_timeout = 14 * 60; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 write_timeout = 7; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 tcp_backlog = 128; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 accept_retry_interval = 10; |
|
7560
785fa1138293
net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents:
7559
diff
changeset
|
36 read_retry_delay = 1e-06; |
|
9311
9b0604fe01f1
net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents:
9310
diff
changeset
|
37 read_size = 8192; |
|
7599
afbda0bd9cfc
net.server_epoll: Add separate timout for initial connection
Kim Alvefur <zash@zash.se>
parents:
7598
diff
changeset
|
38 connect_timeout = 20; |
|
7598
335b5ce06062
net.server_epoll: TLS handshake timeout
Kim Alvefur <zash@zash.se>
parents:
7597
diff
changeset
|
39 handshake_timeout = 60; |
|
7623
a1c040a5754f
net.server_epoll: Make maximum wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7606
diff
changeset
|
40 max_wait = 86400; |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
41 min_wait = 1e-06; |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
42 }}; |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
43 local cfg = default_config.__index; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 local fds = createtable(10, 0); -- FD -> conn |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
46 |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
47 -- Timer and scheduling -- |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
48 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 local timers = {}; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 local function noop() end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 local function closetimer(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 t[1] = 0; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 t[2] = noop; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
57 -- Set to true when timers have changed |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 local resort_timers = false; |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
59 |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
60 -- Add absolute timer |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 local function at(time, f) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 local timer = { time, f, close = closetimer }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 t_insert(timers, timer); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 return timer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 end |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
67 |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
68 -- Add relative timer |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 local function addtimer(timeout, f) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 return at(gettime() + timeout, f); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
73 -- Run callbacks of expired timers |
|
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
74 -- Return time until next timeout |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
75 local function runtimers(next_delay, min_wait) |
|
7629
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
76 -- Any timers at all? |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
77 if not timers[1] then |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
78 return next_delay; |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
79 end |
|
0fcde9869cc1
net.server_epoll: Return early in the event of zero timers
Kim Alvefur <zash@zash.se>
parents:
7628
diff
changeset
|
80 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 if resort_timers then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 -- Sort earliest timers to the end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 t_sort(timers, function (a, b) return a[1] > b[1]; end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 resort_timers = false; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 -- Iterate from the end and remove completed timers |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 for i = #timers, 1, -1 do |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 local timer = timers[i]; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 local t, f = timer[1], timer[2]; |
| 7624 | 91 -- Get time for every iteration to increase accuracy |
| 92 local now = gettime(); | |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 if t > now then |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
94 -- This timer should not fire yet |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 local diff = t - now; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 if diff < next_delay then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 next_delay = diff; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 end |
|
7558
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
99 break; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 local new_timeout = f(now); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 if new_timeout then |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
103 -- Schedule for 'delay' from the time actually scheduled, |
| 7624 | 104 -- not from now, in order to prevent timer drift. |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 timer[1] = t + new_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 t_remove(timers, i); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 end |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
111 |
|
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
112 if resort_timers or next_delay < min_wait then |
|
7558
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
113 -- Timers may be added from within a timer callback. |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
114 -- Those would not be considered for next_delay, |
|
7558
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
115 -- and we might sleep for too long, so instead |
|
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
116 -- we return a shorter timeout so we can |
|
3a2fe8e10eeb
net.server_epoll: Fix calculation of next timer event
Kim Alvefur <zash@zash.se>
parents:
7557
diff
changeset
|
117 -- properly sort all new timers. |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
118 next_delay = min_wait; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 end |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
120 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 return next_delay; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
122 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
124 -- Socket handler interface |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
125 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 local interface = {}; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
127 local interface_mt = { __index = interface }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
128 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
129 function interface_mt:__tostring() |
|
7585
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
130 if self.sockname and self.peername then |
|
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
131 return ("FD %d (%s, %d, %s, %d)"):format(self:getfd(), self.peername, self.peerport, self.sockname, self.sockport); |
|
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
132 elseif self.sockname or self.peername then |
|
b64218c816de
net.server_epoll: Improve string representation of connections
Kim Alvefur <zash@zash.se>
parents:
7584
diff
changeset
|
133 return ("FD %d (%s, %d)"):format(self:getfd(), self.sockname or self.peername, self.sockport or self.peerport); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 end |
|
9321
146dc1e4c7ff
net.server_epoll: Simplify minimal string representation
Kim Alvefur <zash@zash.se>
parents:
9320
diff
changeset
|
135 return ("FD %d"):format(self:getfd()); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
138 -- Replace the listener and tell the old one |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 function interface:setlistener(listeners) |
|
7604
36408ef6c8c9
net.server_epoll: Call ondetach when listeners are replaced
Kim Alvefur <zash@zash.se>
parents:
7603
diff
changeset
|
140 self:on("detach"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 self.listeners = listeners; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
144 -- Call a listener callback |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
145 function interface:on(what, ...) |
|
8006
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
146 if not self.listeners then |
|
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
147 log("error", "%s has no listeners", self); |
|
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
148 return; |
|
be374a5778f3
net.server_epoll: Log if there's a connection without listeners
Kim Alvefur <zash@zash.se>
parents:
7910
diff
changeset
|
149 end |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
150 local listener = self.listeners["on"..what]; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
151 if not listener then |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
152 -- log("debug", "Missing listener 'on%s'", what); -- uncomment for development and debugging |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
153 return; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
154 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
155 local ok, err = pcall(listener, self, ...); |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
156 if not ok then |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
157 log("error", "Error calling on%s: %s", what, err); |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
158 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
159 return err; |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
160 end |
|
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
161 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
162 -- Return the file descriptor number |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 function interface:getfd() |
|
7586
846fdbbc62ba
net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents:
7585
diff
changeset
|
164 if self.conn then |
|
846fdbbc62ba
net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents:
7585
diff
changeset
|
165 return self.conn:getfd(); |
|
846fdbbc62ba
net.server_epoll: Return something as FD when no connection exists
Kim Alvefur <zash@zash.se>
parents:
7585
diff
changeset
|
166 end |
|
7737
f93b3083b46b
net.server_epoll: Use _SOCKETINVALID from LuaSocket
Kim Alvefur <zash@zash.se>
parents:
7707
diff
changeset
|
167 return _SOCKETINVALID; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
169 |
|
8271
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
170 function interface:server() |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
171 return self._server or self; |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
172 end |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
173 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
174 -- Get IP address |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 function interface:ip() |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
176 return self.peername or self.sockname; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
177 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
178 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
179 -- Get a port number, doesn't matter which |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
180 function interface:port() |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
181 return self.sockport or self.peerport; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
182 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
183 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
184 -- Get local port number |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
185 function interface:clientport() |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
186 return self.sockport; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
187 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
188 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
189 -- Get remote port |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
190 function interface:serverport() |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
191 if self.sockport then |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
192 return self.sockport; |
|
8271
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
193 elseif self._server then |
|
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
194 self._server:port(); |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
195 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
196 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
198 -- Return underlying socket |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 function interface:socket() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 return self.conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
202 |
|
7910
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
203 function interface:set_mode(new_mode) |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
204 self.read_size = new_mode; |
|
7910
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
205 end |
|
91db637be237
net.server_epoll: Add method for changing read pattern
Kim Alvefur <zash@zash.se>
parents:
7817
diff
changeset
|
206 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 function interface:setoption(k, v) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
208 -- LuaSec doesn't expose setoption :( |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
209 if self.conn.setoption then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
210 self.conn:setoption(k, v); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
211 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
212 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
214 -- Timeout for detecting dead or idle sockets |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 function interface:setreadtimeout(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
216 if t == false then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 if self._readtimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
218 self._readtimeout:close(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
219 self._readtimeout = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 return |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
222 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 t = t or cfg.read_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
224 if self._readtimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 self._readtimeout[1] = gettime() + t; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
226 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
227 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
228 self._readtimeout = addtimer(t, function () |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
229 if self:on("readtimeout") then |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
230 return cfg.read_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
231 else |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
232 self:on("disconnect", "read timeout"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
234 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
235 end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
236 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
237 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
239 -- Timeout for detecting dead sockets |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 function interface:setwritetimeout(t) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 if t == false then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
242 if self._writetimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
243 self._writetimeout:close(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
244 self._writetimeout = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
245 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
246 return |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
248 t = t or cfg.write_timeout; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
249 if self._writetimeout then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
250 self._writetimeout[1] = gettime() + t; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
251 resort_timers = true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
252 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
253 self._writetimeout = addtimer(t, function () |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
254 self:on("disconnect", "write timeout"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
255 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
256 end); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
257 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
258 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
259 |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
260 function interface:add(r, w) |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
261 local fd = self:getfd(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
262 if fd < 0 then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
263 return nil, "invalid fd"; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
264 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
265 if r == nil then r = self._wantread; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
266 if w == nil then w = self._wantwrite; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
267 local ok, err = poll:add(fd, r, w); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
268 if not ok then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
269 log("error", "Could not register %s: %s", self, err); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
270 return ok, err; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
271 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
272 self._wantread, self._wantwrite = r, w; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
273 fds[fd] = self; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
274 log("debug", "Registered %s", self); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
275 return true; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
276 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
277 |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
278 function interface:set(r, w) |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
279 local fd = self:getfd(); |
|
7602
a4d5eec36a17
net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents:
7601
diff
changeset
|
280 if fd < 0 then |
|
a4d5eec36a17
net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents:
7601
diff
changeset
|
281 return nil, "invalid fd"; |
|
a4d5eec36a17
net.server_epoll: Prevent invalid FDs from being added to epoll
Kim Alvefur <zash@zash.se>
parents:
7601
diff
changeset
|
282 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
283 if r == nil then r = self._wantread; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
284 if w == nil then w = self._wantwrite; end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
285 local ok, err = poll:set(fd, r, w); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
286 if not ok then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
287 log("error", "Could not update poller state %s: %s", self, err); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
288 return ok, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
289 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
290 self._wantread, self._wantwrite = r, w; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
291 return true; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
292 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
293 |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
294 function interface:del() |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
295 local fd = self:getfd(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
296 if fd < 0 then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
297 return nil, "invalid fd"; |
|
7625
6afafd6d4ef0
net.server_epoll: Move management of fd registry to :setflags
Kim Alvefur <zash@zash.se>
parents:
7624
diff
changeset
|
298 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
299 if fds[fd] ~= self then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
300 return nil, "unregistered fd"; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
301 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
302 local ok, err = poll:del(fd); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
303 if not ok then |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
304 log("error", "Could not unregister %s: %s", self, err); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
305 return ok, err; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
306 end |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
307 self._wantread, self._wantwrite = nil, nil; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
308 fds[fd] = nil; |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
309 log("debug", "Unregistered %s", self); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
310 return true; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
311 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
312 |
|
9320
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
313 function interface:setflags(r, w) |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
314 if not(self._wantread or self._wantwrite) then |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
315 if not(r or w) then |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
316 return true; -- no change |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
317 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
318 return self:add(r, w); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
319 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
320 if not(r or w) then |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
321 return self:del(); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
322 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
323 return self:set(r, w); |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
324 end |
|
8cc498cb0df7
net.server_epoll: Add back setflags API for compat
Kim Alvefur <zash@zash.se>
parents:
9319
diff
changeset
|
325 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
326 -- Called when socket is readable |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
327 function interface:onreadable() |
|
9311
9b0604fe01f1
net.server_epoll: Make read_size a server-wide option
Kim Alvefur <zash@zash.se>
parents:
9310
diff
changeset
|
328 local data, err, partial = self.conn:receive(self.read_size or cfg.read_size); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
329 if data then |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
330 self:onconnect(); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
331 self:on("incoming", data); |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
332 else |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
333 if partial and partial ~= "" then |
|
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
334 self:onconnect(); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
335 self:on("incoming", partial, err); |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
336 end |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
337 if err == "wantread" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
338 self:set(true, nil); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
339 elseif err == "wantwrite" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
340 self:set(nil, true); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
341 elseif err ~= "timeout" then |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
342 self:on("disconnect", err); |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
343 self:destroy() |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
344 return; |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
345 end |
|
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
346 end |
|
7691
a5ad858f3a93
net.server_epoll: Check that connection still exists after callback, fixes traceback when closed
Kim Alvefur <zash@zash.se>
parents:
7687
diff
changeset
|
347 if not self.conn then return; end |
|
7606
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
348 if self.conn:dirty() then |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
349 self:setreadtimeout(false); |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
350 self:pausefor(cfg.read_retry_delay); |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
351 else |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
352 self:setreadtimeout(); |
|
f40f1d9b7872
net.server_epoll: Set timers before calling onincoming, fixes traceback if connection is closed before onincoming returns
Kim Alvefur <zash@zash.se>
parents:
7604
diff
changeset
|
353 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
354 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
355 |
|
7573
0f0a6febbc5a
net.server_epoll: Add some comments
Kim Alvefur <zash@zash.se>
parents:
7564
diff
changeset
|
356 -- Called when socket is writable |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
357 function interface:onwritable() |
|
8552
1fcefc16a55d
server_epoll: Onconnect should happen before first attempt to write to socket
Kim Alvefur <zash@zash.se>
parents:
8542
diff
changeset
|
358 self:onconnect(); |
|
8776
e7d4344e0fea
net.server_epoll: Handle connection being closed and destroyed in onconnect callback
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
359 if not self.conn then return; end -- could have been closed in onconnect |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
360 local buffer = self.writebuffer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
361 local data = t_concat(buffer); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
362 local ok, err, partial = self.conn:send(data); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
363 if ok then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
364 self:set(nil, false); |
|
8541
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
365 for i = #buffer, 1, -1 do |
|
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
366 buffer[i] = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
367 end |
|
8541
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
368 self:setwritetimeout(false); |
|
8186114329d6
net.server_epoll: Remove special casing for having sent an empty write buffer because the wantwrite flag must be unset regardless
Kim Alvefur <zash@zash.se>
parents:
8540
diff
changeset
|
369 self:ondrain(); -- Be aware of writes in ondrain |
|
7589
125e4f2e0b65
net.server_epoll: Return early on successful write
Kim Alvefur <zash@zash.se>
parents:
7588
diff
changeset
|
370 return; |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
371 elseif partial then |
|
7591
138f16eb39fb
net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents:
7590
diff
changeset
|
372 buffer[1] = data:sub(partial+1); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
373 for i = #buffer, 2, -1 do |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
374 buffer[i] = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
375 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
376 self:setwritetimeout(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
377 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
378 if err == "wantwrite" or err == "timeout" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
379 self:set(nil, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
380 elseif err == "wantread" then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
381 self:set(true, nil); |
|
7687
ae24deae6488
net.server_epoll: Separate ok from err branch more
Kim Alvefur <zash@zash.se>
parents:
7658
diff
changeset
|
382 elseif err ~= "timeout" then |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
383 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
384 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
385 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
386 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
387 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
388 -- The write buffer has been successfully emptied |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
389 function interface:ondrain() |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
390 return self:on("drain"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
391 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
392 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
393 -- Add data to write buffer and set flag for wanting to write |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
394 function interface:write(data) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
395 local buffer = self.writebuffer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
396 if buffer then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
397 t_insert(buffer, data); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
398 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
399 self.writebuffer = { data }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
400 end |
|
7550
8c2bc1b6d84a
net.server_epoll: Remove last traces of code for bypassing buffering on writable sockets
Kim Alvefur <zash@zash.se>
parents:
7547
diff
changeset
|
401 self:setwritetimeout(); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
402 self:set(nil, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
403 return #data; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
404 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
405 interface.send = interface.write; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
406 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
407 -- Close, possibly after writing is done |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
408 function interface:close() |
|
8007
67f8954875a4
net.server_epoll: Check write buffer for remaining data to write when closing
Kim Alvefur <zash@zash.se>
parents:
8006
diff
changeset
|
409 if self.writebuffer and self.writebuffer[1] then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
410 self:set(false, true); -- Flush final buffer contents |
|
7593
0266434d7df1
net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents:
7592
diff
changeset
|
411 self.write, self.send = noop, noop; -- No more writing |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
412 log("debug", "Close %s after writing", self); |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
413 self.ondrain = interface.close; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
414 else |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
415 log("debug", "Close %s now", self); |
|
7593
0266434d7df1
net.server_epoll: Prevent further writing after closing a socket
Kim Alvefur <zash@zash.se>
parents:
7592
diff
changeset
|
416 self.write, self.send = noop, noop; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
417 self.close = noop; |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
418 self:on("disconnect"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
419 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
420 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
421 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
422 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
423 function interface:destroy() |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
424 self:del(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
425 self:setwritetimeout(false); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
426 self:setreadtimeout(false); |
|
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
427 self.onreadable = noop; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
428 self.onwritable = noop; |
|
7594
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
429 self.destroy = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
430 self.close = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
431 self.on = noop; |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
432 self.conn:close(); |
|
5e884501a9ac
net.server_epoll: Prevent anything from happening to destroyed sockets
Kim Alvefur <zash@zash.se>
parents:
7593
diff
changeset
|
433 self.conn = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
434 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
435 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
436 function interface:ssl() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
437 return self._tls; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
438 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
439 |
|
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
440 function interface:starttls(tls_ctx) |
|
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
441 if tls_ctx then self.tls_ctx = tls_ctx; end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
442 if self.writebuffer and self.writebuffer[1] then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
443 log("debug", "Start TLS on %s after write", self); |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
444 self.ondrain = interface.starttls; |
|
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
445 self.starttls = false; |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
446 self:set(nil, true); -- make sure wantwrite is set |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
447 else |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
448 log("debug", "Start TLS on %s now", self); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
449 self:del(); |
|
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
450 local conn, err = luasec.wrap(self.conn, tls_ctx or self.tls_ctx); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
451 if not conn then |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
452 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
453 self:destroy(); |
|
7595
166b2e0766a4
net.server_epoll: Return status from starttls method
Kim Alvefur <zash@zash.se>
parents:
7594
diff
changeset
|
454 return conn, err; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
455 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
456 conn:settimeout(0); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
457 self.conn = conn; |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
458 self.ondrain = nil; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
459 self.onwritable = interface.tlshandskake; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
460 self.onreadable = interface.tlshandskake; |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
461 return self:init(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
462 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
463 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
464 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
465 function interface:tlshandskake() |
|
7598
335b5ce06062
net.server_epoll: TLS handshake timeout
Kim Alvefur <zash@zash.se>
parents:
7597
diff
changeset
|
466 self:setwritetimeout(false); |
|
335b5ce06062
net.server_epoll: TLS handshake timeout
Kim Alvefur <zash@zash.se>
parents:
7597
diff
changeset
|
467 self:setreadtimeout(false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
468 local ok, err = self.conn:dohandshake(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
469 if ok then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
470 log("debug", "TLS handshake on %s complete", self); |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
471 self.onwritable = nil; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
472 self.onreadable = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
473 self._tls = true; |
|
8008
62ed3795be13
net.server_epoll: Attempt to simplify state control
Kim Alvefur <zash@zash.se>
parents:
8007
diff
changeset
|
474 self:on("status", "ssl-handshake-complete"); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
475 self:setwritetimeout(); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
476 self:set(true, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
477 elseif err == "wantread" then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
478 log("debug", "TLS handshake on %s to wait until readable", self); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
479 self:set(true, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
480 self:setreadtimeout(cfg.handshake_timeout); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
481 elseif err == "wantwrite" then |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
482 log("debug", "TLS handshake on %s to wait until writable", self); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
483 self:set(false, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
484 self:setwritetimeout(cfg.handshake_timeout); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
485 else |
|
9301
2f9687c09e6e
net.server_epoll: Remove coercion of connections to strings
Kim Alvefur <zash@zash.se>
parents:
9300
diff
changeset
|
486 log("debug", "TLS handshake error on %s: %s", self, err); |
|
7583
0498daffa6f0
net.server_epoll: Call callbacks through common method in protected mode
Kim Alvefur <zash@zash.se>
parents:
7574
diff
changeset
|
487 self:on("disconnect", err); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
488 self:destroy(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
489 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
490 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
491 |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
492 local function wrapsocket(client, server, read_size, listeners, tls_ctx) -- luasocket object -> interface object |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
493 client:settimeout(0); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
494 local conn = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
495 conn = client; |
|
8271
c09deab9989e
net.server_epoll: Add interface:server() method to match server_event (fixes c2s:show traceback in telnet console)
Kim Alvefur <zash@zash.se>
parents:
8091
diff
changeset
|
496 _server = server; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
497 created = gettime(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
498 listeners = listeners; |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
499 read_size = read_size or (server and server.read_size); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
500 writebuffer = {}; |
|
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
501 tls_ctx = tls_ctx; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
502 }, interface_mt); |
|
7591
138f16eb39fb
net.server_epoll: Improve syntax
Kim Alvefur <zash@zash.se>
parents:
7590
diff
changeset
|
503 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
504 if client.getpeername then |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
505 conn.peername, conn.peerport = client:getpeername(); |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
506 end |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
507 if client.getsockname then |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
508 conn.sockname, conn.sockport = client:getsockname(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
509 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
510 return conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
511 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
512 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
513 -- A server interface has new incoming connections waiting |
|
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
514 -- This replaces the onreadable callback |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
515 function interface:onacceptable() |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
516 local conn, err = self.conn:accept(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
517 if not conn then |
|
7574
97b8506118a9
net.server_epoll: Fix missing quotes in logging call
Kim Alvefur <zash@zash.se>
parents:
7573
diff
changeset
|
518 log("debug", "Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
519 self:pausefor(cfg.accept_retry_interval); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
520 return; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
521 end |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
522 local client = wrapsocket(conn, self, nil, self.listeners); |
|
7592
10d2f008321d
net.server_epoll: Additional logging of connects and TLS
Kim Alvefur <zash@zash.se>
parents:
7591
diff
changeset
|
523 log("debug", "New connection %s", tostring(client)); |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
524 if self.tls_direct then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
525 client:starttls(self.tls_ctx); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
526 else |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
527 client:init(); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
528 end |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
529 end |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
530 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
531 -- Initialization |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
532 function interface:init() |
|
9306
35c128b42509
net.server_epoll: Factor Direct TLS handling out of connection initialization
Kim Alvefur <zash@zash.se>
parents:
9301
diff
changeset
|
533 self:setwritetimeout(); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
534 return self:add(true, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
535 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
536 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
537 function interface:pause() |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
538 return self:set(false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
539 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
540 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
541 function interface:resume() |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
542 return self:set(true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
543 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
544 |
| 7624 | 545 -- Pause connection for some time |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
546 function interface:pausefor(t) |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
547 if self._pausefor then |
|
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
548 self._pausefor:close(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
549 end |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
550 if t == false then return; end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
551 self:set(false); |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
552 self._pausefor = addtimer(t, function () |
|
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
553 self._pausefor = nil; |
|
7707
7bb1cc7278b6
net.server_epoll: Make sure socket exists before checking if there is buffered data in it
Kim Alvefur <zash@zash.se>
parents:
7691
diff
changeset
|
554 if self.conn and self.conn:dirty() then |
|
7560
785fa1138293
net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents:
7559
diff
changeset
|
555 self:onreadable(); |
|
785fa1138293
net.server_epoll: Continue reading after a slight delay if there is buffered data after a read
Kim Alvefur <zash@zash.se>
parents:
7559
diff
changeset
|
556 end |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
557 self:set(true); |
|
7559
b1b27dedf4cf
net.server_epoll: Replace any previous pausefor timer
Kim Alvefur <zash@zash.se>
parents:
7558
diff
changeset
|
558 end); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
559 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
560 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
561 -- Connected! |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
562 function interface:onconnect() |
|
8778
0364454bdd77
net.server_epoll: Guard against connection missing the getpeername method (thanks LuaSec)
Kim Alvefur <zash@zash.se>
parents:
8777
diff
changeset
|
563 if self.conn and not self.peername and self.conn.getpeername then |
|
8777
2bfe963f3041
net.server_epoll: Retry retrieving peername once connected
Kim Alvefur <zash@zash.se>
parents:
8776
diff
changeset
|
564 self.peername, self.peerport = self.conn:getpeername(); |
|
2bfe963f3041
net.server_epoll: Retry retrieving peername once connected
Kim Alvefur <zash@zash.se>
parents:
8776
diff
changeset
|
565 end |
|
8540
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
566 self.onconnect = noop; |
|
ba9fd886b34d
net.server_epoll: Call onconnect listener on first successful read or write
Kim Alvefur <zash@zash.se>
parents:
8507
diff
changeset
|
567 self:on("connect"); |
|
8506
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
568 end |
|
174fd716c9fa
server_epoll: Rework how socket readyness is detected
Kim Alvefur <zash@zash.se>
parents:
8271
diff
changeset
|
569 |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
570 local function addserver(addr, port, listeners, read_size, tls_ctx) |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
571 local conn, err = socket.bind(addr, port, cfg.tcp_backlog); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
572 if not conn then return conn, err; end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
573 conn:settimeout(0); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
574 local server = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
575 conn = conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
576 created = gettime(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
577 listeners = listeners; |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
578 read_size = read_size; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
579 onreadable = interface.onacceptable; |
|
9300
1df8832bd29e
net.server_epoll: Rename all variables holding TLS contexts for consistency
Kim Alvefur <zash@zash.se>
parents:
8983
diff
changeset
|
580 tls_ctx = tls_ctx; |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
581 tls_direct = tls_ctx and true or false; |
|
7584
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
582 sockname = addr; |
|
98ee3ed105cf
net.server_epoll: Collect and expose local and remote address and ports
Kim Alvefur <zash@zash.se>
parents:
7583
diff
changeset
|
583 sockport = port; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
584 }, interface_mt); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
585 server:add(true, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
586 return server; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
587 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
588 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
589 -- COMPAT |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
590 local function wrapclient(conn, addr, port, listeners, read_size, tls_ctx) |
|
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
591 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx); |
|
7597
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
592 if not client.peername then |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
593 client.peername, client.peerport = addr, port; |
|
cd34aa6b1632
net.server_epoll: Refactor to use common initialization
Kim Alvefur <zash@zash.se>
parents:
7596
diff
changeset
|
594 end |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
595 if tls_ctx then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
596 client:starttls(tls_ctx); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
597 else |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
598 client:init(); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
599 end |
|
7551
838212918f11
net.server_epoll: Rename arguments and varibles for consistensy
Kim Alvefur <zash@zash.se>
parents:
7550
diff
changeset
|
600 return client; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
601 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
602 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
603 -- New outgoing TCP connection |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
604 local function addclient(addr, port, listeners, read_size, tls_ctx) |
|
7596
2c4ba55b616c
net.server_epoll: Connect async in addclient
Kim Alvefur <zash@zash.se>
parents:
7595
diff
changeset
|
605 local conn, err = socket.tcp(); |
|
7553
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
606 if not conn then return conn, err; end |
|
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
607 conn:settimeout(0); |
|
7596
2c4ba55b616c
net.server_epoll: Connect async in addclient
Kim Alvefur <zash@zash.se>
parents:
7595
diff
changeset
|
608 conn:connect(addr, port); |
|
9310
2d2d4c293efa
net.server_epoll: Rename pattern to read_size
Kim Alvefur <zash@zash.se>
parents:
9309
diff
changeset
|
609 local client = wrapsocket(conn, nil, read_size, listeners, tls_ctx) |
|
9309
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
610 if tls_ctx then |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
611 client:starttls(tls_ctx); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
612 else |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
613 client:init(); |
|
33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
Kim Alvefur <zash@zash.se>
parents:
9306
diff
changeset
|
614 end |
|
7556
1f777b38b66c
net.server_epoll: Make addclient conform to API (expected by net.http.request)
Kim Alvefur <zash@zash.se>
parents:
7555
diff
changeset
|
615 return client, conn; |
|
7553
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
616 end |
|
4f3e4a092348
net.server_epoll: Make addclient use wrapclient
Kim Alvefur <zash@zash.se>
parents:
7552
diff
changeset
|
617 |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
618 local function watchfd(fd, onreadable, onwritable) |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
619 local conn = setmetatable({ |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
620 conn = fd; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
621 onreadable = onreadable; |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
622 onwritable = onwritable; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
623 close = function (self) |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
624 self:del(); |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
625 end |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
626 }, interface_mt); |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
627 if type(fd) == "number" then |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
628 conn.getfd = function () |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
629 return fd; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
630 end; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
631 -- Otherwise it'll need to be something LuaSocket-compatible |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
632 end |
|
9319
7c954c75b6ac
net.server_epoll: Fix write signal handling in watchfd API
Kim Alvefur <zash@zash.se>
parents:
9314
diff
changeset
|
633 conn:add(onreadable, onwritable); |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
634 return conn; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
635 end; |
|
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
636 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
637 -- Dump all data from one connection into another |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
638 local function link(from, to) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
639 from.listeners = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
640 onincoming = function (_, data) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
641 from:pause(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
642 to:write(data); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
643 end, |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
644 }, {__index=from.listeners}); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
645 to.listeners = setmetatable({ |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
646 ondrain = function () |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
647 from:resume(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
648 end, |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
649 }, {__index=to.listeners}); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
650 from:set(true, nil); |
|
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
651 to:set(nil, true); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
652 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
653 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
654 -- XXX What uses this? |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
655 -- net.adns |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
656 function interface:set_send(new_send) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
657 self.send = new_send; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
658 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
659 |
|
7800
dadf9ba290c5
server_epoll: Add some comments describing some functions
Kim Alvefur <zash@zash.se>
parents:
7799
diff
changeset
|
660 -- Close all connections and servers |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
661 local function closeall() |
|
7799
93643a61858a
server_epoll: Ignore unused loop variable [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7797
diff
changeset
|
662 for fd, conn in pairs(fds) do -- luacheck: ignore 213/fd |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
663 conn:close(); |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
664 end |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
665 end |
|
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
666 |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
667 local quitting = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
668 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
669 -- Signal main loop about shutdown via above upvalue |
|
7796
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
670 local function setquitting(quit) |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
671 if quit then |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
672 quitting = "quitting"; |
|
7797
d0c32d86724f
server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents:
7796
diff
changeset
|
673 closeall(); |
|
7796
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
674 else |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
675 quitting = nil; |
|
12609aee3b3b
server_epoll: Handle the argument to setquitting like server_select
Kim Alvefur <zash@zash.se>
parents:
7795
diff
changeset
|
676 end |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
677 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
678 |
|
7637
cccea9136b2d
net.server_epoll: More comments
Kim Alvefur <zash@zash.se>
parents:
7630
diff
changeset
|
679 -- Main loop |
|
7795
03081bd5c5bb
net.server_epoll: Add the 'once' argument to loop for parity with server_select
Kim Alvefur <zash@zash.se>
parents:
7794
diff
changeset
|
680 local function loop(once) |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
681 repeat |
|
7658
e14a124c4d73
net.server_epoll: Make minimum poll wait time configurable
Kim Alvefur <zash@zash.se>
parents:
7657
diff
changeset
|
682 local t = runtimers(cfg.max_wait, cfg.min_wait); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
683 local fd, r, w = poll:wait(t); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
684 if fd then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
685 local conn = fds[fd]; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
686 if conn then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
687 if r then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
688 conn:onreadable(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
689 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
690 if w then |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
691 conn:onwritable(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
692 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
693 else |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
694 log("debug", "Removing unknown fd %d", fd); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
695 poll:del(fd); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
696 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
697 elseif r ~= "timeout" then |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
698 log("debug", "epoll_wait error: %s", tostring(r)); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
699 end |
|
7797
d0c32d86724f
server_epoll: Flush and close all connections before quitting mainloop so no data is lost in buffers
Kim Alvefur <zash@zash.se>
parents:
7796
diff
changeset
|
700 until once or (quitting and next(fds) == nil); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
701 return quitting; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
702 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
703 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
704 return { |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
705 get_backend = function () return "epoll"; end; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
706 addserver = addserver; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
707 addclient = addclient; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
708 add_task = addtimer; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
709 at = at; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
710 loop = loop; |
|
7794
424bbbeb9257
server_epoll: Add closeall() method for closing all clients and servers
Kim Alvefur <zash@zash.se>
parents:
7737
diff
changeset
|
711 closeall = closeall; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
712 setquitting = setquitting; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
713 wrapclient = wrapclient; |
|
8781
53178b6ba589
net.server: Add watchfd, a simple API for watching file descriptors
Kim Alvefur <zash@zash.se>
parents:
8778
diff
changeset
|
714 watchfd = watchfd; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
715 link = link; |
|
7657
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
716 set_config = function (newconfig) |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
717 cfg = setmetatable(newconfig, default_config); |
|
252823632401
net.server_epoll: Support for setting configuration parameters
Kim Alvefur <zash@zash.se>
parents:
7637
diff
changeset
|
718 end; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
719 |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
720 -- libevent emulation |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
721 event = { EV_READ = "r", EV_WRITE = "w", EV_READWRITE = "rw", EV_LEAVE = -1 }; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
722 addevent = function (fd, mode, callback) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
723 local function onevent(self) |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
724 local ret = self:callback(); |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
725 if ret == -1 then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
726 self:set(false, false); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
727 elseif ret then |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
728 self:set(mode == "r" or mode == "rw", mode == "w" or mode == "rw"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
729 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
730 end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
731 |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
732 local conn = setmetatable({ |
|
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
733 getfd = function () return fd; end; |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
734 callback = callback; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
735 onreadable = onevent; |
|
8542
8c39ec8e6018
net.server_epoll: Spelling writeable -> writable
Kim Alvefur <zash@zash.se>
parents:
8541
diff
changeset
|
736 onwritable = onevent; |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
737 close = function (self) |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
738 self:del(); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
739 fds[fd] = nil; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
740 end; |
|
7817
4e3654031693
net.server_epoll: Reuse interface metatable for event compat layer
Kim Alvefur <zash@zash.se>
parents:
7811
diff
changeset
|
741 }, interface_mt); |
|
9314
c9eef7e8ee65
net.server_epoll: Use util.poll
Kim Alvefur <zash@zash.se>
parents:
9311
diff
changeset
|
742 local ok, err = conn:add(mode == "r" or mode == "rw", mode == "w" or mode == "rw"); |
|
7547
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
743 if not ok then return ok, err; end |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
744 return conn; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
745 end; |
|
b327322ce2dd
net.server_epoll: New experimental server backend
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
746 }; |
