fix(tonic): make Interceptor UnwindSafe (#641)

This commit is contained in:
David Pedersen
2021-05-12 18:20:33 +02:00
committed by GitHub
parent b0ec3ead34
commit 57509d321b
+33 -4
View File
@@ -1,8 +1,15 @@
use crate::{Request, Status}; use crate::{Request, Status};
use std::panic::{RefUnwindSafe, UnwindSafe};
use std::{fmt, sync::Arc}; use std::{fmt, sync::Arc};
type InterceptorFn = type InterceptorFn = Arc<
Arc<dyn Fn(Request<()>) -> Result<Request<()>, Status> + Send + Sync + 'static>; dyn Fn(Request<()>) -> Result<Request<()>, Status>
+ Send
+ Sync
+ UnwindSafe
+ RefUnwindSafe
+ 'static,
>;
/// Represents a gRPC interceptor. /// Represents a gRPC interceptor.
/// ///
@@ -25,7 +32,12 @@ pub struct Interceptor {
impl Interceptor { impl Interceptor {
/// Create a new `Interceptor` from the provided function. /// Create a new `Interceptor` from the provided function.
pub fn new( pub fn new(
f: impl Fn(Request<()>) -> Result<Request<()>, Status> + Send + Sync + 'static, f: impl Fn(Request<()>) -> Result<Request<()>, Status>
+ Send
+ Sync
+ UnwindSafe
+ RefUnwindSafe
+ 'static,
) -> Self { ) -> Self {
Interceptor { f: Arc::new(f) } Interceptor { f: Arc::new(f) }
} }
@@ -43,7 +55,12 @@ impl Interceptor {
impl<F> From<F> for Interceptor impl<F> From<F> for Interceptor
where where
F: Fn(Request<()>) -> Result<Request<()>, Status> + Send + Sync + 'static, F: Fn(Request<()>) -> Result<Request<()>, Status>
+ Send
+ Sync
+ UnwindSafe
+ RefUnwindSafe
+ 'static,
{ {
fn from(f: F) -> Self { fn from(f: F) -> Self {
Interceptor::new(f) Interceptor::new(f)
@@ -55,3 +72,15 @@ impl fmt::Debug for Interceptor {
f.debug_struct("Interceptor").finish() f.debug_struct("Interceptor").finish()
} }
} }
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use super::*;
#[test]
fn interceptor_fn_is_unwind_safe() {
fn is_unwind_safe<T: UnwindSafe + RefUnwindSafe>() {}
is_unwind_safe::<InterceptorFn>();
}
}