Skip to content

Commit 5a5e941

Browse files
committed
Merge branch 'metadata-send-sync' of https://github.com/Zoxc/rust into update-cargo
2 parents a8eaabc + 62089c3 commit 5a5e941

File tree

12 files changed

+76
-31
lines changed

12 files changed

+76
-31
lines changed

src/librustc/middle/cstore.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,12 @@ use session::search_paths::PathKind;
3636
use std::any::Any;
3737
use std::collections::BTreeMap;
3838
use std::path::{Path, PathBuf};
39-
use rustc_data_structures::owning_ref::ErasedBoxRef;
4039
use syntax::ast;
4140
use syntax::ext::base::SyntaxExtension;
4241
use syntax::symbol::Symbol;
4342
use syntax_pos::Span;
4443
use rustc_back::target::Target;
45-
use rustc_data_structures::sync::Lrc;
44+
use rustc_data_structures::sync::{MetadataRef, Lrc};
4645

4746
pub use self::NativeLibraryKind::*;
4847

@@ -186,11 +185,11 @@ pub trait MetadataLoader {
186185
fn get_rlib_metadata(&self,
187186
target: &Target,
188187
filename: &Path)
189-
-> Result<ErasedBoxRef<[u8]>, String>;
188+
-> Result<MetadataRef, String>;
190189
fn get_dylib_metadata(&self,
191190
target: &Target,
192191
filename: &Path)
193-
-> Result<ErasedBoxRef<[u8]>, String>;
192+
-> Result<MetadataRef, String>;
194193
}
195194

196195
#[derive(Clone)]

src/librustc_data_structures/owning_ref/mod.rs

