Skip to content

Commit 4bdc04a

Browse files
committed
Break TCPConnection's _read_buffer_size into 3 different variables
Prior to this change, _read_buffer_size was used for 3 different purposes: - Sizing the read buffer - Controlling how many bytes to read before yielding the CPU - Controlling how many bytes to write before yielding the CPU This commit provides 3 different variables, one for each of the 3 possible usages. Closes #3186
1 parent f750868 commit 4bdc04a

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

packages/net/tcp_connection.pony

+29-7
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ actor TCPConnection
216216

217217
let _read_buffer_size: USize
218218

219+
let _yield_after_reading: USize
220+
let _yield_after_writing: USize
221+
219222
var _expect: USize = 0
220223

221224
var _muted: Bool = false
@@ -226,14 +229,18 @@ actor TCPConnection
226229
host: String,
227230
service: String,
228231
from: String = "",
229-
read_buffer_size: USize = 16384)
232+
read_buffer_size: USize = 16384,
233+
yield_after_reading: USize = 16384,
234+
yield_after_writing: USize = 16384)
230235
=>
231236
"""
232237
Connect via IPv4 or IPv6. If `from` is a non-empty string, the connection
233238
will be made from the specified interface.
234239
"""
235240
_read_buf = recover Array[U8] .> undefined(read_buffer_size) end
236241
_read_buffer_size = read_buffer_size
242+
_yield_after_reading = yield_after_reading
243+
_yield_after_writing = yield_after_writing
237244
_notify = consume notify
238245
let asio_flags =
239246
ifdef not windows then
@@ -252,13 +259,17 @@ actor TCPConnection
252259
host: String,
253260
service: String,
254261
from: String = "",
255-
read_buffer_size: USize = 16384)
262+
read_buffer_size: USize = 16384,
263+
yield_after_reading: USize = 16384,
264+
yield_after_writing: USize = 16384)
256265
=>
257266
"""
258267
Connect via IPv4.
259268
"""
260269
_read_buf = recover Array[U8] .> undefined(read_buffer_size) end
261270
_read_buffer_size = read_buffer_size
271+
_yield_after_reading = yield_after_reading
272+
_yield_after_writing = yield_after_writing
262273
_notify = consume notify
263274
let asio_flags =
264275
ifdef not windows then
@@ -277,13 +288,17 @@ actor TCPConnection
277288
host: String,
278289
service: String,
279290
from: String = "",
280-
read_buffer_size: USize = 16384)
291+
read_buffer_size: USize = 16384,
292+
yield_after_reading: USize = 16384,
293+
yield_after_writing: USize = 16384)
281294
=>
282295
"""
283296
Connect via IPv6.
284297
"""
285298
_read_buf = recover Array[U8] .> undefined(read_buffer_size) end
286299
_read_buffer_size = read_buffer_size
300+
_yield_after_reading = yield_after_reading
301+
_yield_after_writing = yield_after_writing
287302
_notify = consume notify
288303
let asio_flags =
289304
ifdef not windows then
@@ -300,7 +315,9 @@ actor TCPConnection
300315
listen: TCPListener,
301316
notify: TCPConnectionNotify iso,
302317
fd: U32,
303-
read_buffer_size: USize = 16384)
318+
read_buffer_size: USize = 16384,
319+
yield_after_reading: USize = 16384,
320+
yield_after_writing: USize = 16384)
304321
=>
305322
"""
306323
A new connection accepted on a server.
@@ -323,6 +340,8 @@ actor TCPConnection
323340
_writeable = true
324341
_read_buf = recover Array[U8] .> undefined(read_buffer_size) end
325342
_read_buffer_size = read_buffer_size
343+
_yield_after_reading = yield_after_reading
344+
_yield_after_writing = yield_after_writing
326345

327346
_notify.accepted(this)
328347

@@ -648,7 +667,9 @@ actor TCPConnection
648667
var bytes_to_send: USize = 0
649668
var bytes_sent: USize = 0
650669
while _writeable and (_pending_writev_total > 0) do
651-
if bytes_sent >= _read_buffer_size then
670+
if bytes_sent >= _yield_after_writing then
671+
// We've written _yield_after_writing bytes.
672+
// Yield and write again later.
652673
_write_again()
653674
return false
654675
end
@@ -861,8 +882,9 @@ actor TCPConnection
861882
end
862883
end
863884

864-
if sum >= _read_buffer_size then
865-
// If we've read _read_buffer_size, yield and read again later.
885+
if sum >= _yield_after_reading then
886+
// If we've read _yield_after_reading bytes
887+
// yield and read again later.
866888
_read_buf_size()
867889
_read_again()
868890
_reading = false

packages/net/tcp_listener.pony

+19-4
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,19 @@ actor TCPListener
4646
var _count: USize = 0
4747
var _paused: Bool = false
4848
var _read_buffer_size: USize
49+
let _yield_after_reading: USize
50+
let _yield_after_writing: USize
51+
4952

5053
new create(
5154
auth: TCPListenerAuth,
5255
notify: TCPListenNotify iso,
5356
host: String = "",
5457
service: String = "0",
5558
limit: USize = 0,
56-
read_buffer_size: USize = 16384)
59+
read_buffer_size: USize = 16384,
60+
yield_after_reading: USize = 16384,
61+
yield_after_writing: USize = 16384)
5762
=>
5863
"""
5964
Listens for both IPv4 and IPv6 connections.
@@ -64,6 +69,8 @@ actor TCPListener
6469
@pony_os_listen_tcp[AsioEventID](this,
6570
host.cstring(), service.cstring())
6671
_read_buffer_size = read_buffer_size
72+
_yield_after_reading = yield_after_reading
73+
_yield_after_writing = yield_after_writing
6774
_fd = @pony_asio_event_fd(_event)
6875
_notify_listening()
6976

