diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2019-05-02 16:41:53 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-05-08 19:35:15 -0700 |
commit | 82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e (patch) | |
tree | bff741cb1422e916ffd2a9e26a5efe82045c64ad /devices/src/utils/event_loop.rs | |
parent | bbd24c5a83014807c8c03aac93d06e9f7d81181c (diff) | |
download | crosvm-82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e.tar crosvm-82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e.tar.gz crosvm-82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e.tar.bz2 crosvm-82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e.tar.lz crosvm-82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e.tar.xz crosvm-82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e.tar.zst crosvm-82c0b1d72115b0560ce9ad2f3843dea3a29d6c1e.zip |
usb: set event loop thread name
Set the name of the thread created to run the Xhci controller event loop so that it can be identified more easily in a debugger. BUG=None TEST=Attach to running crosvm with gdb and verify 'info threads' name Change-Id: Id73a580b35231ec7fa7aec5bd51027d32e483bff Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1594192 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'devices/src/utils/event_loop.rs')
-rw-r--r-- | devices/src/utils/event_loop.rs | 100 |
1 files changed, 52 insertions, 48 deletions
diff --git a/devices/src/utils/event_loop.rs b/devices/src/utils/event_loop.rs index b420dcf..405c543 100644 --- a/devices/src/utils/event_loop.rs +++ b/devices/src/utils/event_loop.rs @@ -71,6 +71,7 @@ pub trait EventHandler: Send + Sync { impl EventLoop { /// Start an event loop. An optional fail handle could be passed to the event loop. pub fn start( + name: String, fail_handle: Option<Arc<dyn FailHandle>>, ) -> Result<(EventLoop, thread::JoinHandle<()>)> { let (self_stop_evt, stop_evt) = EventFd::new() @@ -91,59 +92,62 @@ impl EventLoop { stop_evt: self_stop_evt, }; - let handle = thread::spawn(move || { - let event_loop = EpollEvents::new(); - loop { - if fail_handle.failed() { - error!("xhci controller already failed, stopping event ring"); - return; - } - let events = match poll_ctx.wait(&event_loop) { - Ok(events) => events, - Err(e) => { - error!("cannot poll {:?}", e); - fail_handle.fail(); + let handle = thread::Builder::new() + .name(name) + .spawn(move || { + let event_loop = EpollEvents::new(); + loop { + if fail_handle.failed() { + error!("xhci controller already failed, stopping event ring"); return; } - }; - for event in &events { - if event.token().as_raw_fd() == stop_evt.as_raw_fd() { - return; - } else { - let fd = event.token().as_raw_fd(); - let mut locked = fd_callbacks.lock(); - let weak_handler = match locked.get(&fd) { - Some(cb) => cb.clone(), - None => { - warn!("callback for fd {} already removed", fd); - continue; - } - }; - match weak_handler.upgrade() { - Some(handler) => { - // Drop lock before triggering the event. - drop(locked); - match handler.on_event() { - Ok(()) => {} - Err(_) => { - error!("event loop stopping due to handle event error"); - fail_handle.fail(); - return; + let events = match poll_ctx.wait(&event_loop) { + Ok(events) => events, + Err(e) => { + error!("cannot poll {:?}", e); + fail_handle.fail(); + return; + } + }; + for event in &events { + if event.token().as_raw_fd() == stop_evt.as_raw_fd() { + return; + } else { + let fd = event.token().as_raw_fd(); + let mut locked = fd_callbacks.lock(); + let weak_handler = match locked.get(&fd) { + Some(cb) => cb.clone(), + None => { + warn!("callback for fd {} already removed", fd); + continue; + } + }; + match weak_handler.upgrade() { + Some(handler) => { + // Drop lock before triggering the event. + drop(locked); + match handler.on_event() { + Ok(()) => {} + Err(_) => { + error!("event loop stopping due to handle event error"); + fail_handle.fail(); + return; + } + }; + } + // If the handler is already gone, we remove the fd. + None => { + let _ = poll_ctx.delete(&Fd(fd)); + if locked.remove(&fd).is_none() { + error!("fail to remove handler for file descriptor {}", fd); } - }; - } - // If the handler is already gone, we remove the fd. - None => { - let _ = poll_ctx.delete(&Fd(fd)); - if locked.remove(&fd).is_none() { - error!("fail to remove handler for file descriptor {}", fd); } - } - }; + }; + } } } - } - }); + }) + .map_err(Error::StartThread)?; Ok((event_loop, handle)) } @@ -219,7 +223,7 @@ mod tests { #[test] fn event_loop_test() { - let (l, j) = EventLoop::start(None).unwrap(); + let (l, j) = EventLoop::start("test".to_string(), None).unwrap(); let (self_evt, evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) { Ok(v) => v, Err(e) => { |