From 67c02222526d46875ddabfda1b7a936564f916ff Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Sat, 21 Dec 2013 21:54:05 -0800 Subject: [PATCH] Guarantee comm primitives are not Freeze None of these primitives should be Freeze because sharing them in an Arc is a very bad idea. Closes #11039 --- src/libstd/comm/mod.rs | 4 ++++ src/test/compile-fail/comm-not-freeze.rs | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/test/compile-fail/comm-not-freeze.rs diff --git a/src/libstd/comm/mod.rs b/src/libstd/comm/mod.rs index 4cbc6c7cbb7ba..30324d9bc60b6 100644 --- a/src/libstd/comm/mod.rs +++ b/src/libstd/comm/mod.rs @@ -292,6 +292,7 @@ impl Consumer{ /// The receiving-half of Rust's channel type. This half can only be owned by /// one task +#[no_freeze] // can't share ports in an arc pub struct Port { priv queue: Consumer, } @@ -305,12 +306,15 @@ pub struct PortIterator<'a, T> { /// The sending-half of Rust's channel type. This half can only be owned by one /// task +#[no_freeze] // can't share chans in an arc pub struct Chan { priv queue: spsc::Producer, } /// The sending-half of Rust's channel type. This half can be shared among many /// tasks by creating copies of itself through the `clone` method. +#[no_freeze] // technically this implementation is shareable, but it shouldn't + // be required to be shareable in an arc pub struct SharedChan { priv queue: mpsc::Producer, } diff --git a/src/test/compile-fail/comm-not-freeze.rs b/src/test/compile-fail/comm-not-freeze.rs new file mode 100644 index 0000000000000..2b85068d4708b --- /dev/null +++ b/src/test/compile-fail/comm-not-freeze.rs @@ -0,0 +1,17 @@ +// Copyright 2013 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. + +fn test() {} + +fn main() { + test::>(); //~ ERROR: does not fulfill `Freeze` + test::>(); //~ ERROR: does not fulfill `Freeze` + test::>(); //~ ERROR: does not fulfill `Freeze` +}