// Copyright (C) Microsoft Corporation. All rights reserved.

//! Pthread, a basic Linux pthread (pthread_t) wrapper to support send
//! and sync on musl.

use std::io;

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Pthread(libc::pthread_t);

// SAFETY: pthread_t is an opaque handle and is safe to share/send between
// threads. But it's a pointer type on musl so does not default to Send+Sync.
unsafe impl Send for Pthread {}
// SAFETY: see above comment.
unsafe impl Sync for Pthread {}

impl Pthread {
    /// Gets a Pthread object initialized with the caller thread.
    pub fn current() -> Self {
        // SAFETY: calling C API as documented, with no special requirements.
        Self(unsafe { libc::pthread_self() })
    }

    /// Sends a signal to Pthread's thread.
    pub fn signal(&self, signal: i32) -> io::Result<()> {
        // SAFETY: calling as documented, with no special requirements.
        unsafe {
            if libc::pthread_kill(self.0, signal) != 0 {
                return Err(io::Error::last_os_error());
            }
        }
        Ok(())
    }
}
