mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Auto merge of #116185 - Zoxc:rem-one-thread, r=cjgillot
Remove `OneThread` This removes `OneThread` by switching `incr_comp_session` over to `RwLock`.
This commit is contained in:
commit
6745c6000a
@ -177,7 +177,6 @@ cfg_match! {
|
|||||||
[Vec<T, A> where T: DynSync, A: std::alloc::Allocator + DynSync]
|
[Vec<T, A> where T: DynSync, A: std::alloc::Allocator + DynSync]
|
||||||
[Box<T, A> where T: ?Sized + DynSync, A: std::alloc::Allocator + DynSync]
|
[Box<T, A> where T: ?Sized + DynSync, A: std::alloc::Allocator + DynSync]
|
||||||
[crate::sync::RwLock<T> where T: DynSend + DynSync]
|
[crate::sync::RwLock<T> where T: DynSend + DynSync]
|
||||||
[crate::sync::OneThread<T> where T]
|
|
||||||
[crate::sync::WorkerLocal<T> where T: DynSend]
|
[crate::sync::WorkerLocal<T> where T: DynSend]
|
||||||
[crate::intern::Interned<'a, T> where 'a, T: DynSync]
|
[crate::intern::Interned<'a, T> where 'a, T: DynSync]
|
||||||
[crate::tagged_ptr::CopyTaggedPtr<P, T, CP> where P: Sync + crate::tagged_ptr::Pointer, T: Sync + crate::tagged_ptr::Tag, const CP: bool]
|
[crate::tagged_ptr::CopyTaggedPtr<P, T, CP> where P: Sync + crate::tagged_ptr::Pointer, T: Sync + crate::tagged_ptr::Tag, const CP: bool]
|
||||||
|
@ -43,7 +43,6 @@
|
|||||||
pub use crate::marker::*;
|
pub use crate::marker::*;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::hash::{BuildHasher, Hash};
|
use std::hash::{BuildHasher, Hash};
|
||||||
use std::ops::{Deref, DerefMut};
|
|
||||||
|
|
||||||
mod lock;
|
mod lock;
|
||||||
pub use lock::{Lock, LockGuard, Mode};
|
pub use lock::{Lock, LockGuard, Mode};
|
||||||
@ -309,8 +308,6 @@ cfg_match! {
|
|||||||
|
|
||||||
use parking_lot::RwLock as InnerRwLock;
|
use parking_lot::RwLock as InnerRwLock;
|
||||||
|
|
||||||
use std::thread;
|
|
||||||
|
|
||||||
/// This makes locks panic if they are already held.
|
/// This makes locks panic if they are already held.
|
||||||
/// It is only useful when you are running in a single thread
|
/// It is only useful when you are running in a single thread
|
||||||
const ERROR_CHECKING: bool = false;
|
const ERROR_CHECKING: bool = false;
|
||||||
@ -445,56 +442,3 @@ impl<T: Clone> Clone for RwLock<T> {
|
|||||||
RwLock::new(self.borrow().clone())
|
RwLock::new(self.borrow().clone())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A type which only allows its inner value to be used in one thread.
|
|
||||||
/// It will panic if it is used on multiple threads.
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct OneThread<T> {
|
|
||||||
#[cfg(parallel_compiler)]
|
|
||||||
thread: thread::ThreadId,
|
|
||||||
inner: T,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(parallel_compiler)]
|
|
||||||
unsafe impl<T> std::marker::Sync for OneThread<T> {}
|
|
||||||
#[cfg(parallel_compiler)]
|
|
||||||
unsafe impl<T> std::marker::Send for OneThread<T> {}
|
|
||||||
|
|
||||||
impl<T> OneThread<T> {
|
|
||||||
#[inline(always)]
|
|
||||||
fn check(&self) {
|
|
||||||
#[cfg(parallel_compiler)]
|
|
||||||
assert_eq!(thread::current().id(), self.thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
pub fn new(inner: T) -> Self {
|
|
||||||
OneThread {
|
|
||||||
#[cfg(parallel_compiler)]
|
|
||||||
thread: thread::current().id(),
|
|
||||||
inner,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
pub fn into_inner(value: Self) -> T {
|
|
||||||
value.check();
|
|
||||||
value.inner
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> Deref for OneThread<T> {
|
|
||||||
type Target = T;
|
|
||||||
|
|
||||||
fn deref(&self) -> &T {
|
|
||||||
self.check();
|
|
||||||
&self.inner
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T> DerefMut for OneThread<T> {
|
|
||||||
fn deref_mut(&mut self) -> &mut T {
|
|
||||||
self.check();
|
|
||||||
&mut self.inner
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -14,7 +14,9 @@ use rustc_data_structures::flock;
|
|||||||
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
||||||
use rustc_data_structures::jobserver::{self, Client};
|
use rustc_data_structures::jobserver::{self, Client};
|
||||||
use rustc_data_structures::profiling::{SelfProfiler, SelfProfilerRef};
|
use rustc_data_structures::profiling::{SelfProfiler, SelfProfilerRef};
|
||||||
use rustc_data_structures::sync::{AtomicU64, DynSend, DynSync, Lock, Lrc, OneThread};
|
use rustc_data_structures::sync::{
|
||||||
|
AtomicU64, DynSend, DynSync, Lock, Lrc, MappedReadGuard, ReadGuard, RwLock,
|
||||||
|
};
|
||||||
use rustc_errors::annotate_snippet_emitter_writer::AnnotateSnippetEmitter;
|
use rustc_errors::annotate_snippet_emitter_writer::AnnotateSnippetEmitter;
|
||||||
use rustc_errors::emitter::{DynEmitter, HumanEmitter, HumanReadableErrorType};
|
use rustc_errors::emitter::{DynEmitter, HumanEmitter, HumanReadableErrorType};
|
||||||
use rustc_errors::json::JsonEmitter;
|
use rustc_errors::json::JsonEmitter;
|
||||||
@ -35,7 +37,6 @@ use rustc_target::spec::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
use std::cell::{self, RefCell};
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::ops::{Div, Mul};
|
use std::ops::{Div, Mul};
|
||||||
@ -149,7 +150,7 @@ pub struct Session {
|
|||||||
/// Input, input file path and output file path to this compilation process.
|
/// Input, input file path and output file path to this compilation process.
|
||||||
pub io: CompilerIO,
|
pub io: CompilerIO,
|
||||||
|
|
||||||
incr_comp_session: OneThread<RefCell<IncrCompSession>>,
|
incr_comp_session: RwLock<IncrCompSession>,
|
||||||
|
|
||||||
/// Used by `-Z self-profile`.
|
/// Used by `-Z self-profile`.
|
||||||
pub prof: SelfProfilerRef,
|
pub prof: SelfProfilerRef,
|
||||||
@ -533,9 +534,9 @@ impl Session {
|
|||||||
*incr_comp_session = IncrCompSession::InvalidBecauseOfErrors { session_directory };
|
*incr_comp_session = IncrCompSession::InvalidBecauseOfErrors { session_directory };
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn incr_comp_session_dir(&self) -> cell::Ref<'_, PathBuf> {
|
pub fn incr_comp_session_dir(&self) -> MappedReadGuard<'_, PathBuf> {
|
||||||
let incr_comp_session = self.incr_comp_session.borrow();
|
let incr_comp_session = self.incr_comp_session.borrow();
|
||||||
cell::Ref::map(incr_comp_session, |incr_comp_session| match *incr_comp_session {
|
ReadGuard::map(incr_comp_session, |incr_comp_session| match *incr_comp_session {
|
||||||
IncrCompSession::NotInitialized => panic!(
|
IncrCompSession::NotInitialized => panic!(
|
||||||
"trying to get session directory from `IncrCompSession`: {:?}",
|
"trying to get session directory from `IncrCompSession`: {:?}",
|
||||||
*incr_comp_session,
|
*incr_comp_session,
|
||||||
@ -548,7 +549,7 @@ impl Session {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn incr_comp_session_dir_opt(&self) -> Option<cell::Ref<'_, PathBuf>> {
|
pub fn incr_comp_session_dir_opt(&self) -> Option<MappedReadGuard<'_, PathBuf>> {
|
||||||
self.opts.incremental.as_ref().map(|_| self.incr_comp_session_dir())
|
self.opts.incremental.as_ref().map(|_| self.incr_comp_session_dir())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1176,7 +1177,7 @@ pub fn build_session(
|
|||||||
parse_sess,
|
parse_sess,
|
||||||
sysroot,
|
sysroot,
|
||||||
io,
|
io,
|
||||||
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
|
incr_comp_session: RwLock::new(IncrCompSession::NotInitialized),
|
||||||
prof,
|
prof,
|
||||||
code_stats: Default::default(),
|
code_stats: Default::default(),
|
||||||
optimization_fuel,
|
optimization_fuel,
|
||||||
|
Loading…
Reference in New Issue
Block a user