質問編集履歴
2
tokio::sync::Mutex::try_lock を使った実装を追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,11 +16,11 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
### 発生している問題
|
19
|
+
### 発生している問題
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
-
`tokio::sync::Mutex` はロックを取得するのに `mutex.lock().await` する必要がありますが、 `await` は `AsyncWrite::poll_write` の中では使えないので困っています。上手く実装を与えることはできないのでしょうか?
|
23
|
+
`tokio::sync::Mutex` はロックを取得するのに `mutex.lock().await` する必要がありますが、 `await` は `AsyncWrite::poll_write` の中では使えないので困っています。上手く実装を与えることはできないのでしょうか?(追記した `try_lock` を使った実装は適切なのでしょうか? )
|
24
24
|
|
25
25
|
|
26
26
|
|
@@ -218,6 +218,64 @@
|
|
218
218
|
|
219
219
|
|
220
220
|
|
221
|
+
### 追記 2020-03-17 01:20
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
`tokio::sync::Mutex::try_lock()` を使うことで実装できました(これが適切な方針なのかは自信が無いのでアドバイスお願いします)
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
```rust
|
230
|
+
|
231
|
+
impl<T: AsyncWrite + Unpin> AsyncWrite for Progress<T> {
|
232
|
+
|
233
|
+
fn poll_write(
|
234
|
+
|
235
|
+
self: Pin<&mut Self>,
|
236
|
+
|
237
|
+
cx: &mut Context,
|
238
|
+
|
239
|
+
buf: &[u8]
|
240
|
+
|
241
|
+
) -> Poll<Result<usize, Error>> {
|
242
|
+
|
243
|
+
match self.0.try_lock() {
|
244
|
+
|
245
|
+
Ok(mut s) => {
|
246
|
+
|
247
|
+
let poll = Pin::new(&mut s.inner).poll_write(cx, buf);
|
248
|
+
|
249
|
+
if let Poll::Ready(Ok(n)) = poll {
|
250
|
+
|
251
|
+
s.size += n;
|
252
|
+
|
253
|
+
}
|
254
|
+
|
255
|
+
poll
|
256
|
+
|
257
|
+
},
|
258
|
+
|
259
|
+
Err(_e) => {
|
260
|
+
|
261
|
+
Poll::Pending
|
262
|
+
|
263
|
+
}
|
264
|
+
|
265
|
+
}
|
266
|
+
|
267
|
+
}
|
268
|
+
|
269
|
+
|
270
|
+
|
271
|
+
// poll_flush, poll_shutdown 略
|
272
|
+
|
273
|
+
}
|
274
|
+
|
275
|
+
```
|
276
|
+
|
277
|
+
|
278
|
+
|
221
279
|
### 補足情報(FW/ツールのバージョンなど)
|
222
280
|
|
223
281
|
rustc 1.41.1
|
1
タスクのリンクを変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
ある[タスク](https://docs.rs/tokio/0.2.13/tokio/task/index.html)で書き込みを行い、他のタスクから進捗を見る感じです。
|
7
|
+
ある[タスク](https://docs.rs/tokio/0.2.13/tokio/task/index.html#what-are-tasks)で書き込みを行い、他のタスクから進捗を見る感じです。
|
8
8
|
|
9
9
|
|
10
10
|
|