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.
Files changed (39) hide show
  1. {rloop-0.1.0a4 → rloop-0.1.1}/Cargo.lock +45 -45
  2. {rloop-0.1.0a4 → rloop-0.1.1}/Cargo.toml +4 -4
  3. {rloop-0.1.0a4 → rloop-0.1.1}/PKG-INFO +30 -7
  4. rloop-0.1.1/README.md +50 -0
  5. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/_rloop.pyi +4 -5
  6. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/loop.py +30 -9
  7. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/server.py +23 -7
  8. rloop-0.1.1/src/event_loop.rs +1164 -0
  9. rloop-0.1.1/src/handles.rs +206 -0
  10. {rloop-0.1.0a4 → rloop-0.1.1}/src/server.rs +17 -18
  11. {rloop-0.1.0a4 → rloop-0.1.1}/src/sock.rs +1 -1
  12. rloop-0.1.1/src/tcp.rs +719 -0
  13. {rloop-0.1.0a4 → rloop-0.1.1}/src/time.rs +2 -2
  14. rloop-0.1.1/src/utils.rs +27 -0
  15. rloop-0.1.1/tests/tcp/__init__.py +35 -0
  16. rloop-0.1.1/tests/tcp/test_tcp_conn.py +45 -0
  17. rloop-0.1.1/tests/tcp/test_tcp_server.py +80 -0
  18. rloop-0.1.1/tests/test_handles.py +59 -0
  19. {rloop-0.1.0a4 → rloop-0.1.1}/tests/test_sockets.py +5 -6
  20. rloop-0.1.1/tests/udp/test_udp.py +76 -0
  21. rloop-0.1.0a4/README.md +0 -27
  22. rloop-0.1.0a4/src/event_loop.rs +0 -1089
  23. rloop-0.1.0a4/src/handles.rs +0 -207
  24. rloop-0.1.0a4/src/tcp.rs +0 -768
  25. rloop-0.1.0a4/src/utils.rs +0 -12
  26. {rloop-0.1.0a4 → rloop-0.1.1}/LICENSE +0 -0
  27. {rloop-0.1.0a4 → rloop-0.1.1}/pyproject.toml +0 -0
  28. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/__init__.py +0 -0
  29. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/_compat.py +0 -0
  30. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/exc.py +0 -0
  31. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/futures.py +0 -0
  32. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/subprocess.py +0 -0
  33. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/transports.py +0 -0
  34. {rloop-0.1.0a4 → rloop-0.1.1}/rloop/utils.py +0 -0
  35. {rloop-0.1.0a4 → rloop-0.1.1}/src/io.rs +0 -0
  36. {rloop-0.1.0a4 → rloop-0.1.1}/src/lib.rs +0 -0
  37. {rloop-0.1.0a4 → rloop-0.1.1}/src/log.rs +0 -0
  38. {rloop-0.1.0a4 → rloop-0.1.1}/src/py.rs +0 -0
  39. {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.95"
7
+ version = "1.0.98"
8
8
  source = "registry+https://github.com/rust-lang/crates.io-index"
9
- checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
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.8.0"
19
+ version = "2.9.0"
20
20
  source = "registry+https://github.com/rust-lang/crates.io-index"
21
- checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
21
+ checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
22
22
 
23
23
  [[package]]
24
24
  name = "cc"
25
- version = "1.2.10"
25
+ version = "1.2.19"
26
26
  source = "registry+https://github.com/rust-lang/crates.io-index"
27
- checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229"
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.5"
72
+ version = "2.0.6"
73
73
  source = "registry+https://github.com/rust-lang/crates.io-index"
74
- checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
74
+ checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
75
75
 
76
76
  [[package]]
77
77
  name = "libc"
78
- version = "0.2.169"
78
+ version = "0.2.172"
79
79
  source = "registry+https://github.com/rust-lang/crates.io-index"
80
- checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
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.25"
94
+ version = "0.4.27"
95
95
  source = "registry+https://github.com/rust-lang/crates.io-index"
96
- checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
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.20.2"
121
+ version = "1.21.3"
122
122
  source = "registry+https://github.com/rust-lang/crates.io-index"
123
- checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
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.10.0"
140
+ version = "1.11.0"
141
141
  source = "registry+https://github.com/rust-lang/crates.io-index"
142
- checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6"
142
+ checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
143
143
 
144
144
  [[package]]
145
145
  name = "proc-macro2"
146
- version = "1.0.93"
146
+ version = "1.0.95"
147
147
  source = "registry+https://github.com/rust-lang/crates.io-index"
148
- checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
148
+ checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
149
149
  dependencies = [
150
150
  "unicode-ident",
151
151
  ]
152
152
 
153
153
  [[package]]
154
154
  name = "pyo3"
155
- version = "0.23.4"
155
+ version = "0.24.1"
156
156
  source = "registry+https://github.com/rust-lang/crates.io-index"
157
- checksum = "57fe09249128b3173d092de9523eaa75136bf7ba85e0d69eca241c7939c933cc"
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.23.4"
174
+ version = "0.24.1"
175
175
  source = "registry+https://github.com/rust-lang/crates.io-index"
176
- checksum = "1cd3927b5a78757a0d71aa9dff669f903b1eb64b54142a9bd9f757f8fde65fd7"
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.23.4"
185
+ version = "0.24.1"
186
186
  source = "registry+https://github.com/rust-lang/crates.io-index"
187
- checksum = "dab6bb2102bd8f991e7749f130a70d05dd557613e39ed2deeee8e9ca0c4d548d"
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.23.4"
195
+ version = "0.24.1"
196
196
  source = "registry+https://github.com/rust-lang/crates.io-index"
197
- checksum = "91871864b353fd5ffcb3f91f2f703a22a9797c91b9ab497b1acac7b07ae509c7"
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.23.4"
207
+ version = "0.24.1"
208
208
  source = "registry+https://github.com/rust-lang/crates.io-index"
209
- checksum = "43abc3b80bc20f3facd86cd3c60beed58c3e2aa26213f3cda368de39c60a27e4"
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.12"
220
+ version = "0.2.13"
221
221
  source = "registry+https://github.com/rust-lang/crates.io-index"
222
- checksum = "9b66f9171950e674e64bad3456e11bb3cca108e5c34844383cfe277f45c8a7a8"
222
+ checksum = "49fe4227a288cf9493942ad0220ea3f185f4d1f2a14f197f7344d6d02f4ed4ed"
223
223
  dependencies = [
224
224
  "cc",
225
225
  ]
226
226
 
227
227
  [[package]]
228
228
  name = "quote"
229
- version = "1.0.38"
229
+ version = "1.0.40"
230
230
  source = "registry+https://github.com/rust-lang/crates.io-index"
231
- checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
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.8"
238
+ version = "0.5.11"
239
239
  source = "registry+https://github.com/rust-lang/crates.io-index"
240
- checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
240
+ checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
241
241
  dependencies = [
242
242
  "bitflags",
243
243
  ]
244
244
 
245
245
  [[package]]
246
246
  name = "rloop"
247
- version = "0.1.0-alpha4"
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.13.2"
272
+ version = "1.15.0"
273
273
  source = "registry+https://github.com/rust-lang/crates.io-index"
274
- checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
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.96"
288
+ version = "2.0.100"
289
289
  source = "registry+https://github.com/rust-lang/crates.io-index"
290
- checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
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.12.16"
299
+ version = "0.13.2"
300
300
  source = "registry+https://github.com/rust-lang/crates.io-index"
301
- checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
301
+ checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
302
302
 
303
303
  [[package]]
304
304
  name = "unicode-ident"
305
- version = "1.0.15"
305
+ version = "1.0.18"
306
306
  source = "registry+https://github.com/rust-lang/crates.io-index"
307
- checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243"
307
+ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
308
308
 
309
309
  [[package]]
310
310
  name = "unindent"
311
- version = "0.2.3"
311
+ version = "0.2.4"
312
312
  source = "registry+https://github.com/rust-lang/crates.io-index"
313
- checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
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.0-alpha4"
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.23", features = ["anyhow", "extension-module", "generate-import-lib"] }
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.23"
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.0a4
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 ~=0.5.0 ; extra == 'lint'
20
- Requires-Dist: pytest ~=7.4.2 ; extra == 'test'
21
- Requires-Dist: pytest-asyncio ~=0.21.1 ; extra == 'test'
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
- > [!WARNING]
44
- > Disclaimer: This is a work in progress and definitely not ready for production usage.
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 abort_clients(self): ...
64
- def close_clients(self): ...
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, loop=self
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, loop=self
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._start_serving()
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
- self.add_reader(sock.fileno(), self._sock_recv, future, sock, nbytes)
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
- self.add_reader(sock.fileno(), self._sock_recv_into, future, sock, buf)
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(sock.fileno(), self._sock_sendall, future, sock, data)
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(sock.fileno(), self._sock_connect_cb, future, sock, address)
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(sock.fileno(), self._sock_accept, future, sock)
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(_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)