Skip to content

Commit e311230

Browse files
committed
Push back the incompleted operation.
1 parent ad28825 commit e311230

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

src/driver/poll/mod.rs

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,36 @@ struct FdQueue {
8080
}
8181

8282
impl FdQueue {
83-
pub fn push_interest(&mut self, user_data: usize, interest: Interest) {
83+
pub fn push_back_interest(&mut self, user_data: usize, interest: Interest) {
8484
match interest {
8585
Interest::Readable => self.read_queue.push_back(user_data),
8686
Interest::Writable => self.write_queue.push_back(user_data),
8787
}
8888
}
8989

90+
pub fn push_front_interest(&mut self, user_data: usize, interest: Interest) {
91+
match interest {
92+
Interest::Readable => self.read_queue.push_front(user_data),
93+
Interest::Writable => self.write_queue.push_front(user_data),
94+
}
95+
}
96+
9097
pub fn event(&self, key: usize) -> Event {
9198
let mut event = Event::all(key);
9299
event.readable = !self.read_queue.is_empty();
93100
event.writable = !self.write_queue.is_empty();
94101
event
95102
}
96103

97-
pub fn pop_interest(&mut self, event: &Event) -> usize {
104+
pub fn pop_interest(&mut self, event: &Event) -> (usize, Interest) {
98105
if event.readable {
99106
if let Some(user_data) = self.read_queue.pop_front() {
100-
return user_data;
107+
return (user_data, Interest::Readable);
101108
}
102109
}
103110
if event.writable {
104111
if let Some(user_data) = self.write_queue.pop_front() {
105-
return user_data;
112+
return (user_data, Interest::Writable);
106113
}
107114
}
108115
unreachable!("should receive event when no interest")
@@ -140,7 +147,7 @@ impl Driver {
140147
} else {
141148
let need_add = !self.registry.contains_key(&arg.fd);
142149
let queue = self.registry.entry(arg.fd).or_default();
143-
queue.push_interest(user_data, arg.interest);
150+
queue.push_back_interest(user_data, arg.interest);
144151
// We use fd as the key.
145152
let event = queue.event(arg.fd as usize);
146153
unsafe {
@@ -205,23 +212,29 @@ impl Driver {
205212
.registry
206213
.get_mut(&fd)
207214
.expect("the fd should be attached");
208-
let user_data = queue.pop_interest(&event);
209-
let renew_event = queue.event(fd as _);
210-
unsafe {
211-
let fd = BorrowedFd::borrow_raw(fd);
212-
self.poll.modify(fd, renew_event)?;
213-
}
215+
let (user_data, interest) = queue.pop_interest(&event);
214216
if self.cancelled.remove(&user_data) {
215217
entries.extend(Some(entry_cancelled(user_data)));
216218
} else {
217219
let op = registry[user_data].as_pin();
218220
let res = match op.on_event(&event) {
219-
Ok(ControlFlow::Continue(_)) => continue,
220-
Ok(ControlFlow::Break(res)) => Ok(res),
221-
Err(err) => Err(err),
221+
Ok(ControlFlow::Continue(_)) => {
222+
// The operation should go back to the front.
223+
queue.push_front_interest(user_data, interest);
224+
None
225+
}
226+
Ok(ControlFlow::Break(res)) => Some(Ok(res)),
227+
Err(err) => Some(Err(err)),
222228
};
223-
let entry = Entry::new(user_data, res);
224-
entries.extend(Some(entry));
229+
if let Some(res) = res {
230+
let entry = Entry::new(user_data, res);
231+
entries.extend(Some(entry));
232+
}
233+
}
234+
let renew_event = queue.event(fd as _);
235+
unsafe {
236+
let fd = BorrowedFd::borrow_raw(fd);
237+
self.poll.modify(fd, renew_event)?;
225238
}
226239
}
227240
Ok(())

0 commit comments

Comments
 (0)