Commit Graph

104 Commits

Author SHA1 Message Date
John Nunley ed17f53035 v2.1.0
Signed-off-by: John Nunley <dev@notgull.net>
2024-02-18 08:47:04 -08:00
John Nunley b6c1ddea79 chore: Bump event-listener to v5.1.0
https://github.com/smol-rs/async-process/pull/70#issuecomment-1950955967

Signed-off-by: John Nunley <dev@notgull.net>
2024-02-17 22:03:44 -08:00
John Nunley 35a77ff266
m: Port to event-listener v5.0.0
cc smol-rs/event-listener#104

Signed-off-by: John Nunley <dev@notgull.net>
2024-02-12 06:26:10 -08:00
John Nunley d23ab0b6a3
v2.0.1
Signed-off-by: John Nunley <dev@notgull.net>
2023-11-24 07:48:05 -08:00
dependabot[bot] 0357928248 Update windows-sys requirement from 0.48 to 0.52
Updates the requirements on [windows-sys](https://github.com/microsoft/windows-rs) to permit the latest version.
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/compare/0.48.0...0.52.0)

---
updated-dependencies:
- dependency-name: windows-sys
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-20 22:24:19 +09:00
John Nunley d0993f8d0b
m: Bump to event-listener v4.0.0
Signed-off-by: John Nunley <dev@notgull.net>
2023-11-19 12:51:15 -08:00
John Nunley 90f343f0ad
v2.0.0
Signed-off-by: John Nunley <dev@notgull.net>
2023-10-31 18:26:06 -07:00
dependabot[bot] 54647bef65 Update async-lock requirement from 2.6.0 to 3.0.0
Updates the requirements on [async-lock](https://github.com/smol-rs/async-lock) to permit the latest version.
- [Release notes](https://github.com/smol-rs/async-lock/releases)
- [Changelog](https://github.com/smol-rs/async-lock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/smol-rs/async-lock/compare/v2.6.0...v3.0.0)

---
updated-dependencies:
- dependency-name: async-lock
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 10:38:54 +09:00
dependabot[bot] 297ac50224 Update futures-lite requirement from 1.11.0 to 2.0.0
Updates the requirements on [futures-lite](https://github.com/smol-rs/futures-lite) to permit the latest version.
- [Release notes](https://github.com/smol-rs/futures-lite/releases)
- [Changelog](https://github.com/smol-rs/futures-lite/blob/master/CHANGELOG.md)
- [Commits](https://github.com/smol-rs/futures-lite/compare/v1.11.0...v2.0.0)

---
updated-dependencies:
- dependency-name: futures-lite
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-30 10:34:17 +09:00
John Nunley 65cde366d4
Bump async-io to v2.0.0 and async-channel to v2.0.0
Signed-off-by: John Nunley <dev@notgull.net>
2023-10-28 19:04:54 -07:00
John Nunley f733a83c22
feat: Add a way to run without the async-process thread
I know I said that I wouldn't add any more features, but I
think this is important enough.

Right now, a thread called "async-process" is responsible for listening
for SIGCHLD and reaping zombie processes. This listens for the SIGCHLD
signal in Unix and uses a channel connected to the waitable handle on
Windows. While this works, we can do better. Through async-signal, the
signal was already asynchronous on Unix; we were already just using
async_io::block_on to wait on the signal. After swapping out the channel
used on Windows with async-channel, the process reaping function "reap"
can be reimplemented as a fully asynchronous future.

From here we must make sure this future is being polled at all times. To
facilitate this, a function named "driver()" is added to the public API.
This future acquires a lock on the reaper structure and calls the
"reap()" future indefinitely. Multiple drivers can be created at once;
they will just wait forever on this lock. This future is intended to be
spawned onto an executor and left to run forever, making sure all child
processes are signalled whenever necessary. If no tasks are running the
driver future, the "async-process" thread is spawned and runs the
"reap()" future itself.

I've added the following controls to make sure that this system is
robust:

- If a "driver" task is dropped, another "driver" task will acquire the
  lock and keep the reaper active.
- Before being dropped, the task checks to see if it is the last driver.
  If it is, it will spawn the "async-process" thread to be the driver.
- When a Child is being created, it checks if there are any active
  drivers. If there are none, it spawns the "async-process" thread
  itself.
- One concern is that the driver future wil try to spawn the
  "async-process" thread as the application exits and the task is being
  dropped, which will be unnecessary and lead to slower shutdowns. To
  prevent this, the future checks to see if there are any extant `Child`
  instances (a new refcount is added to Reaper to facilitate this). If
  there are none, and if there are no zombie processes, it does not
  spawn the additional thread.
- Someone can still `mem::forget()` the driver thread. This does not
  lead to undefined behavior and just leads to processes being left
  dangling. At this point they're asking for wacky behavior.

This strategy might also be viable for `async-io`, if we want to try to
avoid needing to spawn the additional thread there as well.

Closes #7
cc smol-rs/async-io#40

Signed-off-by: John Nunley <dev@notgull.net>
2023-10-10 17:47:46 -07:00
Taiki Endo 9f9351bc52
Migrate to Rust 2021 (#58) 2023-10-08 14:56:48 +09:00
John Nunley b29af2b72c
breaking: Remove the pre-exec extension function
The purpose for removing this function is twofold:

- It is the only unsafe code in this crate that can't be realistically
  replaced with safe code.
- It is a footgun anyways, and can be done anyways with Into::into() if
   users really want it.

This is a breaking change.

Signed-off-by: John Nunley <dev@notgull.net>
2023-10-07 21:06:27 -07:00
John Nunley 513b9262d7
v1.8.1
Signed-off-by: John Nunley <dev@notgull.net>
2023-10-07 18:48:22 -07:00
John Nunley ce7ded77e8
bugfix: Bump async-signal to v0.2.3
Extracted from #54, should fix #55

Signed-off-by: John Nunley <dev@notgull.net>
2023-10-05 19:02:10 -07:00
John Nunley 78342ab1db
v1.8.0
Signed-off-by: John Nunley <dev@notgull.net>
2023-09-25 09:58:59 -07:00
John Nunley 52a693e4dd
m: Centralize all global state into a single structure
Signed-off-by: John Nunley <dev@notgull.net>
2023-09-10 16:00:56 -07:00
John Nunley 5e8e0b7c7b
Upgrade to event-listener v3.0.0 (#43)
Signed-off-by: John Nunley <dev@notgull.net>
2023-09-10 12:57:24 -07:00
Taiki Endo ac1c639e3e Update actions/checkout action to v4 2023-09-10 18:19:38 +09:00
John Nunley 07165c72f5
Add smol-rs logo (#48) 2023-07-17 14:41:47 +09:00
dependabot[bot] 1715616859
m: Update rustix requirement from 0.37 to 0.38
Updates the requirements on [rustix](https://github.com/bytecodealliance/rustix) to permit the latest version.
- [Release notes](https://github.com/bytecodealliance/rustix/releases)
- [Commits](https://github.com/bytecodealliance/rustix/compare/v0.37.0...v0.38.2)

---
updated-dependencies:
- dependency-name: rustix
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-02 19:05:21 -07:00
John Nunley d45d6f1094
Use async-signal instead of signal-hook (#42) 2023-06-11 11:21:40 -07:00
Taiki Endo d9d97d0299 Fix clippy::needless_borrow warning
```
error: the borrowed expression implements the required traits
   --> src/lib.rs:212:57
    |
212 |                     signal_hook::iterator::Signals::new(&[signal_hook::consts::SIGCHLD])
    |                                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `[signal_hook::consts::SIGCHLD]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
    = note: `-D clippy::needless-borrow` implied by `-D warnings`

error: the borrowed expression implements the required traits
  --> tests/std.rs:14:38
   |
14 |             Command::new("cmd").args(&["/C", "exit 0"]).spawn()
   |                                      ^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "exit 0"]`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
   = note: `-D clippy::needless-borrow` implied by `-D warnings`

error: the borrowed expression implements the required traits
  --> tests/std.rs:35:38
   |
35 |             Command::new("cmd").args(&["/C", "exit 1"]).spawn()
   |                                      ^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "exit 1"]`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
  --> tests/std.rs:87:22
   |
87 |             cmd.args(&["/C", "echo foobar"]).stdout(Stdio::piped());
   |                      ^^^^^^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "echo foobar"]`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
   --> tests/std.rs:145:23
    |
145 |                 .args(&["/C", "exit 1"])
    |                       ^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "exit 1"]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
   --> tests/std.rs:156:23
    |
156 |                 .args(&["/C", "exit 0"])
    |                       ^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "exit 0"]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
   --> tests/std.rs:189:23
    |
189 |                 .args(&["/C", "echo hello"])
    |                       ^^^^^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "echo hello"]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
   --> tests/std.rs:213:23
    |
213 |                 .args(&["/C", "mkdir ."])
    |                       ^^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "mkdir ."]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
   --> tests/std.rs:231:38
    |
231 |             Command::new("cmd").args(&["/C", "exit 1"]).spawn().unwrap()
    |                                      ^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "exit 1"]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
   --> tests/std.rs:243:38
    |
243 |             Command::new("cmd").args(&["/C", "exit 1"]).spawn().unwrap()
    |                                      ^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "exit 1"]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow

error: the borrowed expression implements the required traits
   --> tests/std.rs:257:23
    |
257 |                 .args(&["/C", "echo hello"])
    |                       ^^^^^^^^^^^^^^^^^^^^^ help: change this to: `["/C", "echo hello"]`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
```
2023-06-11 22:26:44 +09:00
Taiki Endo 7eb60b1025 Bump MSRV to 1.63 2023-06-11 22:26:44 +09:00
John Nunley 5e48a40d6c
v1.7.0 (#41) 2023-04-07 10:47:16 -07:00
John Nunley 1a14d501cb
Fix minor typo in example.rs (#40) 2023-04-07 10:14:06 -07:00
Taiki Endo 01e36f4abe Update windows-sys to 0.48 2023-04-04 03:46:36 +09:00
Taiki Endo 99b9abc536 Minimize GITHUB_TOKEN permissions
Refs: https://github.blog/changelog/2021-04-20-github-actions-control-permissions-for-github_token
2023-03-26 16:35:52 +09:00
Taiki Endo 811dee59ac Set CARGO_NET_GIT_FETCH_WITH_CLI=true in CI 2023-03-26 16:35:38 +09:00
John Nunley e41847a378
ex: Add example for timed out process (#38) 2023-03-19 06:44:10 -07:00
dependabot[bot] 9f57bbfeb7 Update rustix requirement from 0.36 to 0.37
Updates the requirements on [rustix](https://github.com/bytecodealliance/rustix) to permit the latest version.
- [Release notes](https://github.com/bytecodealliance/rustix/releases)
- [Commits](https://github.com/bytecodealliance/rustix/compare/v0.36.0...v0.37.1)

---
updated-dependencies:
- dependency-name: rustix
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-06 12:14:46 +09:00
dependabot[bot] e84c3fd53c Update windows-sys requirement from 0.42 to 0.45
Updates the requirements on [windows-sys](https://github.com/microsoft/windows-rs) to permit the latest version.
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/compare/0.42.0...0.45.0)

---
updated-dependencies:
- dependency-name: windows-sys
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-23 11:32:45 +09:00
Taiki Endo e086897e53 Add windows::CommandExt::raw_arg on Rust 1.62+ 2022-12-30 14:31:53 +09:00
Taiki Endo f76d325959 Seal CommandExt trait
This is technically a breaking change, but we follow the standard
library's decision that sealing CommandExt is fine.
bfd1ccfb27
2022-12-30 14:31:53 +09:00
Taiki Endo 7980b4696a Reduce syscalls in blocking_fd 2022-12-30 13:43:50 +09:00
Taiki Endo 73f3f8f308 Fix clippy::needless_borrow warning
```
warning: the borrowed expression implements the required traits
   --> tests/std.rs:311:29
    |
311 |             cmd.env("PATH", &p);
    |                             ^^ help: change this to: `p`
    |
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
    = note: `#[warn(clippy::needless_borrow)]` on by default
```
2022-12-30 13:43:50 +09:00
Taiki Endo 93be5c2506 Replace direct dependency on libc with rustix 2022-12-30 13:43:50 +09:00
Taiki Endo 2a2c1ee34a Bump MSRV to 1.47
On Windows, we depend on blocking and async-task that require Rust 1.47.
2022-12-28 12:44:10 +09:00
Taiki Endo 8226196372 Enable dependabot update for Rust 2022-12-28 12:44:10 +09:00
Taiki Endo 8559816dc6 Clean up CI config 2022-12-28 12:44:10 +09:00
Taiki Endo 580be7ee06 Release 1.6.0 2022-11-27 16:39:21 +09:00
John Nunley de1071784e
Port to windows-sys (#27) 2022-11-26 21:14:01 -08:00
Taiki Endo f835f75f39 Fix build failure with minimal-versions 2022-11-27 13:31:38 +09:00
Taiki Endo e1d6664e5a Remove msrv field from .clippy.toml
Since Rust 1.64, Clippy respects `rust-version` field in Cargo.toml.
rust-lang/rust@b776fb8
2022-11-27 13:31:38 +09:00
John Nunley a44d0b418a
Port from once-cell to async-lock (#26) 2022-11-27 12:43:59 +09:00
Taiki Endo 115741b59a Update changelog 2022-08-21 18:25:48 +09:00
Taiki Endo 00f30f09e2 Release 1.5.0 2022-08-21 18:24:34 +09:00
John Nunley 8dda23e06b
Add `AsRawFd`/`AsFd` to the `ChildStd*` types (#23)
* add asrawfd/asfd impls

* fmt
2022-08-17 17:42:17 -07:00
Taiki Endo d9b78cb400 Fix clippy::needless_return warning in test
```
warning: unneeded `return` statement
  --> tests/std.rs:80:5
   |
80 |     return ret;
   |     ^^^^^^^^^^^ help: remove `return`: `ret`
   |
   = note: `#[warn(clippy::needless_return)]` on by default
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return
```
2022-07-17 21:32:20 +09:00
Taiki Endo fbc300608c Fix clippy::single_match warning in test
```
warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
  --> tests/std.rs:26:5
   |
26 | /     match Command::new("if-this-is-a-binary-then-the-world-has-ended").spawn() {
27 | |         Ok(..) => panic!(),
28 | |         Err(..) => {}
29 | |     }
   | |_____^ help: try this: `if let Ok(..) = Command::new("if-this-is-a-binary-then-the-world-has-ended").spawn() { panic!() }`
   |
   = note: `#[warn(clippy::single_match)]` on by default
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match
```
2022-07-17 21:31:38 +09:00