Skip to content

Commit

Permalink
Remove OneThread
Browse files Browse the repository at this point in the history
  • Loading branch information
Zoxc committed Sep 26, 2023
1 parent 6710e33 commit ef09956
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 64 deletions.
1 change: 0 additions & 1 deletion compiler/rustc_data_structures/src/marker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,6 @@ cfg_if!(
[Vec<T, A> where T: 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::OneThread<T> where T]
[crate::sync::WorkerLocal<T> where T: DynSend]
[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]
Expand Down
56 changes: 0 additions & 56 deletions compiler/rustc_data_structures/src/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
pub use crate::marker::*;
use std::collections::HashMap;
use std::hash::{BuildHasher, Hash};
use std::ops::{Deref, DerefMut};

mod lock;
pub use lock::{Lock, LockGuard, Mode};
Expand Down Expand Up @@ -303,8 +302,6 @@ cfg_if! {

use parking_lot::RwLock as InnerRwLock;

use std::thread;

/// This makes locks panic if they are already held.
/// It is only useful when you are running in a single thread
const ERROR_CHECKING: bool = false;
Expand Down Expand Up @@ -439,56 +436,3 @@ impl<T: Clone> Clone for RwLock<T> {
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 changes: 7 additions & 7 deletions compiler/rustc_session/src/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
use rustc_data_structures::jobserver::{self, Client};
use rustc_data_structures::profiling::{duration_to_secs_str, SelfProfiler, SelfProfilerRef};
use rustc_data_structures::sync::{
AtomicU64, AtomicUsize, Lock, Lrc, OneThread, Ordering, Ordering::SeqCst,
AtomicU64, AtomicUsize, Lock, Lrc, MappedReadGuard, Ordering, Ordering::SeqCst, ReadGuard,
RwLock,
};
use rustc_errors::annotate_snippet_emitter_writer::AnnotateSnippetEmitterWriter;
use rustc_errors::emitter::{DynEmitter, EmitterWriter, HumanReadableErrorType};
Expand All @@ -39,7 +40,6 @@ use rustc_target::spec::{
DebuginfoKind, SanitizerSet, SplitDebuginfo, StackProtector, Target, TargetTriple, TlsModel,
};

use std::cell::{self, RefCell};
use std::env;
use std::fmt;
use std::ops::{Div, Mul};
Expand Down Expand Up @@ -152,7 +152,7 @@ pub struct Session {
/// Input, input file path and output file path to this compilation process.
pub io: CompilerIO,

incr_comp_session: OneThread<RefCell<IncrCompSession>>,
incr_comp_session: RwLock<IncrCompSession>,
/// Used for incremental compilation tests. Will only be populated if
/// `-Zquery-dep-graph` is specified.
pub cgu_reuse_tracker: CguReuseTracker,
Expand Down Expand Up @@ -853,9 +853,9 @@ impl Session {
*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();
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!(
"trying to get session directory from `IncrCompSession`: {:?}",
*incr_comp_session,
Expand All @@ -868,7 +868,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())
}

Expand Down Expand Up @@ -1460,7 +1460,7 @@ pub fn build_session(
parse_sess,
sysroot,
io,
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
incr_comp_session: RwLock::new(IncrCompSession::NotInitialized),
cgu_reuse_tracker,
prof,
perf_stats: PerfStats {
Expand Down

0 comments on commit ef09956

Please sign in to comment.