+41-6
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ fn main() {
243243
```
244244
*/
245245

246+
use std::mem;
246247
pub use stable_deref_trait::{StableDeref as StableAddress, CloneStableDeref as CloneStableAddress};
247248

248249
/// An owning reference.
@@ -279,7 +280,7 @@ pub struct OwningRefMut<O, T: ?Sized> {
279280
pub trait Erased {}
280281
impl<T> Erased for T {}
281282

282-
/// Helper trait for erasing the concrete type of what an owner derferences to,
283+
/// Helper trait for erasing the concrete type of what an owner dereferences to,
283284
/// for example `Box<T> -> Box<Erased>`. This would be unneeded with
284285
/// higher kinded types support in the language.
285286
pub unsafe trait IntoErased<'a> {
@@ -289,10 +290,20 @@ pub unsafe trait IntoErased<'a> {
289290
fn into_erased(self) -> Self::Erased;
290291
}
291292

292-
/// Helper trait for erasing the concrete type of what an owner derferences to,
293+
/// Helper trait for erasing the concrete type of what an owner dereferences to,
294+
/// for example `Box<T> -> Box<Erased + Send>`. This would be unneeded with
295+
/// higher kinded types support in the language.
296+
pub unsafe trait IntoErasedSend<'a> {
297+
/// Owner with the dereference type substituted to `Erased + Send`.
298+
type Erased: Send;
299+
/// Perform the type erasure.
300+
fn into_erased_send(self) -> Self::Erased;
301+
}
302+
303+
/// Helper trait for erasing the concrete type of what an owner dereferences to,
293304
/// for example `Box<T> -> Box<Erased + Send + Sync>`. This would be unneeded with
294305
/// higher kinded types support in the language.
295-
pub unsafe trait IntoErasedSendSync<'a>: Send + Sync {
306+
pub unsafe trait IntoErasedSendSync<'a> {
296307
/// Owner with the dereference type substituted to `Erased + Send + Sync`.
297308
type Erased: Send + Sync;
298309
/// Perform the type erasure.
@@ -472,6 +483,18 @@ impl<O, T: ?Sized> OwningRef<O, T> {
472483
}
473484
}
474485

486+
/// Erases the concrete base type of the owner with a trait object which implements `Send`.
487+
///
488+
/// This allows mixing of owned references with different owner base types.
489+
pub fn erase_send_owner<'a>(self) -> OwningRef<O::Erased, T>
490+
where O: IntoErasedSend<'a>,
491+
{
492+
OwningRef {
493+
reference: self.reference,
494+
owner: self.owner.into_erased_send(),
495+
}
496+
}
497+
475498
/// Erases the concrete base type of the owner with a trait object which implements `Send` and `Sync`.
476499
///
477500
/// This allows mixing of owned references with different owner base types.
@@ -1161,13 +1184,25 @@ unsafe impl<'a, T: 'a> IntoErased<'a> for Arc<T> {
11611184
}
11621185
}
11631186

1164-
unsafe impl<'a, T: Send + Sync + 'a> IntoErasedSendSync<'a> for Box<T> {
1165-
type Erased = Box<Erased + Send + Sync + 'a>;
1166-
fn into_erased_send_sync(self) -> Self::Erased {
1187+
unsafe impl<'a, T: Send + 'a> IntoErasedSend<'a> for Box<T> {
1188+
type Erased = Box<Erased + Send + 'a>;
1189+
fn into_erased_send(self) -> Self::Erased {
11671190
self
11681191
}
11691192
}
11701193

1194+
unsafe impl<'a, T: Send + 'a> IntoErasedSendSync<'a> for Box<T> {
1195+
type Erased = Box<Erased + Sync + Send + 'a>;
1196+
fn into_erased_send_sync(self) -> Self::Erased {
1197+
let result: Box<Erased + Send + 'a> = self;
1198+
// This is safe since Erased can always implement Sync
1199+
// Only the destructor is available and it takes &mut self
1200+
unsafe {
1201+
mem::transmute(result)
1202+
}
1203+
}
1204+
}
1205+
11711206
unsafe impl<'a, T: Send + Sync + 'a> IntoErasedSendSync<'a> for Arc<T> {
11721207
type Erased = Arc<Erased + Send + Sync + 'a>;
11731208
fn into_erased_send_sync(self) -> Self::Erased {

src/librustc_data_structures/sync.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ cfg_if! {
177177
macro_rules! rustc_erase_owner {
178178
($v:expr) => {{
179179
let v = $v;
180-
::rustc_data_structures::sync::assert_send_sync_val(&v);
180+
::rustc_data_structures::sync::assert_send_val(&v);
181181
v.erase_send_sync_owner()
182182
}}
183183
}
@@ -262,6 +262,7 @@ cfg_if! {
262262
}
263263

264264
pub fn assert_sync<T: ?Sized + Sync>() {}
265+
pub fn assert_send_val<T: ?Sized + Send>(_t: &T) {}
265266
pub fn assert_send_sync_val<T: ?Sized + Sync + Send>(_t: &T) {}
266267

267268
#[macro_export]

src/librustc_llvm/archive_ro.rs

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ pub struct ArchiveRO {
2222
ptr: ArchiveRef,
2323
}
2424

25+
unsafe impl Send for ArchiveRO {}
26+
2527
pub struct Iter<'a> {
2628
archive: &'a ArchiveRO,
2729
ptr: ::ArchiveIteratorRef,

src/librustc_llvm/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ pub struct ObjectFile {
221221
pub llof: ObjectFileRef,
222222
}
223223

224+
unsafe impl Send for ObjectFile {}
225+
224226
impl ObjectFile {
225227
// This will take ownership of llmb
226228
pub fn new(llmb: MemoryBufferRef) -> Option<ObjectFile> {

src/librustc_metadata/cstore.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use rustc::util::nodemap::{FxHashMap, FxHashSet, NodeMap};
2424

2525
use std::cell::{RefCell, Cell};
2626
use rustc_data_structures::sync::Lrc;
27-
use rustc_data_structures::owning_ref::ErasedBoxRef;
2827
use syntax::{ast, attr};
2928
use syntax::ext::base::SyntaxExtension;
3029
use syntax::symbol::Symbol;
@@ -42,7 +41,9 @@ pub use cstore_impl::{provide, provide_extern};
4241
// own crate numbers.
4342
pub type CrateNumMap = IndexVec<CrateNum, CrateNum>;
4443

45-
pub struct MetadataBlob(pub ErasedBoxRef<[u8]>);
44+
pub use rustc_data_structures::sync::MetadataRef;
45+
46+
pub struct MetadataBlob(pub MetadataRef);
4647

4748
/// Holds information about a syntax_pos::FileMap imported from another crate.
4849
/// See `imported_filemaps()` for more information.

src/librustc_metadata/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ extern crate proc_macro;
3939
#[macro_use]
4040
extern crate rustc;
4141
extern crate rustc_back;
42+
#[macro_use]
4243
extern crate rustc_data_structures;
4344

4445
mod diagnostics;

src/librustc_metadata/locator.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@
219219
//! no means all of the necessary details. Take a look at the rest of
220220
//! metadata::locator or metadata::creader for all the juicy details!
221221
222-
use cstore::MetadataBlob;
222+
use cstore::{MetadataRef, MetadataBlob};
223223
use creader::Library;
224224
use schema::{METADATA_HEADER, rustc_version};
225225

@@ -243,8 +243,8 @@ use std::path::{Path, PathBuf};
243243
use std::time::Instant;
244244

245245
use flate2::read::DeflateDecoder;
246-
use rustc_data_structures::owning_ref::{ErasedBoxRef, OwningRef};
247246

247+
use rustc_data_structures::owning_ref::OwningRef;
248248
pub struct CrateMismatch {
249249
path: PathBuf,
250250
got: String,
@@ -842,7 +842,7 @@ fn get_metadata_section_imp(target: &Target,
842842
if !filename.exists() {
843843
return Err(format!("no such file: '{}'", filename.display()));
844844
}
845-
let raw_bytes: ErasedBoxRef<[u8]> = match flavor {
845+
let raw_bytes: MetadataRef = match flavor {
846846
CrateFlavor::Rlib => loader.get_rlib_metadata(target, filename)?,
847847
CrateFlavor::Dylib => {
848848
let buf = loader.get_dylib_metadata(target, filename)?;
@@ -862,7 +862,7 @@ fn get_metadata_section_imp(target: &Target,
862862
match DeflateDecoder::new(compressed_bytes).read_to_end(&mut inflated) {
863863
Ok(_) => {
864864
let buf = unsafe { OwningRef::new_assert_stable_address(inflated) };
865-
buf.map_owner_box().erase_owner()
865+
rustc_erase_owner!(buf.map_owner_box())
866866
}
867867
Err(_) => {
868868
return Err(format!("failed to decompress metadata: {}", filename.display()));
@@ -872,7 +872,7 @@ fn get_metadata_section_imp(target: &Target,
872872
CrateFlavor::Rmeta => {
873873
let buf = fs::read(filename).map_err(|_|
874874
format!("failed to read rmeta metadata: '{}'", filename.display()))?;
875-
OwningRef::new(buf).map_owner_box().erase_owner()
875+
rustc_erase_owner!(OwningRef::new(buf).map_owner_box())
876876
}
877877
};
878878
let blob = MetadataBlob(raw_bytes);

src/librustc_trans/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ extern crate rustc_allocator;
5050
extern crate rustc_apfloat;
5151
extern crate rustc_back;
5252
extern crate rustc_const_math;
53-
extern crate rustc_data_structures;
53+
#[macro_use] extern crate rustc_data_structures;
5454
extern crate rustc_demangle;
5555
extern crate rustc_incremental;
5656
extern crate rustc_llvm as llvm;

src/librustc_trans/metadata.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,19 @@ use llvm;
1515
use llvm::{False, ObjectFile, mk_section_iter};
1616
use llvm::archive_ro::ArchiveRO;
1717

18-
use rustc_data_structures::owning_ref::{ErasedBoxRef, OwningRef};
18+
use rustc_data_structures::owning_ref::OwningRef;
1919
use std::path::Path;
2020
use std::ptr;
2121
use std::slice;
2222

23+
pub use rustc_data_structures::sync::MetadataRef;
24+
2325
pub const METADATA_FILENAME: &str = "rust.metadata.bin";
2426

2527
pub struct LlvmMetadataLoader;
2628

2729
impl MetadataLoader for LlvmMetadataLoader {
28-
fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result<ErasedBoxRef<[u8]>, String> {
30+
fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result<MetadataRef, String> {
2931
// Use ArchiveRO for speed here, it's backed by LLVM and uses mmap
3032
// internally to read the file. We also avoid even using a memcpy by
3133
// just keeping the archive along while the metadata is in use.
@@ -47,13 +49,13 @@ impl MetadataLoader for LlvmMetadataLoader {
4749
filename.display())
4850
})
4951
})?;
50-
Ok(buf.erase_owner())
52+
Ok(rustc_erase_owner!(buf))
5153
}
5254

5355
fn get_dylib_metadata(&self,
5456
target: &Target,
5557
filename: &Path)
56-
-> Result<ErasedBoxRef<[u8]>, String> {
58+
-> Result<MetadataRef, String> {
5759
unsafe {
5860
let buf = common::path2cstr(filename);
5961
let mb = llvm::LLVMRustCreateMemoryBufferWithContentsOfFile(buf.as_ptr());
@@ -65,7 +67,7 @@ impl MetadataLoader for LlvmMetadataLoader {
6567
.ok_or_else(|| format!("provided path not an object file: '{}'",
6668
filename.display()))?;
6769
let buf = of.try_map(|of| search_meta_section(of, target, filename))?;
68-
Ok(buf.erase_owner())
70+
Ok(rustc_erase_owner!(buf))
6971
}
7072
}
7173
}

src/librustc_trans_utils/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ extern crate rustc_incremental;
4040
#[macro_use]
4141
extern crate syntax;
4242
extern crate syntax_pos;
43-
extern crate rustc_data_structures;
43+
#[macro_use] extern crate rustc_data_structures;
4444

4545
pub extern crate rustc as __rustc;
4646

src/librustc_trans_utils/trans_crate.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use std::fs::File;
2828
use std::path::Path;
2929
use std::sync::mpsc;
3030

31-
use rustc_data_structures::owning_ref::{ErasedBoxRef, OwningRef};
31+
use rustc_data_structures::owning_ref::OwningRef;
3232
use rustc_data_structures::sync::Lrc;
3333
use ar::{Archive, Builder, Header};
3434
use flate2::Compression;
@@ -47,6 +47,8 @@ use rustc_back::target::Target;
4747
use rustc_mir::monomorphize::collector;
4848
use link::{build_link_meta, out_filename};
4949

50+
pub use rustc_data_structures::sync::MetadataRef;
51+
5052
pub trait TransCrate {
5153
fn init(&self, _sess: &Session) {}
5254
fn print(&self, _req: PrintRequest, _sess: &Session) {}
@@ -119,23 +121,23 @@ impl MetadataLoader for DummyMetadataLoader {
119121
&self,
120122
_target: &Target,
121123
_filename: &Path
122-
) -> Result<ErasedBoxRef<[u8]>, String> {
124+
) -> Result<MetadataRef, String> {
123125
bug!("DummyMetadataLoader::get_rlib_metadata");
124126
}
125127

126128
fn get_dylib_metadata(
127129
&self,
128130
_target: &Target,
129131
_filename: &Path
130-
) -> Result<ErasedBoxRef<[u8]>, String> {
132+
) -> Result<MetadataRef, String> {
131133
bug!("DummyMetadataLoader::get_dylib_metadata");
132134
}
133135
}
134136

135137
pub struct NoLlvmMetadataLoader;
136138

137139
impl MetadataLoader for NoLlvmMetadataLoader {
138-
fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result<ErasedBoxRef<[u8]>, String> {
140+
fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result<MetadataRef, String> {
139141
let file = File::open(filename)
140142
.map_err(|e| format!("metadata file open err: {:?}", e))?;
141143
let mut archive = Archive::new(file);
@@ -147,7 +149,7 @@ impl MetadataLoader for NoLlvmMetadataLoader {
147149
let mut buf = Vec::new();
148150
io::copy(&mut entry, &mut buf).unwrap();
149151
let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
150-
return Ok(buf.map_owner_box().erase_owner());
152+
return Ok(rustc_erase_owner!(buf.map_owner_box()));
151153
}
152154
}
153155

@@ -158,7 +160,7 @@ impl MetadataLoader for NoLlvmMetadataLoader {
158160
&self,
159161
_target: &Target,
160162
_filename: &Path,
161-
) -> Result<ErasedBoxRef<[u8]>, String> {
163+
) -> Result<MetadataRef, String> {
162164
// FIXME: Support reading dylibs from llvm enabled rustc
163165
self.get_rlib_metadata(_target, _filename)
164166
}

0 commit comments

Comments
 (0)