@@ -8,7 +8,6 @@ use crate::io::prelude::*;
88use crate :: cell:: { Cell , RefCell } ;
99use crate :: fmt;
1010use crate :: io:: { self , BufReader , IoSlice , IoSliceMut , LineWriter , Lines } ;
11- use crate :: pin:: Pin ;
1211use crate :: sync:: atomic:: { AtomicBool , Ordering } ;
1312use crate :: sync:: { Arc , Mutex , MutexGuard , OnceLock } ;
1413use crate :: sys:: stdio;
@@ -526,7 +525,7 @@ pub struct Stdout {
526525 // FIXME: this should be LineWriter or BufWriter depending on the state of
527526 // stdout (tty or not). Note that if this is not line buffered it
528527 // should also flush-on-panic or some form of flush-on-abort.
529- inner : Pin < & ' static ReentrantMutex < RefCell < LineWriter < StdoutRaw > > > > ,
528+ inner : & ' static ReentrantMutex < RefCell < LineWriter < StdoutRaw > > > ,
530529}
531530
532531/// A locked reference to the [`Stdout`] handle.
@@ -603,24 +602,20 @@ static STDOUT: OnceLock<ReentrantMutex<RefCell<LineWriter<StdoutRaw>>>> = OnceLo
603602#[ stable( feature = "rust1" , since = "1.0.0" ) ]
604603pub fn stdout ( ) -> Stdout {
605604 Stdout {
606- inner : Pin :: static_ref ( & STDOUT ) . get_or_init_pin (
607- || unsafe { ReentrantMutex :: new ( RefCell :: new ( LineWriter :: new ( stdout_raw ( ) ) ) ) } ,
608- |mutex| unsafe { mutex. init ( ) } ,
609- ) ,
605+ inner : STDOUT
606+ . get_or_init ( || ReentrantMutex :: new ( RefCell :: new ( LineWriter :: new ( stdout_raw ( ) ) ) ) ) ,
610607 }
611608}
612609
613610pub fn cleanup ( ) {
614- if let Some ( instance) = STDOUT . get ( ) {
615- // Flush the data and disable buffering during shutdown
616- // by replacing the line writer by one with zero
617- // buffering capacity.
618- // We use try_lock() instead of lock(), because someone
619- // might have leaked a StdoutLock, which would
620- // otherwise cause a deadlock here.
621- if let Some ( lock) = Pin :: static_ref ( instance) . try_lock ( ) {
622- * lock. borrow_mut ( ) = LineWriter :: with_capacity ( 0 , stdout_raw ( ) ) ;
623- }
611+ // Flush the data and disable buffering during shutdown
612+ // by replacing the line writer by one with zero
613+ // buffering capacity.
614+ // We use try_lock() instead of lock(), because someone
615+ // might have leaked a StdoutLock, which would
616+ // otherwise cause a deadlock here.
617+ if let Some ( lock) = STDOUT . get ( ) . and_then ( ReentrantMutex :: try_lock) {
618+ * lock. borrow_mut ( ) = LineWriter :: with_capacity ( 0 , stdout_raw ( ) ) ;
624619 }
625620}
626621
@@ -761,7 +756,7 @@ impl fmt::Debug for StdoutLock<'_> {
761756/// standard library or via raw Windows API calls, will fail.
762757#[ stable( feature = "rust1" , since = "1.0.0" ) ]
763758pub struct Stderr {
764- inner : Pin < & ' static ReentrantMutex < RefCell < StderrRaw > > > ,
759+ inner : & ' static ReentrantMutex < RefCell < StderrRaw > > ,
765760}
766761
767762/// A locked reference to the [`Stderr`] handle.
@@ -834,16 +829,12 @@ pub struct StderrLock<'a> {
834829#[ stable( feature = "rust1" , since = "1.0.0" ) ]
835830pub fn stderr ( ) -> Stderr {
836831 // Note that unlike `stdout()` we don't use `at_exit` here to register a
837- // destructor. Stderr is not buffered , so there's no need to run a
832+ // destructor. Stderr is not buffered, so there's no need to run a
838833 // destructor for flushing the buffer
839- static INSTANCE : OnceLock < ReentrantMutex < RefCell < StderrRaw > > > = OnceLock :: new ( ) ;
834+ static INSTANCE : ReentrantMutex < RefCell < StderrRaw > > =
835+ ReentrantMutex :: new ( RefCell :: new ( stderr_raw ( ) ) ) ;
840836
841- Stderr {
842- inner : Pin :: static_ref ( & INSTANCE ) . get_or_init_pin (
843- || unsafe { ReentrantMutex :: new ( RefCell :: new ( stderr_raw ( ) ) ) } ,
844- |mutex| unsafe { mutex. init ( ) } ,
845- ) ,
846- }
837+ Stderr { inner : & INSTANCE }
847838}
848839
849840impl Stderr {
0 commit comments