Description
This use case may be a little obscure, so "we don't support that" is a perfectly reasonable response. But, just in case:
On a POSIX system, I have some shared data which I need to access from multiple threads but also from a signal handler. This is generally not possible:
Mutex
is based onpthread_mutex
, which is not async-signal-safe.- Even if it were, if a thread holding the lock gets a signal delivered, then the handler's attempt to acquire the lock that the thread already holds is forbidden, and will cause deadlocks or panics.
I can work around 2) by simply blocking the signals whenever I hold the lock.
I was hoping to use this crate to work around 1), but the std
feature means that I cannot count on this crate's spinlocks not to use std::thread::yield_now
, which (oddly) is not async-signal-safe.
Even if I don't enable the std
feature myself, crates used by multiple dependents are compiled with the union of the features requested by all those dependents. So if my crate happens to be used with someone else who wants spin
with the std
feature, then I get libc::sched_yield
calls in my signal handlers.
My concerns would be addressed if there were a separate Mutex
type that was guaranteed never to use sched_yield
or any other non-async-signal-safe system calls, regardless of which features were enabled.
Thanks for your consideration!