Expand description
panic_monitor helps you monitor your threads and deal with panics.
You might be tempted to use libstd’s JoinHandle
s for this use-case; however, they have two
major limitations:
JoinHandle::join
blocks the current thread. If you want to monitor multiple threads from a single “supervisor” thread, you would need something liketry_join
, and ideally you’d have an “epoll forJoinHandle
s” as well to avoid busy-waiting.JoinHandle
doesn’t implement these, however.- You can’t clone a
JoinHandle
. If you want multiple threads to be notified when a particular thread panics, you can’t use itsJoinHandle
to achieve it.
panic_monitor handles both of these issues. PanicMonitor::wait
allows you to specify a number
of threads. As soon as one of them panics, it returns a Thread
struct (which contains the name
and ID of the panicking thread). When calling PanicMonitor::wait
, you specify the watch-list
in terms of ThreadId
s. Since these are clonable, mulitple supervisor threads can monitor the
same worker thread.
Some other differences between PanicMonitor::wait
and JoinHandle::join
:
- You don’t receive the value which was passed to
panic
. (This would be impossible, given that such values are not required to implementClone
.) - You aren’t notified when a thread shuts down normally.
PanicMonitor
is for handling panicking threads only.
§Usage
Create a global PanicMonitor
using lazy_static
, and initialise it from your main thread.
Ideally you should do this before spawning any new threads.
#[macro_use] extern crate lazy_static;
extern crate panic_monitor;
use panic_monitor::PanicMonitor;
use std::thread;
use std::time::Duration;
lazy_static! {
static ref PANIC_MONITOR: PanicMonitor = PanicMonitor::new();
}
fn main() {
// Install a panic hook
PANIC_MONITOR.init();
let h = thread::spawn(|| {
thread::sleep(Duration::from_millis(100));
panic!();
});
PANIC_MONITOR.wait(&[h.thread().id()]);
// ^ this will block until the thread panics
PANIC_MONITOR.wait(&[h.thread().id()]);
// ^ this will return immediately, since the thread is already dead
h.join().unwrap_err();
}
Structs§
- Panic
Monitor - A list of all threads which have panicked, with the ability to notify interested parties when this list is updated.