Skip to content

Commit c93d2e6

Browse files
committed
rtc: optimize dispatch for code size
1 parent 696624e commit c93d2e6

File tree

3 files changed

+68
-30
lines changed

3 files changed

+68
-30
lines changed

remoc/src/rtc/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,10 @@
220220
//! ```
221221
//!
222222
223-
use futures::{Future, FutureExt};
224223
use std::{
225224
error::Error,
226225
fmt,
226+
future::Future,
227227
pin::Pin,
228228
sync::Arc,
229229
task::{Context, Poll},
@@ -641,6 +641,8 @@ pub use tokio::sync::mpsc as local_mpsc;
641641
#[doc(hidden)]
642642
pub type ReplyErrorSender = tokio::sync::mpsc::Sender<SendingErrorKind>;
643643
#[doc(hidden)]
644+
pub use futures::future::FutureExt;
645+
#[doc(hidden)]
644646
pub use futures::stream::Stream;
645647
#[doc(hidden)]
646648
pub use futures::stream::StreamExt;

remoc_macro/src/method.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ impl TraitMethod {
352352
// Generate match clause.
353353
quote! {
354354
Self :: #enum_ident { #args __reply_tx } => {
355-
#call
355+
async move { #call }.boxed()
356356
},
357357
}
358358
}

remoc_macro/src/trait_def.rs

Lines changed: 64 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl TraitDef {
219219
/// Second return itm is server implementation generics, including where-clauses on Target and Codec.
220220
fn generics(
221221
&self, with_target: bool, with_codec: bool, with_codec_default: bool, with_lifetime: bool,
222-
with_send_sync_static: bool,
222+
with_send: bool, with_sync: bool, with_static: bool,
223223
) -> (Generics, Generics) {
224224
let ident = &self.ident;
225225

@@ -265,10 +265,18 @@ impl TraitDef {
265265
impl_generics.make_where_clause().predicates.extend(wc.predicates);
266266
}
267267

268-
if with_send_sync_static {
269-
let wc: WhereClause =
270-
syn::parse2(quote! { where Target: ::std::marker::Send + ::std::marker::Sync + 'static })
271-
.unwrap();
268+
if with_send {
269+
let wc: WhereClause = syn::parse2(quote! { where Target: ::std::marker::Send }).unwrap();
270+
impl_generics.make_where_clause().predicates.extend(wc.predicates);
271+
}
272+
273+
if with_sync {
274+
let wc: WhereClause = syn::parse2(quote! { where Target: ::std::marker::Sync }).unwrap();
275+
impl_generics.make_where_clause().predicates.extend(wc.predicates);
276+
}
277+
278+
if with_static {
279+
let wc: WhereClause = syn::parse2(quote! { where Target: 'static }).unwrap();
272280
impl_generics.make_where_clause().predicates.extend(wc.predicates);
273281
}
274282

@@ -289,9 +297,9 @@ impl TraitDef {
289297
pub fn request_enums(&self) -> TokenStream {
290298
let Self { vis, ident, .. } = self;
291299

292-
let (trait_generics, _) = self.generics(false, false, false, false, false);
293-
let (ty_generics, impl_generics) = self.generics(false, true, false, false, false);
294-
let (ty_generics_default_codec, _) = self.generics(false, true, true, false, false);
300+
let (trait_generics, _) = self.generics(false, false, false, false, false, false, false);
301+
let (ty_generics, impl_generics) = self.generics(false, true, false, false, false, false, false);
302+
let (ty_generics_default_codec, _) = self.generics(false, true, true, false, false, false, false);
295303
let ty_generics_where = &ty_generics.where_clause;
296304
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
297305
let (req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
@@ -342,10 +350,16 @@ impl TraitDef {
342350
}
343351

344352
impl #impl_generics_impl #req_value #impl_generics_ty #impl_generics_where {
345-
async fn dispatch<Target>(self, __target: Target, __err_tx: ::remoc::rtc::ReplyErrorSender) where Target: #ident #trait_generics {
353+
fn dispatch<Target>(self, __target: Target, __err_tx: ::remoc::rtc::ReplyErrorSender) ->
354+
::std::pin::Pin<::std::boxed::Box<dyn ::std::future::Future<Output = ()> + ::std::marker::Send>>
355+
where
356+
Target: #ident #trait_generics,
357+
Target: ::std::marker::Send + 'static,
358+
{
359+
use ::remoc::rtc::FutureExt;
346360
match self {
347361
#value_clauses
348-
Self::__Phantom(_) => ()
362+
Self::__Phantom(_) => async move {}.boxed()
349363
}
350364
}
351365
}
@@ -361,10 +375,16 @@ impl TraitDef {
361375
}
362376

363377
impl #impl_generics_impl #req_ref #impl_generics_ty #impl_generics_where {
364-
async fn dispatch<Target>(self, __target: &Target, __err_tx: ::remoc::rtc::ReplyErrorSender) where Target: #ident #trait_generics {
378+
fn dispatch<'target, Target>(self, __target: &'target Target, __err_tx: ::remoc::rtc::ReplyErrorSender) ->
379+
::std::pin::Pin<::std::boxed::Box<dyn ::std::future::Future<Output = ()> + ::std::marker::Send + 'target>>
380+
where
381+
Target: #ident #trait_generics,
382+
Target: ::std::marker::Sync,
383+
{
384+
use ::remoc::rtc::FutureExt;
365385
match self {
366386
#ref_clauses
367-
Self::__Phantom(_) => ()
387+
Self::__Phantom(_) => async move {}.boxed()
368388
}
369389
}
370390
}
@@ -380,10 +400,16 @@ impl TraitDef {
380400
}
381401

382402
impl #impl_generics_impl #req_ref_mut #impl_generics_ty #impl_generics_where {
383-
async fn dispatch<Target>(self, __target: &mut Target, __err_tx: ::remoc::rtc::ReplyErrorSender) where Target: #ident #trait_generics {
403+
fn dispatch<'target, Target>(self, __target: &'target mut Target, __err_tx: ::remoc::rtc::ReplyErrorSender) ->
404+
::std::pin::Pin<::std::boxed::Box<dyn ::std::future::Future<Output = ()> + ::std::marker::Send + 'target>>
405+
where
406+
Target: #ident #trait_generics,
407+
Target: ::std::marker::Send,
408+
{
409+
use ::remoc::rtc::FutureExt;
384410
match self {
385411
#ref_mut_clauses
386-
Self::__Phantom(_) => ()
412+
Self::__Phantom(_) => async move {}.boxed()
387413
}
388414
}
389415
}
@@ -464,8 +490,13 @@ impl TraitDef {
464490
fn server_value(&self) -> TokenStream {
465491
let Self { vis, ident, .. } = self;
466492

467-
let (req_generics, _) = self.generics(false, true, false, false, false);
468-
let (ty_generics, impl_generics) = self.generics(true, true, true, false, false);
493+
let need_send = self.is_taking_value() || self.is_taking_ref_mut();
494+
let need_sync = self.is_taking_ref();
495+
let need_static = self.is_taking_value();
496+
497+
let (req_generics, _) = self.generics(false, true, false, false, false, false, false);
498+
let (ty_generics, impl_generics) =
499+
self.generics(true, true, true, false, need_send, need_sync, need_static);
469500
let ty_generics_where = &ty_generics.where_clause;
470501
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
471502
let (_req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
@@ -575,8 +606,10 @@ impl TraitDef {
575606
fn server_ref(&self) -> TokenStream {
576607
let Self { vis, ident, .. } = self;
577608

578-
let (req_generics, _) = self.generics(false, true, false, false, false);
579-
let (ty_generics, impl_generics) = self.generics(true, true, true, true, false);
609+
let need_sync = self.is_taking_ref();
610+
611+
let (req_generics, _) = self.generics(false, true, false, false, false, false, false);
612+
let (ty_generics, impl_generics) = self.generics(true, true, true, true, false, need_sync, false);
580613
let ty_generics_where = &ty_generics.where_clause;
581614
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
582615
let (_req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
@@ -662,8 +695,11 @@ impl TraitDef {
662695
fn server_ref_mut(&self) -> TokenStream {
663696
let Self { vis, ident, .. } = self;
664697

665-
let (req_generics, _) = self.generics(false, true, false, false, false);
666-
let (ty_generics, impl_generics) = self.generics(true, true, true, true, false);
698+
let need_send = self.is_taking_value() || self.is_taking_ref_mut();
699+
let need_sync = self.is_taking_ref();
700+
701+
let (req_generics, _) = self.generics(false, true, false, false, false, false, false);
702+
let (ty_generics, impl_generics) = self.generics(true, true, true, true, need_send, need_sync, false);
667703
let ty_generics_where = &ty_generics.where_clause;
668704
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
669705
let (_req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
@@ -758,8 +794,8 @@ impl TraitDef {
758794
fn server_shared(&self) -> TokenStream {
759795
let Self { vis, ident, .. } = self;
760796

761-
let (req_generics, _) = self.generics(false, true, false, false, false);
762-
let (ty_generics, impl_generics) = self.generics(true, true, true, false, true);
797+
let (req_generics, _) = self.generics(false, true, false, false, false, false, false);
798+
let (ty_generics, impl_generics) = self.generics(true, true, true, false, true, true, true);
763799
let ty_generics_where = &ty_generics.where_clause;
764800
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
765801
let (_req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
@@ -854,8 +890,8 @@ impl TraitDef {
854890
fn server_shared_mut(&self) -> TokenStream {
855891
let Self { vis, ident, .. } = self;
856892

857-
let (req_generics, _) = self.generics(false, true, false, false, false);
858-
let (ty_generics, impl_generics) = self.generics(true, true, true, false, true);
893+
let (req_generics, _) = self.generics(false, true, false, false, false, false, false);
894+
let (ty_generics, impl_generics) = self.generics(true, true, true, false, true, true, true);
859895
let ty_generics_where = &ty_generics.where_clause;
860896
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
861897
let (_req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
@@ -961,8 +997,8 @@ impl TraitDef {
961997
fn req_receiver(&self) -> TokenStream {
962998
let Self { vis, ident, .. } = self;
963999

964-
let (req_generics, _) = self.generics(false, true, false, false, false);
965-
let (ty_generics, impl_generics) = self.generics(false, true, true, false, false);
1000+
let (req_generics, _) = self.generics(false, true, false, false, false, false, false);
1001+
let (ty_generics, impl_generics) = self.generics(false, true, true, false, false, false, false);
9661002
let ty_generics_where = &ty_generics.where_clause;
9671003
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
9681004
let (req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
@@ -1098,12 +1134,12 @@ impl TraitDef {
10981134
let client_ident = self.client_ident();
10991135
let client_ident_str = client_ident.to_string();
11001136

1101-
let (ty_generics, impl_generics) = self.generics(false, true, true, false, false);
1137+
let (ty_generics, impl_generics) = self.generics(false, true, true, false, false, false, false);
11021138
let ty_generics_where_ty = &ty_generics.where_clause;
11031139
let (ty_generics_impl, ty_generics_ty, ty_generics_where) = ty_generics.split_for_impl();
11041140
let (impl_generics_impl, impl_generics_ty, impl_generics_where) = impl_generics.split_for_impl();
11051141

1106-
let (req_generics, _) = self.generics(false, true, false, false, false);
1142+
let (req_generics, _) = self.generics(false, true, false, false, false, false, false);
11071143
let (_req_all, req_value, req_ref, req_ref_mut) = self.request_enum_idents();
11081144

11091145
let impl_generics_where_pred = &impl_generics_where.unwrap().predicates;

0 commit comments

Comments
 (0)