Skip to content

Commit 0bb7282

Browse files
authored
fix(poll): renew event with valid user_data (#340)
* fix(poll): renew event with valid user_data * feat(driver): new release * fix(poll): flags of renew event
1 parent cda8471 commit 0bb7282

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

compio-driver/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "compio-driver"
3-
version = "0.6.0"
3+
version = "0.6.1"
44
description = "Low-level driver for compio"
55
categories = ["asynchronous"]
66
keywords = ["async", "iocp", "io-uring"]

compio-driver/src/poll/mod.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,16 @@ impl FdQueue {
123123
}
124124
}
125125

126-
pub fn event(&self, key: usize) -> Event {
127-
let mut event = Event::all(key);
128-
event.readable = !self.read_queue.is_empty();
129-
event.writable = !self.write_queue.is_empty();
126+
pub fn event(&self) -> Event {
127+
let mut event = Event::none(0);
128+
if let Some(&key) = self.read_queue.front() {
129+
event.readable = true;
130+
event.key = key;
131+
}
132+
if let Some(&key) = self.write_queue.front() {
133+
event.writable = true;
134+
event.key = key;
135+
}
130136
event
131137
}
132138

@@ -199,7 +205,7 @@ impl Driver {
199205
let need_add = !self.registry.contains_key(&arg.fd);
200206
let queue = self.registry.entry(arg.fd).or_default();
201207
queue.push_back_interest(user_data, arg.interest);
202-
let event = queue.event(user_data);
208+
let event = queue.event();
203209
if need_add {
204210
self.poll.add(arg.fd, event)?;
205211
} else {
@@ -331,14 +337,16 @@ impl Driver {
331337
let user_data = event.key;
332338
trace!("receive {} for {:?}", user_data, event);
333339
let mut op = Key::<dyn crate::sys::OpCode>::new_unchecked(user_data);
334-
let mut op = op.as_op_pin();
335-
match op.as_mut().op_type() {
340+
let op = op.as_op_pin();
341+
match op.op_type() {
336342
None => {
337343
// On epoll, multiple event may be received even if it is registered as
338344
// one-shot. It is safe to ignore it.
339345
trace!("op {} is completed", user_data);
340346
}
341347
Some(OpType::Fd(fd)) => {
348+
// If it's an FD op, the returned user_data is only for calling `op_type`. We
349+
// need to pop the real user_data from the queue.
342350
let queue = self
343351
.registry
344352
.get_mut(&fd)
@@ -347,6 +355,8 @@ impl Driver {
347355
if self.cancelled.remove(&user_data) {
348356
entry_cancelled(user_data).notify();
349357
} else {
358+
let mut op = Key::<dyn crate::sys::OpCode>::new_unchecked(user_data);
359+
let op = op.as_op_pin();
350360
let res = match op.operate() {
351361
Poll::Pending => {
352362
// The operation should go back to the front.
@@ -360,7 +370,7 @@ impl Driver {
360370
}
361371
}
362372
}
363-
let renew_event = queue.event(user_data);
373+
let renew_event = queue.event();
364374
let borrowed_fd = BorrowedFd::borrow_raw(fd);
365375
if !renew_event.readable && !renew_event.writable {
366376
self.poll.delete(borrowed_fd)?;

0 commit comments

Comments
 (0)