Input & Driver: Fix zombie processes on Unix (#39)
Linux/Unix requires that processes be waited, which is unfortunate as Windows lets us abandon them to the murderous whims of the OS. This PR adds Unix-specific behaviour to send a SIGINT before waiting on the process, and adds an additional thread per call for asset disposal on all platforms. Closes #38. --- * Close processes by SIGINT and wait on Unix This seems to remedy the Linux-specific zombie processes. Addition of nix as a dependency *should* be fine on Windows, since I believe it compiles to an empty crate. * Dispose of Tracks on auxiliary thread This adds a mechanism for the mixer threads to perform potentially expensive deallocation/cleanup outside of the main loop, preventing deadline misses etc. This should make misbehaving `wait`s a bit more friendly.
This commit is contained in:
18
src/driver/tasks/disposal.rs
Normal file
18
src/driver/tasks/disposal.rs
Normal file
@@ -0,0 +1,18 @@
|
||||
use super::message::*;
|
||||
use flume::Receiver;
|
||||
use tracing::instrument;
|
||||
|
||||
/// The mixer's disposal thread is also synchronous, due to tracks,
|
||||
/// inputs, etc. being based on synchronous I/O.
|
||||
///
|
||||
/// The mixer uses this to offload heavy and expensive drop operations
|
||||
/// to prevent deadline misses.
|
||||
#[instrument(skip(mix_rx))]
|
||||
pub(crate) fn runner(mix_rx: Receiver<DisposalMessage>) {
|
||||
loop {
|
||||
match mix_rx.recv() {
|
||||
Err(_) | Ok(DisposalMessage::Poison) => break,
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user