fix: better try_recv mutex logic for cursor ctrl

This commit is contained in:
əlemi 2024-08-13 18:05:46 +02:00
parent 2a016a6619
commit ab9c6530cd
Signed by: alemi
GPG key ID: A4895B84D311642C

View file

@ -67,14 +67,16 @@ impl Controller<Cursor> for CursorController {
/// try to receive without blocking, but will still block on stream mutex
fn try_recv(&self) -> crate::Result<Option<Cursor>> {
let mut stream = self.0.stream.blocking_lock();
match stream.try_recv() {
Ok(x) => Ok(Some(x.into())),
Err(TryRecvError::Empty) => Ok(None),
Err(TryRecvError::Closed) => Err(crate::Error::Channel { send: false }),
Err(TryRecvError::Lagged(n)) => {
tracing::warn!("cursor channel lagged, skipping {} events", n);
Ok(stream.try_recv().map(|x| x.into()).ok())
match self.0.stream.try_lock() {
Err(_) => Ok(None),
Ok(mut stream) => match stream.try_recv() {
Ok(x) => Ok(Some(x.into())),
Err(TryRecvError::Empty) => Ok(None),
Err(TryRecvError::Closed) => Err(crate::Error::Channel { send: false }),
Err(TryRecvError::Lagged(n)) => {
tracing::warn!("cursor channel lagged, skipping {} events", n);
Ok(stream.try_recv().map(|x| x.into()).ok())
}
}
}
}