x11rb/xcb_ffi/
pending_errors.rs1use std::cmp::Reverse;
8use std::collections::{BinaryHeap, VecDeque};
9use std::sync::Mutex;
10
11use super::{Buffer, XCBConnection};
12use x11rb_protocol::SequenceNumber;
13
14#[derive(Debug, Default)]
15struct PendingErrorsInner {
16 in_flight: BinaryHeap<Reverse<SequenceNumber>>,
17 pending: VecDeque<(SequenceNumber, Buffer)>,
18}
19
20#[derive(Debug, Default)]
22pub(crate) struct PendingErrors {
23 inner: Mutex<PendingErrorsInner>,
24}
25
26impl PendingErrors {
27 pub(crate) fn append_error(&self, error: (SequenceNumber, Buffer)) {
28 self.inner.lock().unwrap().pending.push_back(error)
29 }
30
31 pub(crate) fn discard_reply(&self, sequence: SequenceNumber) {
32 self.inner.lock().unwrap().in_flight.push(Reverse(sequence));
33 }
34
35 pub(crate) fn get(&self, conn: &XCBConnection) -> Option<(SequenceNumber, Buffer)> {
36 let mut inner = self.inner.lock().unwrap();
37
38 let err = inner.pending.pop_front();
40 if err.is_some() {
41 return err;
42 }
43
44 while let Some(&Reverse(seqno)) = inner.in_flight.peek() {
46 let result = match conn.poll_for_reply(seqno) {
47 Err(()) => {
48 return None;
51 }
52 Ok(reply) => reply,
53 };
54
55 let seqno2 = inner.in_flight.pop();
56 assert_eq!(Some(Reverse(seqno)), seqno2);
57
58 if let Some(result) = result {
59 if result[0] == 0 {
61 return Some((seqno, result));
62 } else {
63 }
65 }
66 }
67
68 None
69 }
70}