@@ -73,7 +80,9 @@ actor TCPListener
7380
host: String = "",
7481
service: String = "0",
7582
limit: USize = 0,
76-
read_buffer_size: USize = 16384)
83+
read_buffer_size: USize = 16384,
84+
yield_after_reading: USize = 16384,
85+
yield_after_writing: USize = 16384)
7786
=>
7887
"""
7988
Listens for IPv4 connections.
@@ -84,6 +93,8 @@ actor TCPListener
8493
@pony_os_listen_tcp4[AsioEventID](this, host.cstring(),
8594
service.cstring())
8695
_read_buffer_size = read_buffer_size
96+
_yield_after_reading = yield_after_reading
97+
_yield_after_writing = yield_after_writing
8798
_fd = @pony_asio_event_fd(_event)
8899
_notify_listening()
89100

@@ -93,7 +104,9 @@ actor TCPListener
93104
host: String = "",
94105
service: String = "0",
95106
limit: USize = 0,
96-
read_buffer_size: USize = 16384)
107+
read_buffer_size: USize = 16384,
108+
yield_after_reading: USize = 16384,
109+
yield_after_writing: USize = 16384)
97110
=>
98111
"""
99112
Listens for IPv6 connections.
@@ -104,6 +117,8 @@ actor TCPListener
104117
@pony_os_listen_tcp6[AsioEventID](this, host.cstring(),
105118
service.cstring())
106119
_read_buffer_size = read_buffer_size
120+
_yield_after_reading = yield_after_reading
121+
_yield_after_writing = yield_after_writing
107122
_fd = @pony_asio_event_fd(_event)
108123
_notify_listening()
109124

@@ -211,7 +226,7 @@ actor TCPListener
211226
"""
212227
try
213228
TCPConnection._accept(this, _notify.connected(this)?, ns,
214-
_read_buffer_size)
229+
_read_buffer_size, _yield_after_reading, _yield_after_writing)
215230
_count = _count + 1
216231
else
217232
@pony_os_socket_close[None](ns)

0 commit comments

Comments
 (0)