pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/lang/rust rust: work around problem in rand vendor cra...
details: https://anonhg.NetBSD.org/pkgsrc/rev/7038a4c2a6f1
branches: trunk
changeset: 396974:7038a4c2a6f1
user: tnn <tnn%pkgsrc.org@localhost>
date: Thu Jun 13 19:06:30 2019 +0000
description:
rust: work around problem in rand vendor crate that made rustc very slow
... on some NetBSD hosts. To be discussed with upstream.
diffstat:
lang/rust/Makefile | 5 +-
lang/rust/distinfo | 4 +-
lang/rust/patches/patch-vendor_rand_src_rngs_os.rs | 98 ++++++++++++++++++++-
3 files changed, 97 insertions(+), 10 deletions(-)
diffs (147 lines):
diff -r 5e3cccbc8119 -r 7038a4c2a6f1 lang/rust/Makefile
--- a/lang/rust/Makefile Thu Jun 13 19:02:37 2019 +0000
+++ b/lang/rust/Makefile Thu Jun 13 19:06:30 2019 +0000
@@ -1,6 +1,7 @@
-# $NetBSD: Makefile,v 1.103 2019/06/02 22:12:39 he Exp $
+# $NetBSD: Makefile,v 1.104 2019/06/13 19:06:30 tnn Exp $
DISTNAME= rustc-1.35.0-src
+PKGREVISION= 1
PKGNAME= ${DISTNAME:S/rustc/rust/:S/-src//}
CATEGORIES= lang
MASTER_SITES= http://static.rust-lang.org/dist/
@@ -308,7 +309,7 @@
# patch(1) in NetBSD does not handle .cargo-checksum.json like long width file.
${CP} ${WRKSRC}/vendor/rand/.cargo-checksum.json \
${WRKSRC}/vendor/rand/.cargo-checksum.json.orig
- ${SED} -e 's/1e732c2e3b4bd1561f11e0979bf9d20669a96eae7afe0deff9dfbb980ee47bf1/55abd8100db14a076dedbf84ce0f2db08158e1bd33ff1d4978bd3c4ad978f281/'
${WRKSRC}/vendor/rand/.cargo-checksum.json.orig > ${WRKSRC}/vendor/rand/.cargo-checksum.json
+ ${SED} -e 's/1e732c2e3b4bd1561f11e0979bf9d20669a96eae7afe0deff9dfbb980ee47bf1/bc03f2345d7cfa7000f9da817120b6afa073359789c21a9a790ebd8676c50cca/'
${WRKSRC}/vendor/rand/.cargo-checksum.json.orig > ${WRKSRC}/vendor/rand/.cargo-checksum.json
${CP} ${WRKSRC}/vendor/libc/.cargo-checksum.json \
${WRKSRC}/vendor/libc/.cargo-checksum.json.orig
${SED} -e 's/c6a740dac9af99321f48d5c9e86c6a4f5dcc611c413263881764f7121c1f7e9d/01ca1e6a21f01efd9d4b2768c1f9bcfab829e95a23d88cd35bf4e0172c672f3a/'
${WRKSRC}/vendor/libc/.cargo-checksum.json.orig > ${WRKSRC}/vendor/libc/.cargo-checksum.json
diff -r 5e3cccbc8119 -r 7038a4c2a6f1 lang/rust/distinfo
--- a/lang/rust/distinfo Thu Jun 13 19:02:37 2019 +0000
+++ b/lang/rust/distinfo Thu Jun 13 19:06:30 2019 +0000
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.79 2019/06/02 22:50:04 ryoon Exp $
+$NetBSD: distinfo,v 1.80 2019/06/13 19:06:30 tnn Exp $
SHA1 (rust-1.34.2-i686-apple-darwin.tar.gz) = 1c7f71c554dd4cffc4bdbdf291234292c5fcc9ad
RMD160 (rust-1.34.2-i686-apple-darwin.tar.gz) = e1f3228f63a2580d7980f28e10e3f4fa34f63dac
@@ -127,4 +127,4 @@
SHA1 (patch-src_tools_rust-installer_install-template.sh) = f2ec6dced2be1fa23773d5827503ad07d0913dc2
SHA1 (patch-vendor_backtrace-sys_src_libbacktrace_configure) = 90e54f66edce65ebe23fbf2480deb193ca926733
SHA1 (patch-vendor_libc_src_unix_solarish_mod.rs) = 804ea03be546fef0d2bd37d7f8abb26d38a7892b
-SHA1 (patch-vendor_rand_src_rngs_os.rs) = 7a1c6d91d9418e1f8e378c4baca33045cc768f2d
+SHA1 (patch-vendor_rand_src_rngs_os.rs) = ae78f9e8abfa5a223bceac5ac8bbe25453dc70c0
diff -r 5e3cccbc8119 -r 7038a4c2a6f1 lang/rust/patches/patch-vendor_rand_src_rngs_os.rs
--- a/lang/rust/patches/patch-vendor_rand_src_rngs_os.rs Thu Jun 13 19:02:37 2019 +0000
+++ b/lang/rust/patches/patch-vendor_rand_src_rngs_os.rs Thu Jun 13 19:06:30 2019 +0000
@@ -1,11 +1,88 @@
-$NetBSD: patch-vendor_rand_src_rngs_os.rs,v 1.1 2019/01/22 09:17:15 jperkin Exp $
+$NetBSD: patch-vendor_rand_src_rngs_os.rs,v 1.2 2019/06/13 19:06:30 tnn Exp $
+
+-Explicitly disable getrandom support on SunOS, the test fails.
+-https://github.com/rust-random/rand/issues/637
+
+The rand implementation for NetBSD drains a byte from /dev/random on every
+rustc invocation, with the intent to ensure /dev/urandom is seeded.
+This is inappropriate; seeding the rng should be handled by rc.d scripts only.
+The result is that rustc eventually blocks for very long times when generating
+temp file names, causing the lang/rust build to take days(!) in some cases.
+The fix is to delete the NetBSD specific implementation and instead use the
+FreeBSD implementation which relies on the kern.arandom sysctl instead of
+/dev/{u,}random.
+The bootstrap compiler of course has the same issue so I will raise a PR
+with upstream authors to address this.
-Explicitly disable getrandom support on SunOS, the test fails.
-https://github.com/rust-random/rand/issues/637
-
---- vendor/rand/src/rngs/os.rs.orig 2019-01-16 11:06:08.000000000 +0000
+--- vendor/rand/src/rngs/os.rs.orig 2019-05-20 13:47:25.000000000 +0000
+++ vendor/rand/src/rngs/os.rs
-@@ -675,6 +675,7 @@ mod imp {
+@@ -246,7 +246,7 @@ trait OsRngImpl where Self: Sized {
+ // All instances use a single internal file handle, to prevent possible
+ // exhaustion of file descriptors.
+ #[cfg(any(target_os = "linux", target_os = "android",
+- target_os = "netbsd", target_os = "dragonfly",
++ target_os = "dragonfly",
+ target_os = "solaris", target_os = "redox",
+ target_os = "haiku", target_os = "emscripten"))]
+ mod random_device {
+@@ -487,56 +487,6 @@ mod imp {
+ }
+ }
+
+-
+-#[cfg(target_os = "netbsd")]
+-mod imp {
+- use Error;
+- use super::random_device;
+- use super::OsRngImpl;
+-
+- use std::fs::File;
+- use std::io::Read;
+- use std::sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT, Ordering};
+-
+- #[derive(Clone, Debug)]
+- pub struct OsRng { initialized: bool }
+-
+- impl OsRngImpl for OsRng {
+- fn new() -> Result<OsRng, Error> {
+- random_device::open("/dev/urandom", &|p| File::open(p))?;
+- Ok(OsRng { initialized: false })
+- }
+-
+- fn fill_chunk(&mut self, dest: &mut [u8]) -> Result<(), Error> {
+- random_device::read(dest)
+- }
+-
+- // Read a single byte from `/dev/random` to determine if the OS RNG is
+- // already seeded. NetBSD always blocks if not yet ready.
+- fn test_initialized(&mut self, dest: &mut [u8], _blocking: bool)
+- -> Result<usize, Error>
+- {
+- static OS_RNG_INITIALIZED: AtomicBool = ATOMIC_BOOL_INIT;
+- if !self.initialized {
+- self.initialized = OS_RNG_INITIALIZED.load(Ordering::Relaxed);
+- }
+- if self.initialized { return Ok(0); }
+-
+- info!("OsRng: testing random device /dev/random");
+- let mut file =
+- File::open("/dev/random").map_err(random_device::map_err)?;
+- file.read(&mut dest[..1]).map_err(random_device::map_err)?;
+-
+- OS_RNG_INITIALIZED.store(true, Ordering::Relaxed);
+- self.initialized = true;
+- Ok(1)
+- }
+-
+- fn method_str(&self) -> &'static str { "/dev/urandom" }
+- }
+-}
+-
+-
+ #[cfg(any(target_os = "dragonfly",
+ target_os = "haiku",
+ target_os = "emscripten"))]
+@@ -677,6 +627,7 @@ mod imp {
}
fn getrandom(buf: &mut [u8], blocking: bool) -> libc::c_long {
@@ -13,3 +90,12 @@
extern "C" {
fn syscall(number: libc::c_long, ...) -> libc::c_long;
}
+@@ -824,7 +775,7 @@ mod imp {
+ }
+
+
+-#[cfg(target_os = "freebsd")]
++#[cfg(any(target_os = "freebsd", target_os = "netbsd"))]
+ mod imp {
+ extern crate libc;
+
Home |
Main Index |
Thread Index |
Old Index