Skip to content

Commit

Permalink
client: give back args buffers after event parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
MaxVerevkin committed Mar 3, 2024
1 parent b836916 commit 28413b7
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 10 deletions.
6 changes: 3 additions & 3 deletions wayrs-client/src/connection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ impl<D> Connection<D> {
}

if event.header.object_id == ObjectId::DISPLAY {
return match WlDisplay::parse_event(event, 1).unwrap() {
return match WlDisplay::parse_event(event, 1, &mut self.msg_buffers_pool).unwrap() {
// Catch protocol error as early as possible
wl_display::Event::Error(err) => Err(io::Error::new(
io::ErrorKind::Other,
Expand All @@ -332,7 +332,7 @@ impl<D> Connection<D> {
}

if event.header.object_id == self.registry {
let event = WlRegistry::parse_event(event, 1).unwrap();
let event = WlRegistry::parse_event(event, 1, &mut self.msg_buffers_pool).unwrap();
return Ok(QueuedEvent::RegistryEvent(event));
}

Expand Down Expand Up @@ -563,7 +563,7 @@ impl<D> Connection<D> {
// Note: if `F` does not capture anything, this `Box::new` will not allocate.
Box::new(move |conn, state, object, event| {
let proxy: P = object.try_into().unwrap();
let event = P::parse_event(event, object.version).unwrap();
let event = P::parse_event(event, object.version, &mut conn.msg_buffers_pool).unwrap();
let ctx = EventCtx {
conn,
state,
Expand Down
8 changes: 6 additions & 2 deletions wayrs-client/src/proxy.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use crate::object::Object;

use wayrs_core::{Interface, Message, ObjectId};
use wayrs_core::{Interface, Message, MessageBuffersPool, ObjectId};

#[derive(Debug)]
pub struct BadMessage;
Expand All @@ -20,7 +20,11 @@ pub trait Proxy: TryFrom<Object, Error = WrongObject> + Copy {
fn new(id: ObjectId, version: u32) -> Self;

#[doc(hidden)]
fn parse_event(event: Message, version: u32) -> Result<Self::Event, BadMessage>;
fn parse_event(
event: Message,
version: u32,
pool: &mut MessageBuffersPool,
) -> Result<Self::Event, BadMessage>;

fn id(&self) -> ObjectId;

Expand Down
16 changes: 11 additions & 5 deletions wayrs-scanner/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,13 @@ fn gen_interface(iface: &Interface, wayrs_client_path: &TokenStream) -> TokenStr
};
quote! {
#opcode => {
if event.args.len() != #args_len {
if __event.args.len() != #args_len {
return Err(_wayrs_client::proxy::BadMessage);
}
let mut args = event.args.into_iter();
#( let Some(_wayrs_client::core::ArgValue::#arg_ty(#arg_names)) = args.next() else { return Err(_wayrs_client::proxy::BadMessage) }; )*
let mut __args = __event.args.drain(..);
#( let Some(_wayrs_client::core::ArgValue::#arg_ty(#arg_names)) = __args.next() else { return Err(_wayrs_client::proxy::BadMessage) }; )*
drop(__args);
__pool.reuse_args(__event.args);
Ok(#retval)
}
}
Expand Down Expand Up @@ -330,8 +332,12 @@ fn gen_interface(iface: &Interface, wayrs_client_path: &TokenStream) -> TokenStr
Self { id, version }
}

fn parse_event(event: _wayrs_client::core::Message, __self_version: u32) -> ::std::result::Result<Event, _wayrs_client::proxy::BadMessage> {
match event.header.opcode {
fn parse_event(
mut __event: _wayrs_client::core::Message,
__self_version: u32,
__pool: &mut _wayrs_client::core::MessageBuffersPool,
) -> ::std::result::Result<Event, _wayrs_client::proxy::BadMessage> {
match __event.header.opcode {
#( #event_decoding )*
_ => Err(_wayrs_client::proxy::BadMessage),
}
Expand Down

0 comments on commit 28413b7

Please sign in to comment.