1
0
Fork 0
forked from wry/wry

autocommit 2022-04-29 17:35:55 CEST

This commit is contained in:
Julian Orth 2022-04-29 17:35:55 +02:00
parent aba40dc773
commit 9a0bfb3a72
2 changed files with 20 additions and 24 deletions

View file

@ -1,6 +1,6 @@
use { use {
std::{ std::{
cell::{Cell, UnsafeCell}, cell::Cell,
mem::MaybeUninit, mem::MaybeUninit,
ptr, ptr,
rc::Rc, rc::Rc,
@ -82,21 +82,19 @@ impl ClientMemOffset {
if self.mem.sigbus_impossible { if self.mem.sigbus_impossible {
return Ok(f(&*self.data)); return Ok(f(&*self.data));
} }
MEM.with(|m| { let mref = MemRef {
let mref = MemRef { mem: &*self.mem,
mem: &*self.mem, outer: MEM,
outer: *m.get(), };
}; MEM = &mref;
*m.get() = &mref; compiler_fence(Ordering::SeqCst);
compiler_fence(Ordering::SeqCst); let res = f(&*self.data);
let res = f(&*self.data); MEM = mref.outer;
*m.get() = mref.outer; compiler_fence(Ordering::SeqCst);
compiler_fence(Ordering::SeqCst); match self.mem.failed.get() {
match self.mem.failed.get() { true => Err(ClientMemError::Sigbus),
true => Err(ClientMemError::Sigbus), _ => Ok(res),
_ => Ok(res), }
}
})
} }
} }
} }
@ -114,9 +112,8 @@ struct MemRef {
outer: *const MemRef, outer: *const MemRef,
} }
thread_local! { #[thread_local]
static MEM: UnsafeCell<*const MemRef> = UnsafeCell::new(ptr::null()); static mut MEM: *const MemRef = ptr::null();
}
unsafe fn kill() -> ! { unsafe fn kill() -> ! {
c::signal(c::SIGBUS, c::SIG_DFL); 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) { unsafe extern "C" fn sigbus(sig: i32, info: &c::siginfo_t, _ucontext: *mut c::c_void) {
assert_eq!(sig, c::SIGBUS); 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() { while !memr_ptr.is_null() {
let memr = &*memr_ptr; let memr = &*memr_ptr;
let mem = &*memr.mem; let mem = &*memr.mem;

View file

@ -1,10 +1,9 @@
use { use {
crate::utils::{errorfmt::ErrorFmt, oserror::OsError, ptr_ext::MutPtrExt}, crate::utils::{errorfmt::ErrorFmt, oserror::OsError},
backtrace::Backtrace, backtrace::Backtrace,
bstr::{BStr, BString, ByteSlice}, bstr::{BStr, BString, ByteSlice},
log::{Level, Log, Metadata, Record}, log::{Level, Log, Metadata, Record},
std::{ std::{
cell::UnsafeCell,
fs::DirBuilder, fs::DirBuilder,
io::Write, io::Write,
os::unix::{ffi::OsStringExt, fs::DirBuilderExt}, os::unix::{ffi::OsStringExt, fs::DirBuilderExt},
@ -18,7 +17,7 @@ use {
}; };
#[thread_local] #[thread_local]
static BUFFER: UnsafeCell<Vec<u8>> = UnsafeCell::new(Vec::new()); static mut BUFFER: Vec<u8> = Vec::new();
pub struct Logger { pub struct Logger {
level: AtomicU32, level: AtomicU32,
@ -142,7 +141,7 @@ impl Log for LogWrapper {
if record.level() as u32 > self.logger.level.load(Relaxed) { if record.level() as u32 > self.logger.level.load(Relaxed) {
return; return;
} }
let buffer = unsafe { BUFFER.get().deref_mut() }; let buffer = unsafe { &mut BUFFER };
buffer.clear(); buffer.clear();
let now = SystemTime::now(); let now = SystemTime::now();
let _ = if let Some(mp) = record.module_path() { let _ = if let Some(mp) = record.module_path() {