mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
Auto merge of #72935 - Dylan-DPC:rollup-60g3ab6, r=Dylan-DPC
Rollup of 5 pull requests Successful merges: - #72704 (Remote testing fixes) - #72820 (InstCombine: Don't optimize `&mut *x` into `x`) - #72848 (Correct generic parameter ordering in error note for E0747) - #72902 (Add a test to ensure Fuse stays covariant) - #72921 (Add assert to Vec with_capacity docs) Failed merges: r? @ghost
This commit is contained in:
commit
680a4b2fbd
@ -348,9 +348,11 @@ impl<T> Vec<T> {
|
|||||||
/// for i in 0..10 {
|
/// for i in 0..10 {
|
||||||
/// vec.push(i);
|
/// vec.push(i);
|
||||||
/// }
|
/// }
|
||||||
|
/// assert_eq!(vec.capacity(), 10);
|
||||||
///
|
///
|
||||||
/// // ...but this may make the vector reallocate
|
/// // ...but this may make the vector reallocate
|
||||||
/// vec.push(11);
|
/// vec.push(11);
|
||||||
|
/// assert!(vec.capacity() >= 11);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
//! Performs various peephole optimizations.
|
//! Performs various peephole optimizations.
|
||||||
|
|
||||||
use crate::transform::{MirPass, MirSource};
|
use crate::transform::{MirPass, MirSource};
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
|
use rustc_hir::Mutability;
|
||||||
use rustc_index::vec::Idx;
|
use rustc_index::vec::Idx;
|
||||||
use rustc_middle::mir::visit::{MutVisitor, Visitor};
|
use rustc_middle::mir::visit::{MutVisitor, Visitor};
|
||||||
use rustc_middle::mir::{
|
use rustc_middle::mir::{
|
||||||
Body, Constant, Local, Location, Mutability, Operand, Place, PlaceRef, ProjectionElem, Rvalue,
|
Body, Constant, Local, Location, Operand, Place, PlaceRef, ProjectionElem, Rvalue,
|
||||||
};
|
};
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
@ -39,7 +40,7 @@ impl<'tcx> MutVisitor<'tcx> for InstCombineVisitor<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn visit_rvalue(&mut self, rvalue: &mut Rvalue<'tcx>, location: Location) {
|
fn visit_rvalue(&mut self, rvalue: &mut Rvalue<'tcx>, location: Location) {
|
||||||
if let Some(mtbl) = self.optimizations.and_stars.remove(&location) {
|
if self.optimizations.and_stars.remove(&location) {
|
||||||
debug!("replacing `&*`: {:?}", rvalue);
|
debug!("replacing `&*`: {:?}", rvalue);
|
||||||
let new_place = match rvalue {
|
let new_place = match rvalue {
|
||||||
Rvalue::Ref(_, _, place) => {
|
Rvalue::Ref(_, _, place) => {
|
||||||
@ -57,10 +58,7 @@ impl<'tcx> MutVisitor<'tcx> for InstCombineVisitor<'tcx> {
|
|||||||
}
|
}
|
||||||
_ => bug!("Detected `&*` but didn't find `&*`!"),
|
_ => bug!("Detected `&*` but didn't find `&*`!"),
|
||||||
};
|
};
|
||||||
*rvalue = Rvalue::Use(match mtbl {
|
*rvalue = Rvalue::Use(Operand::Copy(new_place))
|
||||||
Mutability::Mut => Operand::Move(new_place),
|
|
||||||
Mutability::Not => Operand::Copy(new_place),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(constant) = self.optimizations.arrays_lengths.remove(&location) {
|
if let Some(constant) = self.optimizations.arrays_lengths.remove(&location) {
|
||||||
@ -93,8 +91,8 @@ impl Visitor<'tcx> for OptimizationFinder<'b, 'tcx> {
|
|||||||
{
|
{
|
||||||
// The dereferenced place must have type `&_`.
|
// The dereferenced place must have type `&_`.
|
||||||
let ty = Place::ty_from(local, proj_base, self.body, self.tcx).ty;
|
let ty = Place::ty_from(local, proj_base, self.body, self.tcx).ty;
|
||||||
if let ty::Ref(_, _, mtbl) = ty.kind {
|
if let ty::Ref(_, _, Mutability::Not) = ty.kind {
|
||||||
self.optimizations.and_stars.insert(location, mtbl);
|
self.optimizations.and_stars.insert(location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -114,6 +112,6 @@ impl Visitor<'tcx> for OptimizationFinder<'b, 'tcx> {
|
|||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct OptimizationList<'tcx> {
|
struct OptimizationList<'tcx> {
|
||||||
and_stars: FxHashMap<Location, Mutability>,
|
and_stars: FxHashSet<Location>,
|
||||||
arrays_lengths: FxHashMap<Location, Constant<'tcx>>,
|
arrays_lengths: FxHashMap<Location, Constant<'tcx>>,
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
use crate::collect::PlaceholderHirTyCollector;
|
use crate::collect::PlaceholderHirTyCollector;
|
||||||
use crate::middle::resolve_lifetime as rl;
|
use crate::middle::resolve_lifetime as rl;
|
||||||
use crate::require_c_abi_if_c_variadic;
|
use crate::require_c_abi_if_c_variadic;
|
||||||
|
use rustc_ast::ast::ParamKindOrd;
|
||||||
use rustc_ast::util::lev_distance::find_best_match_for_name;
|
use rustc_ast::util::lev_distance::find_best_match_for_name;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_errors::ErrorReported;
|
use rustc_errors::ErrorReported;
|
||||||
@ -483,8 +484,25 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||||||
arg.descr(),
|
arg.descr(),
|
||||||
kind,
|
kind,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let kind_ord = match kind {
|
||||||
|
"lifetime" => ParamKindOrd::Lifetime,
|
||||||
|
"type" => ParamKindOrd::Type,
|
||||||
|
"constant" => ParamKindOrd::Const,
|
||||||
|
// It's more concise to match on the string representation, though it means
|
||||||
|
// the match is non-exhaustive.
|
||||||
|
_ => bug!("invalid generic parameter kind {}", kind),
|
||||||
|
};
|
||||||
|
let arg_ord = match arg {
|
||||||
|
GenericArg::Lifetime(_) => ParamKindOrd::Lifetime,
|
||||||
|
GenericArg::Type(_) => ParamKindOrd::Type,
|
||||||
|
GenericArg::Const(_) => ParamKindOrd::Const,
|
||||||
|
};
|
||||||
|
|
||||||
// This note will be true as long as generic parameters are strictly ordered by their kind.
|
// This note will be true as long as generic parameters are strictly ordered by their kind.
|
||||||
err.note(&format!("{} arguments must be provided before {} arguments", kind, arg.descr()));
|
let (first, last) =
|
||||||
|
if kind_ord < arg_ord { (kind, arg.descr()) } else { (arg.descr(), kind) };
|
||||||
|
err.note(&format!("{} arguments must be provided before {} arguments", first, last));
|
||||||
err.emit();
|
err.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ fn a(_1: &mut [T]) -> &mut [T] {
|
|||||||
let mut _4: &mut [T]; // in scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:6
|
let mut _4: &mut [T]; // in scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:6
|
||||||
scope 1 {
|
scope 1 {
|
||||||
debug self => _4; // in scope 1 at $SRC_DIR/libcore/convert/mod.rs:LL:COL
|
debug self => _4; // in scope 1 at $SRC_DIR/libcore/convert/mod.rs:LL:COL
|
||||||
|
let mut _5: &mut [T]; // in scope 1 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:15
|
||||||
}
|
}
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
@ -15,7 +16,10 @@ fn a(_1: &mut [T]) -> &mut [T] {
|
|||||||
StorageLive(_3); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:15
|
StorageLive(_3); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:15
|
||||||
StorageLive(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:6
|
StorageLive(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:6
|
||||||
_4 = &mut (*_1); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:6
|
_4 = &mut (*_1); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:6
|
||||||
_3 = move _4; // scope 1 at $SRC_DIR/libcore/convert/mod.rs:LL:COL
|
StorageLive(_5); // scope 1 at $SRC_DIR/libcore/convert/mod.rs:LL:COL
|
||||||
|
_5 = &mut (*_4); // scope 1 at $SRC_DIR/libcore/convert/mod.rs:LL:COL
|
||||||
|
_3 = &mut (*_5); // scope 1 at $SRC_DIR/libcore/convert/mod.rs:LL:COL
|
||||||
|
StorageDead(_5); // scope 1 at $SRC_DIR/libcore/convert/mod.rs:LL:COL
|
||||||
_2 = &mut (*_3); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:15
|
_2 = &mut (*_3); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:15
|
||||||
StorageDead(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:14: 3:15
|
StorageDead(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:14: 3:15
|
||||||
_0 = &mut (*_2); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:15
|
_0 = &mut (*_2); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:3:5: 3:15
|
||||||
|
@ -9,6 +9,7 @@ fn b(_1: &mut std::boxed::Box<T>) -> &mut T {
|
|||||||
scope 1 {
|
scope 1 {
|
||||||
debug self => _4; // in scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
debug self => _4; // in scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
let mut _5: &mut T; // in scope 1 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:15
|
let mut _5: &mut T; // in scope 1 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:15
|
||||||
|
let mut _6: &mut T; // in scope 1 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:15
|
||||||
}
|
}
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
@ -17,8 +18,11 @@ fn b(_1: &mut std::boxed::Box<T>) -> &mut T {
|
|||||||
StorageLive(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:6
|
StorageLive(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:6
|
||||||
_4 = &mut (*_1); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:6
|
_4 = &mut (*_1); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:6
|
||||||
StorageLive(_5); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
StorageLive(_5); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
_5 = &mut (*(*_4)); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
StorageLive(_6); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
_3 = move _5; // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
_6 = &mut (*(*_4)); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
|
_5 = &mut (*_6); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
|
_3 = &mut (*_5); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
|
StorageDead(_6); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
StorageDead(_5); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
StorageDead(_5); // scope 1 at $SRC_DIR/liballoc/boxed.rs:LL:COL
|
||||||
_2 = &mut (*_3); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:15
|
_2 = &mut (*_3); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:5: 8:15
|
||||||
StorageDead(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:14: 8:15
|
StorageDead(_4); // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:8:14: 8:15
|
||||||
|
@ -26,12 +26,17 @@
|
|||||||
// + span: $DIR/nrvo-simple.rs:3:20: 3:21
|
// + span: $DIR/nrvo-simple.rs:3:20: 3:21
|
||||||
// + literal: Const { ty: u8, val: Value(Scalar(0x00)) }
|
// + literal: Const { ty: u8, val: Value(Scalar(0x00)) }
|
||||||
StorageLive(_3); // scope 1 at $DIR/nrvo-simple.rs:4:5: 4:19
|
StorageLive(_3); // scope 1 at $DIR/nrvo-simple.rs:4:5: 4:19
|
||||||
|
StorageLive(_5); // scope 1 at $DIR/nrvo-simple.rs:4:10: 4:18
|
||||||
|
StorageLive(_6); // scope 1 at $DIR/nrvo-simple.rs:4:10: 4:18
|
||||||
- _6 = &mut _2; // scope 1 at $DIR/nrvo-simple.rs:4:10: 4:18
|
- _6 = &mut _2; // scope 1 at $DIR/nrvo-simple.rs:4:10: 4:18
|
||||||
+ _6 = &mut _0; // scope 1 at $DIR/nrvo-simple.rs:4:10: 4:18
|
+ _6 = &mut _0; // scope 1 at $DIR/nrvo-simple.rs:4:10: 4:18
|
||||||
_3 = move _1(move _6) -> bb1; // scope 1 at $DIR/nrvo-simple.rs:4:5: 4:19
|
_5 = &mut (*_6); // scope 1 at $DIR/nrvo-simple.rs:4:10: 4:18
|
||||||
|
_3 = move _1(move _5) -> bb1; // scope 1 at $DIR/nrvo-simple.rs:4:5: 4:19
|
||||||
}
|
}
|
||||||
|
|
||||||
bb1: {
|
bb1: {
|
||||||
|
StorageDead(_5); // scope 1 at $DIR/nrvo-simple.rs:4:18: 4:19
|
||||||
|
StorageDead(_6); // scope 1 at $DIR/nrvo-simple.rs:4:19: 4:20
|
||||||
StorageDead(_3); // scope 1 at $DIR/nrvo-simple.rs:4:19: 4:20
|
StorageDead(_3); // scope 1 at $DIR/nrvo-simple.rs:4:19: 4:20
|
||||||
- _0 = _2; // scope 1 at $DIR/nrvo-simple.rs:5:5: 5:8
|
- _0 = _2; // scope 1 at $DIR/nrvo-simple.rs:5:5: 5:8
|
||||||
- StorageDead(_2); // scope 0 at $DIR/nrvo-simple.rs:6:1: 6:2
|
- StorageDead(_2); // scope 0 at $DIR/nrvo-simple.rs:6:1: 6:2
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
// ignore-cross-compile
|
// ignore-cross-compile
|
||||||
// ignore-stage1
|
// ignore-stage1
|
||||||
|
// ignore-remote
|
||||||
|
|
||||||
#![feature(rustc_private)]
|
#![feature(rustc_private)]
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// run-pass
|
// run-pass
|
||||||
// Testing that a librustc_ast can parse modules with canonicalized base path
|
// Testing that a librustc_ast can parse modules with canonicalized base path
|
||||||
// ignore-cross-compile
|
// ignore-cross-compile
|
||||||
|
// ignore-remote
|
||||||
|
|
||||||
#![feature(rustc_private)]
|
#![feature(rustc_private)]
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ error[E0747]: lifetime provided when a type was expected
|
|||||||
LL | struct Cl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<T, 'a, A=(), B=(), C=(), U, 'b, V, 'c>> {
|
LL | struct Cl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<T, 'a, A=(), B=(), C=(), U, 'b, V, 'c>> {
|
||||||
| ^^
|
| ^^
|
||||||
|
|
|
|
||||||
= note: type arguments must be provided before lifetime arguments
|
= note: lifetime arguments must be provided before type arguments
|
||||||
|
|
||||||
error[E0747]: lifetime provided when a type was expected
|
error[E0747]: lifetime provided when a type was expected
|
||||||
--> $DIR/suggest-move-types.rs:82:56
|
--> $DIR/suggest-move-types.rs:82:56
|
||||||
@ -132,7 +132,7 @@ error[E0747]: lifetime provided when a type was expected
|
|||||||
LL | struct Dl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<T, 'a, A=(), B=(), U, 'b, C=(), V, 'c>> {
|
LL | struct Dl<'a, 'b, 'c, T, U, V, M: ThreeWithLifetime<T, 'a, A=(), B=(), U, 'b, C=(), V, 'c>> {
|
||||||
| ^^
|
| ^^
|
||||||
|
|
|
|
||||||
= note: type arguments must be provided before lifetime arguments
|
= note: lifetime arguments must be provided before type arguments
|
||||||
|
|
||||||
error: aborting due to 12 previous errors
|
error: aborting due to 12 previous errors
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
#![allow(warnings)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
use std::iter::Zip;
|
use std::iter::{Fuse, Zip};
|
||||||
|
|
||||||
|
fn fuse_covariant<'a, I>(iter: Fuse<&'static I>) -> Fuse<&'a I> { iter }
|
||||||
fn zip_covariant<'a, A, B>(iter: Zip<&'static A, &'static B>) -> Zip<&'a A, &'a B> { iter }
|
fn zip_covariant<'a, A, B>(iter: Zip<&'static A, &'static B>) -> Zip<&'a A, &'a B> { iter }
|
||||||
|
|
||||||
fn main() { }
|
fn main() { }
|
||||||
|
@ -853,6 +853,7 @@ impl Config {
|
|||||||
name == util::get_pointer_width(&self.target) || // pointer width
|
name == util::get_pointer_width(&self.target) || // pointer width
|
||||||
name == self.stage_id.split('-').next().unwrap() || // stage
|
name == self.stage_id.split('-').next().unwrap() || // stage
|
||||||
(self.target != self.host && name == "cross-compile") ||
|
(self.target != self.host && name == "cross-compile") ||
|
||||||
|
(self.remote_test_client.is_some() && name == "remote") ||
|
||||||
match self.compare_mode {
|
match self.compare_mode {
|
||||||
Some(CompareMode::Nll) => name == "compare-mode-nll",
|
Some(CompareMode::Nll) => name == "compare-mode-nll",
|
||||||
Some(CompareMode::Polonius) => name == "compare-mode-polonius",
|
Some(CompareMode::Polonius) => name == "compare-mode-polonius",
|
||||||
|
@ -224,7 +224,7 @@ fn run(support_lib_count: usize, exe: String, all_args: Vec<String>) {
|
|||||||
// by the client.
|
// by the client.
|
||||||
for (k, v) in env::vars() {
|
for (k, v) in env::vars() {
|
||||||
match &k[..] {
|
match &k[..] {
|
||||||
"PATH" | "LD_LIBRARY_PATH" | "PWD" => continue,
|
"PATH" | "LD_LIBRARY_PATH" | "PWD" | "RUST_TEST_TMPDIR" => continue,
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
t!(client.write_all(k.as_bytes()));
|
t!(client.write_all(k.as_bytes()));
|
||||||
|
@ -41,6 +41,7 @@ macro_rules! t {
|
|||||||
|
|
||||||
static TEST: AtomicUsize = AtomicUsize::new(0);
|
static TEST: AtomicUsize = AtomicUsize::new(0);
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
struct Config {
|
struct Config {
|
||||||
pub remote: bool,
|
pub remote: bool,
|
||||||
pub verbose: bool,
|
pub verbose: bool,
|
||||||
@ -71,6 +72,12 @@ impl Config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn print_verbose(s: &str, conf: Config) {
|
||||||
|
if conf.verbose {
|
||||||
|
println!("{}", s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("starting test server");
|
println!("starting test server");
|
||||||
|
|
||||||
@ -83,16 +90,19 @@ fn main() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let listener = t!(TcpListener::bind(bind_addr));
|
let listener = t!(TcpListener::bind(bind_addr));
|
||||||
let work: PathBuf = if cfg!(target_os = "android") {
|
let (work, tmp): (PathBuf, PathBuf) = if cfg!(target_os = "android") {
|
||||||
"/data/tmp/work".into()
|
("/data/tmp/work".into(), "/data/tmp/work/tmp".into())
|
||||||
} else {
|
} else {
|
||||||
let mut temp_dir = env::temp_dir();
|
let mut work_dir = env::temp_dir();
|
||||||
temp_dir.push("work");
|
work_dir.push("work");
|
||||||
temp_dir
|
let mut tmp_dir = work_dir.clone();
|
||||||
|
tmp_dir.push("tmp");
|
||||||
|
(work_dir, tmp_dir)
|
||||||
};
|
};
|
||||||
println!("listening!");
|
println!("listening on {}!", bind_addr);
|
||||||
|
|
||||||
t!(fs::create_dir_all(&work));
|
t!(fs::create_dir_all(&work));
|
||||||
|
t!(fs::create_dir_all(&tmp));
|
||||||
|
|
||||||
let lock = Arc::new(Mutex::new(()));
|
let lock = Arc::new(Mutex::new(()));
|
||||||
|
|
||||||
@ -103,22 +113,25 @@ fn main() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if &buf[..] == b"ping" {
|
if &buf[..] == b"ping" {
|
||||||
|
print_verbose("Received ping", config);
|
||||||
t!(socket.write_all(b"pong"));
|
t!(socket.write_all(b"pong"));
|
||||||
} else if &buf[..] == b"push" {
|
} else if &buf[..] == b"push" {
|
||||||
handle_push(socket, &work);
|
handle_push(socket, &work, config);
|
||||||
} else if &buf[..] == b"run " {
|
} else if &buf[..] == b"run " {
|
||||||
let lock = lock.clone();
|
let lock = lock.clone();
|
||||||
let work = work.clone();
|
let work = work.clone();
|
||||||
thread::spawn(move || handle_run(socket, &work, &lock));
|
let tmp = tmp.clone();
|
||||||
|
thread::spawn(move || handle_run(socket, &work, &tmp, &lock, config));
|
||||||
} else {
|
} else {
|
||||||
panic!("unknown command {:?}", buf);
|
panic!("unknown command {:?}", buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_push(socket: TcpStream, work: &Path) {
|
fn handle_push(socket: TcpStream, work: &Path, config: Config) {
|
||||||
let mut reader = BufReader::new(socket);
|
let mut reader = BufReader::new(socket);
|
||||||
recv(&work, &mut reader);
|
let dst = recv(&work, &mut reader);
|
||||||
|
print_verbose(&format!("push {:#?}", dst), config);
|
||||||
|
|
||||||
let mut socket = reader.into_inner();
|
let mut socket = reader.into_inner();
|
||||||
t!(socket.write_all(b"ack "));
|
t!(socket.write_all(b"ack "));
|
||||||
@ -134,7 +147,7 @@ impl Drop for RemoveOnDrop<'_> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_run(socket: TcpStream, work: &Path, lock: &Mutex<()>) {
|
fn handle_run(socket: TcpStream, work: &Path, tmp: &Path, lock: &Mutex<()>, config: Config) {
|
||||||
let mut arg = Vec::new();
|
let mut arg = Vec::new();
|
||||||
let mut reader = BufReader::new(socket);
|
let mut reader = BufReader::new(socket);
|
||||||
|
|
||||||
@ -201,6 +214,7 @@ fn handle_run(socket: TcpStream, work: &Path, lock: &Mutex<()>) {
|
|||||||
// binary is and then we'll download it all to the exe path we calculated
|
// binary is and then we'll download it all to the exe path we calculated
|
||||||
// earlier.
|
// earlier.
|
||||||
let exe = recv(&path, &mut reader);
|
let exe = recv(&path, &mut reader);
|
||||||
|
print_verbose(&format!("run {:#?}", exe), config);
|
||||||
|
|
||||||
let mut cmd = Command::new(&exe);
|
let mut cmd = Command::new(&exe);
|
||||||
cmd.args(args);
|
cmd.args(args);
|
||||||
@ -226,6 +240,9 @@ fn handle_run(socket: TcpStream, work: &Path, lock: &Mutex<()>) {
|
|||||||
cmd.env("LD_LIBRARY_PATH", format!("{}:{}", work.display(), path.display()));
|
cmd.env("LD_LIBRARY_PATH", format!("{}:{}", work.display(), path.display()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Some tests assume RUST_TEST_TMPDIR exists
|
||||||
|
cmd.env("RUST_TEST_TMPDIR", tmp.to_owned());
|
||||||
|
|
||||||
// Spawn the child and ferry over stdout/stderr to the socket in a framed
|
// Spawn the child and ferry over stdout/stderr to the socket in a framed
|
||||||
// fashion (poor man's style)
|
// fashion (poor man's style)
|
||||||
let mut child =
|
let mut child =
|
||||||
|
Loading…
Reference in New Issue
Block a user