| //! Low level threading primitives |
| |
| #[cfg(not(target_os = "redox"))] |
| use crate::errno::Errno; |
| #[cfg(not(target_os = "redox"))] |
| use crate::Result; |
| use libc::{self, pthread_t}; |
| |
| /// Identifies an individual thread. |
| pub type Pthread = pthread_t; |
| |
| /// Obtain ID of the calling thread (see |
| /// [`pthread_self(3)`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_self.html) |
| /// |
| /// The thread ID returned by `pthread_self()` is not the same thing as |
| /// the kernel thread ID returned by a call to `gettid(2)`. |
| #[inline] |
| pub fn pthread_self() -> Pthread { |
| unsafe { libc::pthread_self() } |
| } |
| |
| feature! { |
| #![feature = "signal"] |
| |
| /// Send a signal to a thread (see [`pthread_kill(3)`]). |
| /// |
| /// If `signal` is `None`, `pthread_kill` will only preform error checking and |
| /// won't send any signal. |
| /// |
| /// [`pthread_kill(3)`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_kill.html |
| #[allow(clippy::not_unsafe_ptr_arg_deref)] |
| #[cfg(not(target_os = "redox"))] |
| pub fn pthread_kill<T>(thread: Pthread, signal: T) -> Result<()> |
| where T: Into<Option<crate::sys::signal::Signal>> |
| { |
| let sig = match signal.into() { |
| Some(s) => s as libc::c_int, |
| None => 0, |
| }; |
| let res = unsafe { libc::pthread_kill(thread, sig) }; |
| Errno::result(res).map(drop) |
| } |
| } |