xwayland: fix logging of stderr
This commit is contained in:
parent
b8fedbd23c
commit
544f23ffb0
4 changed files with 53 additions and 46 deletions
|
|
@ -21,15 +21,14 @@ use {
|
||||||
ptl_screencast::{add_screencast_dbus_members, ScreencastSession},
|
ptl_screencast::{add_screencast_dbus_members, ScreencastSession},
|
||||||
},
|
},
|
||||||
utils::{
|
utils::{
|
||||||
buf::Buf,
|
|
||||||
clone3::{fork_with_pidfd, Forked},
|
clone3::{fork_with_pidfd, Forked},
|
||||||
copyhashmap::CopyHashMap,
|
copyhashmap::CopyHashMap,
|
||||||
errorfmt::ErrorFmt,
|
errorfmt::ErrorFmt,
|
||||||
|
line_logger::log_lines,
|
||||||
numcell::NumCell,
|
numcell::NumCell,
|
||||||
oserror::OsError,
|
oserror::OsError,
|
||||||
process_name::set_process_name,
|
process_name::set_process_name,
|
||||||
run_toplevel::RunToplevel,
|
run_toplevel::RunToplevel,
|
||||||
vecdeque_ext::VecDequeExt,
|
|
||||||
xrd::xrd,
|
xrd::xrd,
|
||||||
},
|
},
|
||||||
video::dmabuf::DmaBufIds,
|
video::dmabuf::DmaBufIds,
|
||||||
|
|
@ -38,7 +37,6 @@ use {
|
||||||
},
|
},
|
||||||
log::Level,
|
log::Level,
|
||||||
std::{
|
std::{
|
||||||
collections::VecDeque,
|
|
||||||
rc::{Rc, Weak},
|
rc::{Rc, Weak},
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
},
|
},
|
||||||
|
|
@ -104,25 +102,14 @@ impl PortalStartup {
|
||||||
let ring = ring.clone();
|
let ring = ring.clone();
|
||||||
let logger = logger.clone();
|
let logger = logger.clone();
|
||||||
async move {
|
async move {
|
||||||
let mut buf = VecDeque::<u8>::new();
|
let res = log_lines(&ring, &self.logs, |left, right| {
|
||||||
let mut buf2 = Buf::new(1024);
|
logger.write_raw(left);
|
||||||
let mut done = false;
|
logger.write_raw(right);
|
||||||
while !done {
|
logger.write_raw(b" (portal)\n");
|
||||||
match ring.read(&self.logs, buf2.clone()).await {
|
})
|
||||||
Ok(n) if n > 0 => buf.extend(&buf2[..n]),
|
.await;
|
||||||
Ok(_) => done = true,
|
if let Err(e) = res {
|
||||||
Err(e) => {
|
log::error!("Could not read portal logs: {}", ErrorFmt(e));
|
||||||
log::error!("Could not read portal logs: {}", ErrorFmt(e));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
while let Some(pos) = buf.iter().position(|b| b == &b'\n') {
|
|
||||||
let (left, right) = buf.get_slices(..pos);
|
|
||||||
logger.write_raw(left);
|
|
||||||
logger.write_raw(right);
|
|
||||||
logger.write_raw(b" (portal)\n");
|
|
||||||
buf.drain(..=pos);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ pub mod errorfmt;
|
||||||
pub mod fdcloser;
|
pub mod fdcloser;
|
||||||
pub mod gfx_api_ext;
|
pub mod gfx_api_ext;
|
||||||
pub mod hex;
|
pub mod hex;
|
||||||
|
pub mod line_logger;
|
||||||
pub mod linkedlist;
|
pub mod linkedlist;
|
||||||
pub mod log_on_drop;
|
pub mod log_on_drop;
|
||||||
pub mod mmap;
|
pub mod mmap;
|
||||||
|
|
|
||||||
36
src/utils/line_logger.rs
Normal file
36
src/utils/line_logger.rs
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
use {
|
||||||
|
crate::{
|
||||||
|
io_uring::{IoUring, IoUringError},
|
||||||
|
utils::{buf::Buf, vecdeque_ext::VecDequeExt},
|
||||||
|
},
|
||||||
|
isnt::std_1::collections::IsntVecDequeExt,
|
||||||
|
std::{collections::VecDeque, rc::Rc},
|
||||||
|
uapi::OwnedFd,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub async fn log_lines(
|
||||||
|
ring: &IoUring,
|
||||||
|
fd: &Rc<OwnedFd>,
|
||||||
|
mut f: impl FnMut(&[u8], &[u8]),
|
||||||
|
) -> Result<(), IoUringError> {
|
||||||
|
let mut buf = VecDeque::<u8>::new();
|
||||||
|
let mut buf2 = Buf::new(1024);
|
||||||
|
let mut done = false;
|
||||||
|
while !done {
|
||||||
|
let n = ring.read(fd, buf2.clone()).await?;
|
||||||
|
buf.extend(&buf2[..n]);
|
||||||
|
if n == 0 {
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
while let Some(pos) = buf.iter().position(|b| b == &b'\n') {
|
||||||
|
let (left, right) = buf.get_slices(..pos);
|
||||||
|
f(left, right);
|
||||||
|
buf.drain(..=pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if buf.is_not_empty() {
|
||||||
|
let (left, right) = buf.as_slices();
|
||||||
|
f(left, right);
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
@ -18,7 +18,7 @@ use {
|
||||||
io_uring::IoUringError,
|
io_uring::IoUringError,
|
||||||
state::State,
|
state::State,
|
||||||
user_session::import_environment,
|
user_session::import_environment,
|
||||||
utils::{buf::Buf, errorfmt::ErrorFmt, oserror::OsError},
|
utils::{errorfmt::ErrorFmt, line_logger::log_lines, oserror::OsError},
|
||||||
wire::WlSurfaceId,
|
wire::WlSurfaceId,
|
||||||
xcon::XconError,
|
xcon::XconError,
|
||||||
xwayland::{
|
xwayland::{
|
||||||
|
|
@ -217,29 +217,12 @@ pub fn build_args() -> (String, Vec<String>) {
|
||||||
|
|
||||||
async fn log_xwayland(state: Rc<State>, stderr: OwnedFd) {
|
async fn log_xwayland(state: Rc<State>, stderr: OwnedFd) {
|
||||||
let stderr = Rc::new(stderr);
|
let stderr = Rc::new(stderr);
|
||||||
let mut buf = vec![];
|
let res = log_lines(&state.ring, &stderr, |left, right| {
|
||||||
let mut buf2 = Buf::new(128);
|
log::info!("Xwayland: {}{}", left.as_bstr(), right.as_bstr());
|
||||||
let mut done = false;
|
})
|
||||||
while !done {
|
.await;
|
||||||
loop {
|
if let Err(e) = res {
|
||||||
match state.ring.read(&stderr, buf2.clone()).await {
|
log::error!("Could not read from stderr fd: {}", ErrorFmt(e));
|
||||||
Ok(n) if n > 0 => {
|
|
||||||
buf.extend_from_slice(&buf2[..n]);
|
|
||||||
}
|
|
||||||
Ok(_) => {
|
|
||||||
done = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
log::error!("Could not read from stderr fd: {}", ErrorFmt(e));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for line in buf.lines() {
|
|
||||||
log::info!("Xwayland: {}", line.as_bstr());
|
|
||||||
}
|
|
||||||
buf.clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue