From 9a0bfb3a722fcb5c1f52f2b3ff76c135566b0707 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 29 Apr 2022 17:35:55 +0200 Subject: [PATCH] autocommit 2022-04-29 17:35:55 CEST --- src/clientmem.rs | 37 +++++++++++++++++-------------------- src/logger.rs | 7 +++---- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/clientmem.rs b/src/clientmem.rs index 81645d07..009128d2 100644 --- a/src/clientmem.rs +++ b/src/clientmem.rs @@ -1,6 +1,6 @@ use { std::{ - cell::{Cell, UnsafeCell}, + cell::Cell, mem::MaybeUninit, ptr, rc::Rc, @@ -82,21 +82,19 @@ impl ClientMemOffset { if self.mem.sigbus_impossible { return Ok(f(&*self.data)); } - MEM.with(|m| { - let mref = MemRef { - mem: &*self.mem, - outer: *m.get(), - }; - *m.get() = &mref; - compiler_fence(Ordering::SeqCst); - let res = f(&*self.data); - *m.get() = mref.outer; - compiler_fence(Ordering::SeqCst); - match self.mem.failed.get() { - true => Err(ClientMemError::Sigbus), - _ => Ok(res), - } - }) + let mref = MemRef { + mem: &*self.mem, + outer: MEM, + }; + MEM = &mref; + compiler_fence(Ordering::SeqCst); + let res = f(&*self.data); + MEM = mref.outer; + compiler_fence(Ordering::SeqCst); + match self.mem.failed.get() { + true => Err(ClientMemError::Sigbus), + _ => Ok(res), + } } } } @@ -114,9 +112,8 @@ struct MemRef { outer: *const MemRef, } -thread_local! { - static MEM: UnsafeCell<*const MemRef> = UnsafeCell::new(ptr::null()); -} +#[thread_local] +static mut MEM: *const MemRef = ptr::null(); unsafe fn kill() -> ! { c::signal(c::SIGBUS, c::SIG_DFL); @@ -126,7 +123,7 @@ unsafe fn kill() -> ! { unsafe extern "C" fn sigbus(sig: i32, info: &c::siginfo_t, _ucontext: *mut c::c_void) { assert_eq!(sig, c::SIGBUS); - let mut memr_ptr = MEM.with(|m| ptr::read(m.get())); + let mut memr_ptr = MEM; while !memr_ptr.is_null() { let memr = &*memr_ptr; let mem = &*memr.mem; diff --git a/src/logger.rs b/src/logger.rs index 58d65994..32b4666c 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -1,10 +1,9 @@ use { - crate::utils::{errorfmt::ErrorFmt, oserror::OsError, ptr_ext::MutPtrExt}, + crate::utils::{errorfmt::ErrorFmt, oserror::OsError}, backtrace::Backtrace, bstr::{BStr, BString, ByteSlice}, log::{Level, Log, Metadata, Record}, std::{ - cell::UnsafeCell, fs::DirBuilder, io::Write, os::unix::{ffi::OsStringExt, fs::DirBuilderExt}, @@ -18,7 +17,7 @@ use { }; #[thread_local] -static BUFFER: UnsafeCell> = UnsafeCell::new(Vec::new()); +static mut BUFFER: Vec = Vec::new(); pub struct Logger { level: AtomicU32, @@ -142,7 +141,7 @@ impl Log for LogWrapper { if record.level() as u32 > self.logger.level.load(Relaxed) { return; } - let buffer = unsafe { BUFFER.get().deref_mut() }; + let buffer = unsafe { &mut BUFFER }; buffer.clear(); let now = SystemTime::now(); let _ = if let Some(mp) = record.module_path() {