1 //! Low level threading primitives 2 3 #[cfg(not(target_os = "redox"))] 4 use crate::errno::Errno; 5 #[cfg(not(target_os = "redox"))] 6 use crate::Result; 7 use libc::{self, pthread_t}; 8 9 /// Identifies an individual thread. 10 pub type Pthread = pthread_t; 11 12 /// Obtain ID of the calling thread (see 13 /// [`pthread_self(3)`](https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_self.html) 14 /// 15 /// The thread ID returned by `pthread_self()` is not the same thing as 16 /// the kernel thread ID returned by a call to `gettid(2)`. 17 #[inline] pthread_self() -> Pthread18pub fn pthread_self() -> Pthread { 19 unsafe { libc::pthread_self() } 20 } 21 22 feature! { 23 #![feature = "signal"] 24 25 /// Send a signal to a thread (see [`pthread_kill(3)`]). 26 /// 27 /// If `signal` is `None`, `pthread_kill` will only preform error checking and 28 /// won't send any signal. 29 /// 30 /// [`pthread_kill(3)`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_kill.html 31 #[allow(clippy::not_unsafe_ptr_arg_deref)] 32 #[cfg(not(target_os = "redox"))] 33 pub fn pthread_kill<T>(thread: Pthread, signal: T) -> Result<()> 34 where T: Into<Option<crate::sys::signal::Signal>> 35 { 36 let sig = match signal.into() { 37 Some(s) => s as libc::c_int, 38 None => 0, 39 }; 40 let res = unsafe { libc::pthread_kill(thread, sig) }; 41 Errno::result(res).map(drop) 42 } 43 } 44