From 9749a193d629dd723562004879bca3e2d47e25a1 Mon Sep 17 00:00:00 2001 From: Peter Atashian Date: Thu, 3 Dec 2015 21:58:00 -0500 Subject: [PATCH] Add JoinHandleExt to get the pthread_t on unix platforms Signed-off-by: Peter Atashian --- src/libstd/os/android/raw.rs | 4 +++ src/libstd/os/bitrig/raw.rs | 2 ++ src/libstd/os/dragonfly/raw.rs | 2 ++ src/libstd/os/freebsd/raw.rs | 2 ++ src/libstd/os/ios/raw.rs | 2 ++ src/libstd/os/linux/raw.rs | 4 +++ src/libstd/os/macos/raw.rs | 2 ++ src/libstd/os/nacl/raw.rs | 2 ++ src/libstd/os/netbsd/raw.rs | 2 ++ src/libstd/os/openbsd/raw.rs | 2 ++ src/libstd/sys/unix/ext/mod.rs | 1 + src/libstd/sys/unix/ext/raw.rs | 3 +++ src/libstd/sys/unix/ext/thread.rs | 43 +++++++++++++++++++++++++++++++ src/libstd/sys/unix/thread.rs | 8 ++++++ 14 files changed, 79 insertions(+) create mode 100644 src/libstd/sys/unix/ext/thread.rs diff --git a/src/libstd/os/android/raw.rs b/src/libstd/os/android/raw.rs index fe28a73875696..e58ba03ec67ae 100644 --- a/src/libstd/os/android/raw.rs +++ b/src/libstd/os/android/raw.rs @@ -12,6 +12,10 @@ #![stable(feature = "raw_ext", since = "1.1.0")] +use os::raw::c_long; + +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = c_long; + #[doc(inline)] #[stable(feature = "raw_ext", since = "1.1.0")] pub use self::arch::{dev_t, mode_t, blkcnt_t, blksize_t, ino_t, nlink_t, off_t, stat, time_t}; diff --git a/src/libstd/os/bitrig/raw.rs b/src/libstd/os/bitrig/raw.rs index 45e46b252a4ab..81de8810cba5d 100644 --- a/src/libstd/os/bitrig/raw.rs +++ b/src/libstd/os/bitrig/raw.rs @@ -25,6 +25,8 @@ use os::unix::raw::{uid_t, gid_t}; #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i64; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[repr(C)] #[derive(Clone)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/os/dragonfly/raw.rs b/src/libstd/os/dragonfly/raw.rs index cb692b0662aad..581aebebc034f 100644 --- a/src/libstd/os/dragonfly/raw.rs +++ b/src/libstd/os/dragonfly/raw.rs @@ -25,6 +25,8 @@ use os::unix::raw::{uid_t, gid_t}; #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i64; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[repr(C)] #[derive(Clone)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/os/freebsd/raw.rs b/src/libstd/os/freebsd/raw.rs index cb8fadbfd6edf..a1e39721bcf63 100644 --- a/src/libstd/os/freebsd/raw.rs +++ b/src/libstd/os/freebsd/raw.rs @@ -21,6 +21,8 @@ #[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type fflags_t = u32; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[doc(inline)] #[stable(feature = "raw_ext", since = "1.1.0")] pub use self::arch::{stat, time_t}; diff --git a/src/libstd/os/ios/raw.rs b/src/libstd/os/ios/raw.rs index aeb3e993a72f4..20fe833a98076 100644 --- a/src/libstd/os/ios/raw.rs +++ b/src/libstd/os/ios/raw.rs @@ -24,6 +24,8 @@ use os::unix::raw::{uid_t, gid_t}; #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = c_long; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[repr(C)] #[derive(Clone)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/os/linux/raw.rs b/src/libstd/os/linux/raw.rs index 35de9bfc194d6..f44199f311bfa 100644 --- a/src/libstd/os/linux/raw.rs +++ b/src/libstd/os/linux/raw.rs @@ -12,9 +12,13 @@ #![stable(feature = "raw_ext", since = "1.1.0")] +use os::raw::c_ulong; + #[stable(feature = "raw_ext", since = "1.1.0")] pub type dev_t = u64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type mode_t = u32; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = c_ulong; + #[doc(inline)] #[stable(feature = "raw_ext", since = "1.1.0")] pub use self::arch::{off_t, ino_t, nlink_t, blksize_t, blkcnt_t, stat, time_t}; diff --git a/src/libstd/os/macos/raw.rs b/src/libstd/os/macos/raw.rs index 4abd6f2d4dea3..1407132b9c96d 100644 --- a/src/libstd/os/macos/raw.rs +++ b/src/libstd/os/macos/raw.rs @@ -24,6 +24,8 @@ use os::unix::raw::{uid_t, gid_t}; #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = c_long; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[repr(C)] #[derive(Clone)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/os/nacl/raw.rs b/src/libstd/os/nacl/raw.rs index 36f8a5fb5c923..7258a14aaf4b3 100644 --- a/src/libstd/os/nacl/raw.rs +++ b/src/libstd/os/nacl/raw.rs @@ -24,6 +24,8 @@ #[stable(feature = "raw_ext", since = "1.1.0")] pub type blksize_t = i32; #[stable(feature = "raw_ext", since = "1.1.0")] pub type blkcnt_t = i32; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[repr(C)] #[derive(Copy, Clone)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/os/netbsd/raw.rs b/src/libstd/os/netbsd/raw.rs index 882d08c66065e..9ca5892495510 100644 --- a/src/libstd/os/netbsd/raw.rs +++ b/src/libstd/os/netbsd/raw.rs @@ -25,6 +25,8 @@ use os::unix::raw::{uid_t, gid_t}; #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i64; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[repr(C)] #[derive(Clone)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/os/openbsd/raw.rs b/src/libstd/os/openbsd/raw.rs index 1cc0eedfcd050..209546c4e4f56 100644 --- a/src/libstd/os/openbsd/raw.rs +++ b/src/libstd/os/openbsd/raw.rs @@ -25,6 +25,8 @@ use os::unix::raw::{uid_t, gid_t}; #[stable(feature = "raw_ext", since = "1.1.0")] pub type off_t = i64; #[stable(feature = "raw_ext", since = "1.1.0")] pub type time_t = i64; +#[unstable(feature = "pthread_t", issue = "29791")] pub type pthread_t = usize; + #[repr(C)] #[derive(Clone)] #[stable(feature = "raw_ext", since = "1.1.0")] diff --git a/src/libstd/sys/unix/ext/mod.rs b/src/libstd/sys/unix/ext/mod.rs index b57e325089d26..276ef25a03a44 100644 --- a/src/libstd/sys/unix/ext/mod.rs +++ b/src/libstd/sys/unix/ext/mod.rs @@ -34,6 +34,7 @@ pub mod ffi; pub mod fs; pub mod process; pub mod raw; +pub mod thread; /// A prelude for conveniently writing platform-specific code. /// diff --git a/src/libstd/sys/unix/ext/raw.rs b/src/libstd/sys/unix/ext/raw.rs index 8377e53f4178b..d1cc6cba51dbc 100644 --- a/src/libstd/sys/unix/ext/raw.rs +++ b/src/libstd/sys/unix/ext/raw.rs @@ -16,6 +16,9 @@ #[stable(feature = "raw_ext", since = "1.1.0")] pub type gid_t = u32; #[stable(feature = "raw_ext", since = "1.1.0")] pub type pid_t = i32; +#[doc(inline)] +#[unstable(feature = "pthread_t", issue = "29791")] +pub use sys::platform::raw::pthread_t; #[doc(inline)] #[stable(feature = "raw_ext", since = "1.1.0")] pub use sys::platform::raw::{dev_t, ino_t, mode_t, nlink_t, off_t, blksize_t}; diff --git a/src/libstd/sys/unix/ext/thread.rs b/src/libstd/sys/unix/ext/thread.rs new file mode 100644 index 0000000000000..c1c1609632a94 --- /dev/null +++ b/src/libstd/sys/unix/ext/thread.rs @@ -0,0 +1,43 @@ +// Copyright 2015 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +//! Unix-specific extensions to primitives in the `std::process` module. + +#![unstable(feature = "thread_extensions", issue = "29791")] + +use os::unix::raw::{pthread_t}; +use sys_common::{AsInner, IntoInner}; +use thread::{JoinHandle}; + +#[unstable(feature = "thread_extensions", issue = "29791")] +pub type RawPthread = pthread_t; + +/// Unix-specific extensions to `std::thread::JoinHandle` +#[unstable(feature = "thread_extensions", issue = "29791")] +pub trait JoinHandleExt { + /// Extracts the raw pthread_t without taking ownership + fn as_pthread_t(&self) -> RawPthread; + /// Consumes the thread, returning the raw pthread_t + /// + /// This function **transfers ownership** of the underlying pthread_t to + /// the caller. Callers are then the unique owners of the pthread_t and + /// must either detech or join the pthread_t once it's no longer needed. + fn into_pthread_t(self) -> RawPthread; +} + +#[unstable(feature = "thread_extensions", issue = "29791")] +impl JoinHandleExt for JoinHandle { + fn as_pthread_t(&self) -> RawPthread { + self.as_inner().id() as RawPthread + } + fn into_pthread_t(self) -> RawPthread { + self.into_inner().into_id() as RawPthread + } +} diff --git a/src/libstd/sys/unix/thread.rs b/src/libstd/sys/unix/thread.rs index f111f97be60a0..4d715b579c6c5 100644 --- a/src/libstd/sys/unix/thread.rs +++ b/src/libstd/sys/unix/thread.rs @@ -152,6 +152,14 @@ impl Thread { debug_assert_eq!(ret, 0); } } + + pub fn id(&self) -> libc::pthread_t { self.id } + + pub fn into_id(self) -> libc::pthread_t { + let id = self.id; + mem::forget(self); + id + } } impl Drop for Thread {