質問編集履歴

2

tokio::sync::Mutex::try_lock を使った実装を追記

2020/03/16 16:19

投稿

techno-tanoC
techno-tanoC

スコア24

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

タスクのリンクを変更

2020/03/16 16:19

投稿

techno-tanoC
techno-tanoC

スコア24

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