cargo-binstall/crates/binstalk/src
Jiahao XU aa6012baae
Make extraction cancellable for bin and tar based formats (#481)
Extraction wasn't cancellable by `cancel_on_user_sig_term` used in `entry` since it calls `block_in_place`.

This PR adds cancellation support to it by adding a `static` variable `OnceCell` to `wait_on_cancellation_signal` so that once it returns `Ok(())`, all other calls to it after that point also returns `Ok(())` immediately.

`StreamReadable`, which is used in cancellation process, then stores a boxed future of `wait_on_cancellation_signal` and polled it in `BufReader::fill_buf`.

Note that for zip, the extraction process takes `File` instead of `StreamReadable` due to `io::Seek` requirement, so it cancelling during extraction for zip is still not possible.

This PR also optimized `extract_bin` and `extract_zip` by using `StreamReadable::copy` introduced to this PR instead of `io::copy`, which allocates an internal buffer on stack, which imposes extra copy.

It also fixed `StreamReadable::fill_buf` by ensuring that empty buffer is only returned on eof.

* Make `wait_on_cancellation_signal` pub
* Enable feature `parking_lot` of dep tokio
* Mod `wait_on_cancellation_signal`: Use `OnceCell` internally
   to archive the effect that once call to it return `Ok(())`, all calls to
   it after that also returns `Ok(())`.
* Impl `From<BinstallError>` for `io::Error`
* Impl cancellation on user signal in `StreamReadable`
* Fix err msg when cancelling during extraction in `ops::resolve`
* Optimize: Impl & use `StreamReadable::copy`
   which is same as `io::copy` but does not allocate any internal buffer
   since `StreamReadable` is buffered.
* Fix `next_stream`: Return non-empty bytes on `Ok(Some(bytes))`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
2022-10-13 13:31:13 +13:00
..
drivers Disable tcp_nodelay for reqwest::Client and add rate limiting for https requests (#458) 2022-10-07 15:51:34 +11:00
fetchers Disable tcp_nodelay for reqwest::Client and add rate limiting for https requests (#458) 2022-10-07 15:51:34 +11:00
helpers Make extraction cancellable for bin and tar based formats (#481) 2022-10-13 13:31:13 +13:00
manifests Improve auto discover (#433) 2022-09-28 02:52:14 +00:00
ops Make extraction cancellable for bin and tar based formats (#481) 2022-10-13 13:31:13 +13:00
bins.rs Add more to possible_dirs (#441) 2022-09-28 04:03:36 +00:00
drivers.rs Rename lib to binstalk (#361) 2022-09-10 16:44:18 +10:00
errors.rs Make extraction cancellable for bin and tar based formats (#481) 2022-10-13 13:31:13 +13:00
fetchers.rs Disable tcp_nodelay for reqwest::Client and add rate limiting for https requests (#458) 2022-10-07 15:51:34 +11:00
fs.rs Rename lib to binstalk (#361) 2022-09-10 16:44:18 +10:00
helpers.rs Rename lib to binstalk (#361) 2022-09-10 16:44:18 +10:00
lib.rs Support new cmdline option --roots (#389) 2022-09-17 20:34:36 +12:00
manifests.rs Rename lib to binstalk (#361) 2022-09-10 16:44:18 +10:00
ops.rs Rename lib to binstalk (#361) 2022-09-10 16:44:18 +10:00