Skip to content

Commit d29b7a6

Browse files
authored
Avoid boxed event reallocations (#3333)
1 parent 304311a commit d29b7a6

File tree

4 files changed

+18
-19
lines changed

4 files changed

+18
-19
lines changed

src/gateway/client/dispatch.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ macro_rules! update_cache {
4444
/// This MUST be called from a different task to the recv_event loop, to allow for
4545
/// intra-shard concurrency between the shard loop and event handler.
4646
pub(crate) async fn dispatch_model(
47-
event: Event,
47+
event: Box<Event>,
4848
context: Context,
4949
#[cfg(feature = "framework")] framework: Option<Arc<dyn Framework>>,
5050
event_handler: Option<Arc<dyn EventHandler>>,
@@ -110,10 +110,10 @@ async fn dispatch_event_handler(
110110
#[cfg_attr(not(feature = "cache"), allow(unused_mut))]
111111
fn update_cache_with_event(
112112
#[cfg(feature = "cache")] cache: &Cache,
113-
event: Event,
113+
event: Box<Event>,
114114
) -> (FullEvent, Option<FullEvent>) {
115115
let mut extra_event = None;
116-
let event = match event {
116+
let event = match *event {
117117
Event::CommandPermissionsUpdate(event) => FullEvent::CommandPermissionsUpdate {
118118
permission: event.permission,
119119
},

src/gateway/sharding/mod.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,11 @@ impl Shard {
306306
}
307307

308308
#[cfg_attr(feature = "tracing_instrument", instrument(skip(self)))]
309-
fn handle_gateway_dispatch(&mut self, seq: u64, event: DeserializedEvent) -> Option<Event> {
309+
fn handle_gateway_dispatch(
310+
&mut self,
311+
seq: u64,
312+
event: DeserializedEvent,
313+
) -> Option<Box<Event>> {
310314
if seq > self.seq + 1 {
311315
warn!("[{:?}] Sequence off; them: {}, us: {}", self.shard_info, seq, self.seq);
312316
}
@@ -325,7 +329,7 @@ impl Shard {
325329
},
326330
};
327331

328-
match &event {
332+
match &*event {
329333
Event::Ready(ready) => {
330334
debug!("[{:?}] Received Ready", self.shard_info);
331335

@@ -447,9 +451,7 @@ impl Shard {
447451
Ok(GatewayEvent::Dispatch {
448452
seq,
449453
event,
450-
}) => Ok(self
451-
.handle_gateway_dispatch(seq, *event)
452-
.map(|e| ShardAction::Dispatch(Box::new(e)))),
454+
}) => Ok(self.handle_gateway_dispatch(seq, event).map(ShardAction::Dispatch)),
453455
Ok(GatewayEvent::Heartbeat) => {
454456
info!("[{:?}] Received shard heartbeat", self.shard_info);
455457

src/gateway/sharding/shard_runner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ impl ShardRunner {
217217
spawn_named(
218218
"shard_runner::dispatch",
219219
dispatch_model(
220-
*event,
220+
event,
221221
context,
222222
#[cfg(feature = "framework")]
223223
self.framework.clone(),

src/model/event.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ pub struct MessagePollVoteRemoveEvent {
934934
pub enum GatewayEvent {
935935
Dispatch {
936936
seq: u64,
937-
event: Box<DeserializedEvent>,
937+
event: DeserializedEvent,
938938
},
939939
Heartbeat,
940940
Reconnect,
@@ -944,13 +944,12 @@ pub enum GatewayEvent {
944944
HeartbeatAck,
945945
}
946946

947-
#[expect(clippy::large_enum_variant)]
948947
#[cfg_attr(feature = "typesize", derive(typesize::derive::TypeSize))]
949948
#[derive(Clone, Debug, Serialize)]
950949
#[non_exhaustive]
951950
#[serde(untagged)]
952951
pub enum DeserializedEvent {
953-
Success(Event),
952+
Success(Box<Event>),
954953
Unknown(UnknownEvent),
955954
}
956955

@@ -996,13 +995,11 @@ impl<'de> Deserialize<'de> for GatewayEvent {
996995

997996
Self::Dispatch {
998997
seq: raw.seq.ok_or_else(|| DeError::missing_field("s"))?,
999-
event: {
1000-
Box::new(match Event::deserialize(raw_data) {
1001-
Ok(event) => DeserializedEvent::Success(event),
1002-
Err(_) => DeserializedEvent::Unknown(
1003-
UnknownEvent::deserialize(raw_data).map_err(DeError::custom)?,
1004-
),
1005-
})
998+
event: match Box::<Event>::deserialize(raw_data) {
999+
Ok(event) => DeserializedEvent::Success(event),
1000+
Err(_) => DeserializedEvent::Unknown(
1001+
UnknownEvent::deserialize(raw_data).map_err(DeError::custom)?,
1002+
),
10061003
},
10071004
}
10081005
},

0 commit comments

Comments
 (0)