From f81506cbc8d8d6701f06f3fd367e6d76127ba859 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Sun, 3 Jan 2021 19:41:27 +0800 Subject: [PATCH] optimize ServiceRequest methods --- src/request.rs | 3 +++ src/service.rs | 15 +++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/request.rs b/src/request.rs index 432134cd7..cc7f15812 100644 --- a/src/request.rs +++ b/src/request.rs @@ -17,6 +17,9 @@ use crate::rmap::ResourceMap; #[derive(Clone)] /// An HTTP Request pub struct HttpRequest(pub(crate) Rc); +// *. Rc is used exclusively and NO Weak +// is allowed anywhere in the code. Weak pointer is purposely ignored when +// doing Rc's ref counter check. pub(crate) struct HttpRequestInner { pub(crate) head: Message, diff --git a/src/service.rs b/src/service.rs index 189ba5554..efb165de2 100644 --- a/src/service.rs +++ b/src/service.rs @@ -73,11 +73,12 @@ impl ServiceRequest { mut req: HttpRequest, pl: Payload, ) -> Result { - if Rc::strong_count(&req.0) == 1 && Rc::weak_count(&req.0) == 0 { - Rc::get_mut(&mut req.0).unwrap().payload = pl; - Ok(ServiceRequest(req)) - } else { - Err((req, pl)) + match Rc::get_mut(&mut req.0) { + Some(p) => { + p.payload = pl; + Ok(ServiceRequest(req)) + } + None => Err((req, pl)), } } @@ -87,7 +88,9 @@ impl ServiceRequest { /// can be re-constructed only if rc's strong pointers count eq 1 and /// weak pointers count is 0. pub fn from_request(req: HttpRequest) -> Result { - if Rc::strong_count(&req.0) == 1 && Rc::weak_count(&req.0) == 0 { + // There is no weak pointer used on HttpRequest so intentionally + // ignore the check. + if Rc::strong_count(&req.0) == 1 { Ok(ServiceRequest(req)) } else { Err(req)