autocommit 2022-04-29 17:35:55 CEST
This commit is contained in:
parent
aba40dc773
commit
9a0bfb3a72
2 changed files with 20 additions and 24 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue