rloop 0.1.0a4__tar.gz → 0.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rloop-0.1.0a4 → rloop-0.1.1}/Cargo.lock +45 -45
- {rloop-0.1.0a4 → rloop-0.1.1}/Cargo.toml +4 -4
- {rloop-0.1.0a4 → rloop-0.1.1}/PKG-INFO +30 -7
- rloop-0.1.1/README.md +50 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/_rloop.pyi +4 -5
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/loop.py +30 -9
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/server.py +23 -7
- rloop-0.1.1/src/event_loop.rs +1164 -0
- rloop-0.1.1/src/handles.rs +206 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/src/server.rs +17 -18
- {rloop-0.1.0a4 → rloop-0.1.1}/src/sock.rs +1 -1
- rloop-0.1.1/src/tcp.rs +719 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/src/time.rs +2 -2
- rloop-0.1.1/src/utils.rs +27 -0
- rloop-0.1.1/tests/tcp/__init__.py +35 -0
- rloop-0.1.1/tests/tcp/test_tcp_conn.py +45 -0
- rloop-0.1.1/tests/tcp/test_tcp_server.py +80 -0
- rloop-0.1.1/tests/test_handles.py +59 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/tests/test_sockets.py +5 -6
- rloop-0.1.1/tests/udp/test_udp.py +76 -0
- rloop-0.1.0a4/README.md +0 -27
- rloop-0.1.0a4/src/event_loop.rs +0 -1089
- rloop-0.1.0a4/src/handles.rs +0 -207
- rloop-0.1.0a4/src/tcp.rs +0 -768
- rloop-0.1.0a4/src/utils.rs +0 -12
- {rloop-0.1.0a4 → rloop-0.1.1}/LICENSE +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/pyproject.toml +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/__init__.py +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/_compat.py +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/exc.py +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/futures.py +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/subprocess.py +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/transports.py +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/rloop/utils.py +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/src/io.rs +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/src/lib.rs +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/src/log.rs +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/src/py.rs +0 -0
- {rloop-0.1.0a4 → rloop-0.1.1}/tests/conftest.py +0 -0
|
@@ -4,9 +4,9 @@ version = 4
|
|
|
4
4
|
|
|
5
5
|
[[package]]
|
|
6
6
|
name = "anyhow"
|
|
7
|
-
version = "1.0.
|
|
7
|
+
version = "1.0.98"
|
|
8
8
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
9
|
-
checksum = "
|
|
9
|
+
checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
|
|
10
10
|
|
|
11
11
|
[[package]]
|
|
12
12
|
name = "autocfg"
|
|
@@ -16,15 +16,15 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
|
|
|
16
16
|
|
|
17
17
|
[[package]]
|
|
18
18
|
name = "bitflags"
|
|
19
|
-
version = "2.
|
|
19
|
+
version = "2.9.0"
|
|
20
20
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
21
|
-
checksum = "
|
|
21
|
+
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
|
|
22
22
|
|
|
23
23
|
[[package]]
|
|
24
24
|
name = "cc"
|
|
25
|
-
version = "1.2.
|
|
25
|
+
version = "1.2.19"
|
|
26
26
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
27
|
-
checksum = "
|
|
27
|
+
checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362"
|
|
28
28
|
dependencies = [
|
|
29
29
|
"shlex",
|
|
30
30
|
]
|
|
@@ -69,15 +69,15 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
|
69
69
|
|
|
70
70
|
[[package]]
|
|
71
71
|
name = "indoc"
|
|
72
|
-
version = "2.0.
|
|
72
|
+
version = "2.0.6"
|
|
73
73
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
74
|
-
checksum = "
|
|
74
|
+
checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
|
|
75
75
|
|
|
76
76
|
[[package]]
|
|
77
77
|
name = "libc"
|
|
78
|
-
version = "0.2.
|
|
78
|
+
version = "0.2.172"
|
|
79
79
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
80
|
-
checksum = "
|
|
80
|
+
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
|
|
81
81
|
|
|
82
82
|
[[package]]
|
|
83
83
|
name = "lock_api"
|
|
@@ -91,9 +91,9 @@ dependencies = [
|
|
|
91
91
|
|
|
92
92
|
[[package]]
|
|
93
93
|
name = "log"
|
|
94
|
-
version = "0.4.
|
|
94
|
+
version = "0.4.27"
|
|
95
95
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
96
|
-
checksum = "
|
|
96
|
+
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
|
|
97
97
|
|
|
98
98
|
[[package]]
|
|
99
99
|
name = "memoffset"
|
|
@@ -118,9 +118,9 @@ dependencies = [
|
|
|
118
118
|
|
|
119
119
|
[[package]]
|
|
120
120
|
name = "once_cell"
|
|
121
|
-
version = "1.
|
|
121
|
+
version = "1.21.3"
|
|
122
122
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
123
|
-
checksum = "
|
|
123
|
+
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
|
|
124
124
|
|
|
125
125
|
[[package]]
|
|
126
126
|
name = "parking_lot_core"
|
|
@@ -137,24 +137,24 @@ dependencies = [
|
|
|
137
137
|
|
|
138
138
|
[[package]]
|
|
139
139
|
name = "portable-atomic"
|
|
140
|
-
version = "1.
|
|
140
|
+
version = "1.11.0"
|
|
141
141
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
142
|
-
checksum = "
|
|
142
|
+
checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
|
|
143
143
|
|
|
144
144
|
[[package]]
|
|
145
145
|
name = "proc-macro2"
|
|
146
|
-
version = "1.0.
|
|
146
|
+
version = "1.0.95"
|
|
147
147
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
148
|
-
checksum = "
|
|
148
|
+
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
|
|
149
149
|
dependencies = [
|
|
150
150
|
"unicode-ident",
|
|
151
151
|
]
|
|
152
152
|
|
|
153
153
|
[[package]]
|
|
154
154
|
name = "pyo3"
|
|
155
|
-
version = "0.
|
|
155
|
+
version = "0.24.1"
|
|
156
156
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
157
|
-
checksum = "
|
|
157
|
+
checksum = "17da310086b068fbdcefbba30aeb3721d5bb9af8db4987d6735b2183ca567229"
|
|
158
158
|
dependencies = [
|
|
159
159
|
"anyhow",
|
|
160
160
|
"cfg-if",
|
|
@@ -171,9 +171,9 @@ dependencies = [
|
|
|
171
171
|
|
|
172
172
|
[[package]]
|
|
173
173
|
name = "pyo3-build-config"
|
|
174
|
-
version = "0.
|
|
174
|
+
version = "0.24.1"
|
|
175
175
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
176
|
-
checksum = "
|
|
176
|
+
checksum = "e27165889bd793000a098bb966adc4300c312497ea25cf7a690a9f0ac5aa5fc1"
|
|
177
177
|
dependencies = [
|
|
178
178
|
"once_cell",
|
|
179
179
|
"python3-dll-a",
|
|
@@ -182,9 +182,9 @@ dependencies = [
|
|
|
182
182
|
|
|
183
183
|
[[package]]
|
|
184
184
|
name = "pyo3-ffi"
|
|
185
|
-
version = "0.
|
|
185
|
+
version = "0.24.1"
|
|
186
186
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
187
|
-
checksum = "
|
|
187
|
+
checksum = "05280526e1dbf6b420062f3ef228b78c0c54ba94e157f5cb724a609d0f2faabc"
|
|
188
188
|
dependencies = [
|
|
189
189
|
"libc",
|
|
190
190
|
"pyo3-build-config",
|
|
@@ -192,9 +192,9 @@ dependencies = [
|
|
|
192
192
|
|
|
193
193
|
[[package]]
|
|
194
194
|
name = "pyo3-macros"
|
|
195
|
-
version = "0.
|
|
195
|
+
version = "0.24.1"
|
|
196
196
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
197
|
-
checksum = "
|
|
197
|
+
checksum = "5c3ce5686aa4d3f63359a5100c62a127c9f15e8398e5fdeb5deef1fed5cd5f44"
|
|
198
198
|
dependencies = [
|
|
199
199
|
"proc-macro2",
|
|
200
200
|
"pyo3-macros-backend",
|
|
@@ -204,9 +204,9 @@ dependencies = [
|
|
|
204
204
|
|
|
205
205
|
[[package]]
|
|
206
206
|
name = "pyo3-macros-backend"
|
|
207
|
-
version = "0.
|
|
207
|
+
version = "0.24.1"
|
|
208
208
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
209
|
-
checksum = "
|
|
209
|
+
checksum = "f4cf6faa0cbfb0ed08e89beb8103ae9724eb4750e3a78084ba4017cbe94f3855"
|
|
210
210
|
dependencies = [
|
|
211
211
|
"heck",
|
|
212
212
|
"proc-macro2",
|
|
@@ -217,34 +217,34 @@ dependencies = [
|
|
|
217
217
|
|
|
218
218
|
[[package]]
|
|
219
219
|
name = "python3-dll-a"
|
|
220
|
-
version = "0.2.
|
|
220
|
+
version = "0.2.13"
|
|
221
221
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
222
|
-
checksum = "
|
|
222
|
+
checksum = "49fe4227a288cf9493942ad0220ea3f185f4d1f2a14f197f7344d6d02f4ed4ed"
|
|
223
223
|
dependencies = [
|
|
224
224
|
"cc",
|
|
225
225
|
]
|
|
226
226
|
|
|
227
227
|
[[package]]
|
|
228
228
|
name = "quote"
|
|
229
|
-
version = "1.0.
|
|
229
|
+
version = "1.0.40"
|
|
230
230
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
231
|
-
checksum = "
|
|
231
|
+
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
|
|
232
232
|
dependencies = [
|
|
233
233
|
"proc-macro2",
|
|
234
234
|
]
|
|
235
235
|
|
|
236
236
|
[[package]]
|
|
237
237
|
name = "redox_syscall"
|
|
238
|
-
version = "0.5.
|
|
238
|
+
version = "0.5.11"
|
|
239
239
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
240
|
-
checksum = "
|
|
240
|
+
checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
|
|
241
241
|
dependencies = [
|
|
242
242
|
"bitflags",
|
|
243
243
|
]
|
|
244
244
|
|
|
245
245
|
[[package]]
|
|
246
246
|
name = "rloop"
|
|
247
|
-
version = "0.1.
|
|
247
|
+
version = "0.1.1"
|
|
248
248
|
dependencies = [
|
|
249
249
|
"anyhow",
|
|
250
250
|
"dashmap",
|
|
@@ -269,9 +269,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
|
|
269
269
|
|
|
270
270
|
[[package]]
|
|
271
271
|
name = "smallvec"
|
|
272
|
-
version = "1.
|
|
272
|
+
version = "1.15.0"
|
|
273
273
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
274
|
-
checksum = "
|
|
274
|
+
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
|
|
275
275
|
|
|
276
276
|
[[package]]
|
|
277
277
|
name = "socket2"
|
|
@@ -285,9 +285,9 @@ dependencies = [
|
|
|
285
285
|
|
|
286
286
|
[[package]]
|
|
287
287
|
name = "syn"
|
|
288
|
-
version = "2.0.
|
|
288
|
+
version = "2.0.100"
|
|
289
289
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
290
|
-
checksum = "
|
|
290
|
+
checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
|
|
291
291
|
dependencies = [
|
|
292
292
|
"proc-macro2",
|
|
293
293
|
"quote",
|
|
@@ -296,21 +296,21 @@ dependencies = [
|
|
|
296
296
|
|
|
297
297
|
[[package]]
|
|
298
298
|
name = "target-lexicon"
|
|
299
|
-
version = "0.
|
|
299
|
+
version = "0.13.2"
|
|
300
300
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
301
|
-
checksum = "
|
|
301
|
+
checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
|
|
302
302
|
|
|
303
303
|
[[package]]
|
|
304
304
|
name = "unicode-ident"
|
|
305
|
-
version = "1.0.
|
|
305
|
+
version = "1.0.18"
|
|
306
306
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
307
|
-
checksum = "
|
|
307
|
+
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
|
308
308
|
|
|
309
309
|
[[package]]
|
|
310
310
|
name = "unindent"
|
|
311
|
-
version = "0.2.
|
|
311
|
+
version = "0.2.4"
|
|
312
312
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
313
|
-
checksum = "
|
|
313
|
+
checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
|
|
314
314
|
|
|
315
315
|
[[package]]
|
|
316
316
|
name = "wasi"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "rloop"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.1"
|
|
4
4
|
description = "An asyncio event loop implemented in Rust"
|
|
5
5
|
authors = ["Giovanni Barillari <g@baro.dev>"]
|
|
6
6
|
license = "BSD-3-Clause"
|
|
@@ -33,14 +33,14 @@ crate-type = ["cdylib"]
|
|
|
33
33
|
anyhow = "=1.0"
|
|
34
34
|
dashmap = { version = "=6.1", features = ["inline"] }
|
|
35
35
|
mio = { version = "=1.0", features = ["net", "os-ext", "os-poll"] }
|
|
36
|
-
pyo3 = { version = "=0.
|
|
37
|
-
socket2 = "=0.5"
|
|
36
|
+
pyo3 = { version = "=0.24", features = ["anyhow", "extension-module", "generate-import-lib"] }
|
|
37
|
+
socket2 = { version = "=0.5", features = ["all"] }
|
|
38
38
|
|
|
39
39
|
[target.'cfg(unix)'.dependencies]
|
|
40
40
|
libc = "0.2.159"
|
|
41
41
|
|
|
42
42
|
[build-dependencies]
|
|
43
|
-
pyo3-build-config = "=0.
|
|
43
|
+
pyo3-build-config = "=0.24"
|
|
44
44
|
|
|
45
45
|
[profile.release]
|
|
46
46
|
codegen-units = 1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rloop
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: BSD License
|
|
@@ -16,9 +16,9 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
|
16
16
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
17
17
|
Classifier: Programming Language :: Python
|
|
18
18
|
Classifier: Programming Language :: Rust
|
|
19
|
-
Requires-Dist: ruff
|
|
20
|
-
Requires-Dist: pytest
|
|
21
|
-
Requires-Dist: pytest-asyncio
|
|
19
|
+
Requires-Dist: ruff~=0.5.0 ; extra == 'lint'
|
|
20
|
+
Requires-Dist: pytest~=7.4.2 ; extra == 'test'
|
|
21
|
+
Requires-Dist: pytest-asyncio~=0.21.1 ; extra == 'test'
|
|
22
22
|
Requires-Dist: rloop[lint,test] ; extra == 'dev'
|
|
23
23
|
Provides-Extra: lint
|
|
24
24
|
Provides-Extra: test
|
|
@@ -38,10 +38,11 @@ Project-URL: Source, https://github.com/gi0baro/rloop
|
|
|
38
38
|
|
|
39
39
|
# RLoop
|
|
40
40
|
|
|
41
|
-
RLoop is an [AsyncIO](https://docs.python.org/3/library/asyncio.html) event loop implemented in Rust on top of the [mio crate](https://github.com/tokio-rs/mio).
|
|
41
|
+
RLoop is an [AsyncIO](https://docs.python.org/3/library/asyncio.html) selector event loop implemented in Rust on top of the [mio crate](https://github.com/tokio-rs/mio).
|
|
42
42
|
|
|
43
|
-
>
|
|
44
|
-
|
|
43
|
+
> **Warning**: RLoop is currently a work in progress and definitely not suited for *production usage*.
|
|
44
|
+
|
|
45
|
+
> **Note:** RLoop is available on Unix systems only.
|
|
45
46
|
|
|
46
47
|
## Installation
|
|
47
48
|
|
|
@@ -60,6 +61,28 @@ loop = asyncio.new_event_loop()
|
|
|
60
61
|
asyncio.set_event_loop(loop)
|
|
61
62
|
```
|
|
62
63
|
|
|
64
|
+
## Differences from stdlib
|
|
65
|
+
|
|
66
|
+
At current time, when compared with the stdlib's event loop, RLoop doesn't support the following features:
|
|
67
|
+
|
|
68
|
+
- UDP
|
|
69
|
+
- Unix Domain Sockets
|
|
70
|
+
- SSL
|
|
71
|
+
- debugging
|
|
72
|
+
|
|
73
|
+
RLoop also doesn't implement the following methods:
|
|
74
|
+
|
|
75
|
+
- `loop.sendfile`
|
|
76
|
+
- `loop.connect_accepted_socket`
|
|
77
|
+
- `loop.sock_recvfrom`
|
|
78
|
+
- `loop.sock_recvfrom_into`
|
|
79
|
+
- `loop.sock_sendto`
|
|
80
|
+
- `loop.sock_sendfile`
|
|
81
|
+
|
|
82
|
+
### `call_later` with negative delays
|
|
83
|
+
|
|
84
|
+
While the stdlib's event loop will use the actual delay of callbacks when `call_later` is used with negative numbers, RLoop will treat those as `call_soon`, and thus the effective order will follow the invocation order, not the delay.
|
|
85
|
+
|
|
63
86
|
## License
|
|
64
87
|
|
|
65
88
|
RLoop is released under the BSD License.
|
rloop-0.1.1/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# RLoop
|
|
2
|
+
|
|
3
|
+
RLoop is an [AsyncIO](https://docs.python.org/3/library/asyncio.html) selector event loop implemented in Rust on top of the [mio crate](https://github.com/tokio-rs/mio).
|
|
4
|
+
|
|
5
|
+
> **Warning**: RLoop is currently a work in progress and definitely not suited for *production usage*.
|
|
6
|
+
|
|
7
|
+
> **Note:** RLoop is available on Unix systems only.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install rloop
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import asyncio
|
|
19
|
+
import rloop
|
|
20
|
+
|
|
21
|
+
asyncio.set_event_loop_policy(rloop.EventLoopPolicy())
|
|
22
|
+
loop = asyncio.new_event_loop()
|
|
23
|
+
asyncio.set_event_loop(loop)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Differences from stdlib
|
|
27
|
+
|
|
28
|
+
At current time, when compared with the stdlib's event loop, RLoop doesn't support the following features:
|
|
29
|
+
|
|
30
|
+
- UDP
|
|
31
|
+
- Unix Domain Sockets
|
|
32
|
+
- SSL
|
|
33
|
+
- debugging
|
|
34
|
+
|
|
35
|
+
RLoop also doesn't implement the following methods:
|
|
36
|
+
|
|
37
|
+
- `loop.sendfile`
|
|
38
|
+
- `loop.connect_accepted_socket`
|
|
39
|
+
- `loop.sock_recvfrom`
|
|
40
|
+
- `loop.sock_recvfrom_into`
|
|
41
|
+
- `loop.sock_sendto`
|
|
42
|
+
- `loop.sock_sendfile`
|
|
43
|
+
|
|
44
|
+
### `call_later` with negative delays
|
|
45
|
+
|
|
46
|
+
While the stdlib's event loop will use the actual delay of callbacks when `call_later` is used with negative numbers, RLoop will treat those as `call_soon`, and thus the effective order will follow the invocation order, not the delay.
|
|
47
|
+
|
|
48
|
+
## License
|
|
49
|
+
|
|
50
|
+
RLoop is released under the BSD License.
|
|
@@ -45,6 +45,7 @@ class EventLoop:
|
|
|
45
45
|
def _ssock_del(self, fd): ...
|
|
46
46
|
def _tcp_conn(self, sock, protocol_factory: Callable[[], T]) -> Tuple[Any, T]: ...
|
|
47
47
|
def _tcp_server(self, socks, rsocks, protocol_factory, backlog) -> Server: ...
|
|
48
|
+
def _tcp_stream_bound(self, fd) -> bool: ...
|
|
48
49
|
def add_reader(self, fd, callback, *args) -> CBHandle: ...
|
|
49
50
|
def add_writer(self, fd, callback, *args) -> CBHandle: ...
|
|
50
51
|
def call_soon(self, callback, *args, context=None) -> CBHandle: ...
|
|
@@ -54,12 +55,10 @@ class EventLoop:
|
|
|
54
55
|
|
|
55
56
|
class Server:
|
|
56
57
|
_loop: Any
|
|
57
|
-
_sff: Any
|
|
58
58
|
_sockets: list[int]
|
|
59
59
|
|
|
60
|
-
# def _add_waiter(self, waiter): ...
|
|
61
60
|
def _close(self): ...
|
|
61
|
+
def _is_serving(self) -> bool: ...
|
|
62
62
|
def _start_serving(self): ...
|
|
63
|
-
def
|
|
64
|
-
def
|
|
65
|
-
def is_serving(self) -> bool: ...
|
|
63
|
+
def _streams_abort(self): ...
|
|
64
|
+
def _streams_close(self): ...
|
|
@@ -21,6 +21,7 @@ from ._compat import _PY_311, _PYV
|
|
|
21
21
|
from ._rloop import CBHandle, EventLoop as __BaseLoop, TimerHandle
|
|
22
22
|
from .exc import _exception_handler
|
|
23
23
|
from .futures import _SyncSockReaderFuture, _SyncSockWriterFuture
|
|
24
|
+
from .server import Server
|
|
24
25
|
from .subprocess import (
|
|
25
26
|
_PidfdChildWatcher,
|
|
26
27
|
_PipeReadTransport,
|
|
@@ -346,14 +347,14 @@ class RLoop(__BaseLoop, __asyncio.AbstractEventLoop):
|
|
|
346
347
|
raise ValueError('host/port and sock can not be specified at the same time')
|
|
347
348
|
|
|
348
349
|
infos = await self._ensure_resolved(
|
|
349
|
-
(host, port), family=family, type=socket.SOCK_STREAM, proto=proto, flags=flags
|
|
350
|
+
(host, port), family=family, type=socket.SOCK_STREAM, proto=proto, flags=flags
|
|
350
351
|
)
|
|
351
352
|
if not infos:
|
|
352
353
|
raise OSError('getaddrinfo() returned empty list')
|
|
353
354
|
|
|
354
355
|
if local_addr is not None:
|
|
355
356
|
laddr_infos = await self._ensure_resolved(
|
|
356
|
-
local_addr, family=family, type=socket.SOCK_STREAM, proto=proto, flags=flags
|
|
357
|
+
local_addr, family=family, type=socket.SOCK_STREAM, proto=proto, flags=flags
|
|
357
358
|
)
|
|
358
359
|
if not laddr_infos:
|
|
359
360
|
raise OSError('getaddrinfo() returned empty list')
|
|
@@ -583,10 +584,10 @@ class RLoop(__BaseLoop, __asyncio.AbstractEventLoop):
|
|
|
583
584
|
# server = self._tcp_server(sockets, rsocks, protocol_factory, backlog,
|
|
584
585
|
# ssl, ssl_handshake_timeout,
|
|
585
586
|
# ssl_shutdown_timeout)
|
|
586
|
-
server = self._tcp_server(sockets, rsocks, protocol_factory, backlog)
|
|
587
|
+
server = Server(self._tcp_server(sockets, rsocks, protocol_factory, backlog))
|
|
587
588
|
|
|
588
589
|
if start_serving:
|
|
589
|
-
server.
|
|
590
|
+
await server.start_serving()
|
|
590
591
|
|
|
591
592
|
return server
|
|
592
593
|
|
|
@@ -750,9 +751,21 @@ class RLoop(__BaseLoop, __asyncio.AbstractEventLoop):
|
|
|
750
751
|
self.call_soon_threadsafe(transp._process_exited, returncode)
|
|
751
752
|
|
|
752
753
|
#: completion based I/O methods
|
|
754
|
+
def _ensure_fd_no_transport(self, fd):
|
|
755
|
+
fileno = fd
|
|
756
|
+
if not isinstance(fileno, int):
|
|
757
|
+
try:
|
|
758
|
+
fileno = int(fileno.fileno())
|
|
759
|
+
except (AttributeError, TypeError, ValueError):
|
|
760
|
+
raise ValueError(f'Invalid file object: {fd!r}') from None
|
|
761
|
+
if self._tcp_stream_bound(fileno):
|
|
762
|
+
raise RuntimeError(f'File descriptor {fd!r} is used by transport')
|
|
763
|
+
|
|
753
764
|
def sock_recv(self, sock, nbytes) -> _Future:
|
|
754
765
|
future = _SyncSockReaderFuture(sock, self)
|
|
755
|
-
|
|
766
|
+
fd = sock.fileno()
|
|
767
|
+
self._ensure_fd_no_transport(fd)
|
|
768
|
+
self.add_reader(fd, self._sock_recv, future, sock, nbytes)
|
|
756
769
|
return future
|
|
757
770
|
|
|
758
771
|
def _sock_recv(self, fut, sock, n):
|
|
@@ -771,7 +784,9 @@ class RLoop(__BaseLoop, __asyncio.AbstractEventLoop):
|
|
|
771
784
|
|
|
772
785
|
def sock_recv_into(self, sock, buf) -> _Future:
|
|
773
786
|
future = _SyncSockReaderFuture(sock, self)
|
|
774
|
-
|
|
787
|
+
fd = sock.fileno()
|
|
788
|
+
self._ensure_fd_no_transport(fd)
|
|
789
|
+
self.add_reader(fd, self._sock_recv_into, future, sock, buf)
|
|
775
790
|
return future
|
|
776
791
|
|
|
777
792
|
def _sock_recv_into(self, fut, sock, buf):
|
|
@@ -808,8 +823,10 @@ class RLoop(__BaseLoop, __asyncio.AbstractEventLoop):
|
|
|
808
823
|
data = memoryview(data)
|
|
809
824
|
data = data[n:]
|
|
810
825
|
|
|
826
|
+
fd = sock.fileno()
|
|
827
|
+
self._ensure_fd_no_transport(fd)
|
|
811
828
|
future = _SyncSockWriterFuture(sock, self)
|
|
812
|
-
self.add_writer(
|
|
829
|
+
self.add_writer(fd, self._sock_sendall, future, sock, data)
|
|
813
830
|
return await future
|
|
814
831
|
|
|
815
832
|
def _sock_sendall(self, fut, sock, data):
|
|
@@ -865,8 +882,10 @@ class RLoop(__BaseLoop, __asyncio.AbstractEventLoop):
|
|
|
865
882
|
else:
|
|
866
883
|
return
|
|
867
884
|
|
|
885
|
+
fd = sock.fileno()
|
|
886
|
+
self._ensure_fd_no_transport(fd)
|
|
868
887
|
future = _SyncSockWriterFuture(sock, self)
|
|
869
|
-
self.add_writer(
|
|
888
|
+
self.add_writer(fd, self._sock_connect_cb, future, sock, address)
|
|
870
889
|
return future
|
|
871
890
|
|
|
872
891
|
def _sock_connect_cb(self, fut, sock, address):
|
|
@@ -887,8 +906,10 @@ class RLoop(__BaseLoop, __asyncio.AbstractEventLoop):
|
|
|
887
906
|
self.remove_writer(sock.fileno())
|
|
888
907
|
|
|
889
908
|
def sock_accept(self, sock) -> _Future:
|
|
909
|
+
fd = sock.fileno()
|
|
910
|
+
self._ensure_fd_no_transport(fd)
|
|
890
911
|
future = _SyncSockReaderFuture(sock, self)
|
|
891
|
-
self.add_reader(
|
|
912
|
+
self.add_reader(fd, self._sock_accept, future, sock)
|
|
892
913
|
return future
|
|
893
914
|
|
|
894
915
|
def _sock_accept(self, fut, sock):
|
|
@@ -4,14 +4,21 @@ import asyncio.trsock
|
|
|
4
4
|
from ._rloop import Server as _Server
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
class Server
|
|
8
|
-
__slots__ = []
|
|
7
|
+
class Server:
|
|
8
|
+
__slots__ = ['_inner', '_sff']
|
|
9
|
+
|
|
10
|
+
def __init__(self, inner: _Server):
|
|
11
|
+
self._inner = inner
|
|
12
|
+
self._sff = None
|
|
9
13
|
|
|
10
14
|
def get_loop(self):
|
|
11
|
-
return self._loop
|
|
15
|
+
return self._inner._loop
|
|
16
|
+
|
|
17
|
+
def is_serving(self):
|
|
18
|
+
return self._inner._is_serving()
|
|
12
19
|
|
|
13
20
|
async def start_serving(self):
|
|
14
|
-
self._start_serving()
|
|
21
|
+
self._inner._start_serving()
|
|
15
22
|
|
|
16
23
|
async def serve_forever(self):
|
|
17
24
|
if self._sff is not None:
|
|
@@ -19,7 +26,7 @@ class Server(_Server):
|
|
|
19
26
|
# if self._servers is None:
|
|
20
27
|
# raise RuntimeError(f'server {self!r} is closed')
|
|
21
28
|
|
|
22
|
-
self._start_serving()
|
|
29
|
+
self._inner._start_serving()
|
|
23
30
|
self._sff = self._loop.create_future()
|
|
24
31
|
|
|
25
32
|
try:
|
|
@@ -33,6 +40,9 @@ class Server(_Server):
|
|
|
33
40
|
finally:
|
|
34
41
|
self._sff = None
|
|
35
42
|
|
|
43
|
+
async def wait_closed(self):
|
|
44
|
+
return
|
|
45
|
+
|
|
36
46
|
# async def wait_closed(self):
|
|
37
47
|
# # if self._servers is None or self._waiters is None:
|
|
38
48
|
# # return
|
|
@@ -52,12 +62,18 @@ class Server(_Server):
|
|
|
52
62
|
|
|
53
63
|
# self._serving = False
|
|
54
64
|
|
|
55
|
-
self._close()
|
|
65
|
+
self._inner._close()
|
|
56
66
|
|
|
57
67
|
if self._sff is not None and not self._sff.done():
|
|
58
68
|
self._sff.cancel()
|
|
59
69
|
self._sff = None
|
|
60
70
|
|
|
71
|
+
def close_clients(self):
|
|
72
|
+
self._inner._streams_close()
|
|
73
|
+
|
|
74
|
+
def abort_clients(self):
|
|
75
|
+
self._inner._streams_abort()
|
|
76
|
+
|
|
61
77
|
async def __aenter__(self):
|
|
62
78
|
return self
|
|
63
79
|
|
|
@@ -68,4 +84,4 @@ class Server(_Server):
|
|
|
68
84
|
# TODO
|
|
69
85
|
@property
|
|
70
86
|
def sockets(self):
|
|
71
|
-
return tuple(asyncio.trsock.TransportSocket(s) for s in self._sockets)
|
|
87
|
+
return tuple(asyncio.trsock.TransportSocket(s) for s in self._inner._sockets)
|