Skip to content

Commit 7e37e77

Browse files
authored
fix(s2n-quic-dc): use wake_forced for worker::Waker (#2415)
1 parent 90f3956 commit 7e37e77

File tree

10 files changed

+418
-148
lines changed

10 files changed

+418
-148
lines changed

dc/s2n-quic-dc-benches/src/streams.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ fn pair(
3737
accept_flavor: accept::Flavor,
3838
) -> (stream::testing::Client, stream::testing::Server) {
3939
let client = stream::testing::Client::default();
40-
let server = stream::testing::Server::new(protocol, accept_flavor);
40+
let server = stream::testing::Server::builder()
41+
.protocol(protocol)
42+
.accept_flavor(accept_flavor)
43+
.build();
4144
client.handshake_with(&server).unwrap();
4245
(client, server)
4346
}

dc/s2n-quic-dc/src/stream.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ pub mod socket;
2828

2929
#[cfg(any(test, feature = "testing"))]
3030
pub mod testing;
31+
#[cfg(test)]
32+
mod tests;
3133

3234
bitflags::bitflags! {
3335
#[derive(Clone, Copy, Debug, PartialEq, Eq)]

dc/s2n-quic-dc/src/stream/send/tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use tracing::Instrument as _;
99

1010
fn pair(protocol: Protocol) -> (testing::Client, testing::Server) {
1111
let client = testing::Client::default();
12-
let server = testing::Server::new(protocol, Default::default());
12+
let server = testing::Server::builder().protocol(protocol).build();
1313
(client, server)
1414
}
1515

dc/s2n-quic-dc/src/stream/server/tokio/tcp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ where
7979
let mut context = worker::Context::new(&self);
8080

8181
poll_fn(move |cx| {
82-
workers.update_task_context(cx);
82+
workers.poll_start(cx);
8383

8484
let now = self.env.clock().get_time();
8585
let publisher = publisher(&self.subscriber, &now);

dc/s2n-quic-dc/src/stream/server/tokio/tcp/manager.rs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ where
3131
{
3232
inner: Inner<W>,
3333
waker_set: waker::Set,
34-
root_waker: Option<Waker>,
3534
}
3635

3736
/// Split the tasks from the waker set to avoid ownership issues
@@ -120,11 +119,7 @@ where
120119
sojourn_time: RttEstimator::new(Duration::from_secs(30)),
121120
};
122121

123-
Self {
124-
inner,
125-
waker_set,
126-
root_waker: None,
127-
}
122+
Self { inner, waker_set }
128123
}
129124

130125
#[inline]
@@ -149,19 +144,8 @@ where
149144

150145
/// Must be called before polling any workers
151146
#[inline]
152-
pub fn update_task_context(&mut self, cx: &mut task::Context) {
153-
let new_waker = cx.waker();
154-
155-
let root_task_requires_update = if let Some(waker) = self.root_waker.as_ref() {
156-
!waker.will_wake(new_waker)
157-
} else {
158-
true
159-
};
160-
161-
if root_task_requires_update {
162-
self.waker_set.update_root(new_waker);
163-
self.root_waker = Some(new_waker.clone());
164-
}
147+
pub fn poll_start(&mut self, cx: &mut task::Context) {
148+
self.waker_set.poll_start(cx);
165149
}
166150

167151
#[inline]
@@ -221,8 +205,15 @@ where
221205
Pub: EndpointPublisher,
222206
C: Clock,
223207
{
208+
let ready = self.waker_set.drain();
209+
210+
// no need to actually poll any workers if none are active
211+
if self.inner.by_sojourn_time.is_empty() {
212+
return ControlFlow::Continue(());
213+
}
214+
224215
// poll any workers that are ready
225-
for idx in self.waker_set.drain() {
216+
for idx in ready {
226217
if self.inner.poll_worker(idx, cx, publisher, clock).is_break() {
227218
return ControlFlow::Break(());
228219
}

0 commit comments

Comments
 (0)