aboutsummaryrefslogtreecommitdiff
path: root/src/entry.rs
diff options
context:
space:
mode:
authorHaibo Huang <hhb@google.com>2021-02-09 18:21:05 -0800
committerHaibo Huang <hhb@google.com>2021-02-09 18:21:05 -0800
commit5f95ff39dfe80f673031098f1eaa08d527992b94 (patch)
tree10715046d8291e1854d85f6a8b232b3d52ec8064 /src/entry.rs
parentb71afff3c8d62b79e450882e0cf273af95f2feb6 (diff)
downloadtokio-macros-5f95ff39dfe80f673031098f1eaa08d527992b94.tar.gz
Upgrade rust/crates/tokio-macros to 1.1.0
Test: make Change-Id: I63fd8507244e6a7621358c51e9310a519f2267e8
Diffstat (limited to 'src/entry.rs')
-rw-r--r--src/entry.rs81
1 files changed, 63 insertions, 18 deletions
diff --git a/src/entry.rs b/src/entry.rs
index 8f80499..f82a329 100644
--- a/src/entry.rs
+++ b/src/entry.rs
@@ -25,6 +25,7 @@ impl RuntimeFlavor {
struct FinalConfig {
flavor: RuntimeFlavor,
worker_threads: Option<usize>,
+ start_paused: Option<bool>,
}
struct Configuration {
@@ -32,6 +33,7 @@ struct Configuration {
default_flavor: RuntimeFlavor,
flavor: Option<RuntimeFlavor>,
worker_threads: Option<(usize, Span)>,
+ start_paused: Option<(bool, Span)>,
}
impl Configuration {
@@ -44,6 +46,7 @@ impl Configuration {
},
flavor: None,
worker_threads: None,
+ start_paused: None,
}
}
@@ -79,31 +82,57 @@ impl Configuration {
Ok(())
}
+ fn set_start_paused(&mut self, start_paused: syn::Lit, span: Span) -> Result<(), syn::Error> {
+ if self.start_paused.is_some() {
+ return Err(syn::Error::new(span, "`start_paused` set multiple times."));
+ }
+
+ let start_paused = parse_bool(start_paused, span, "start_paused")?;
+ self.start_paused = Some((start_paused, span));
+ Ok(())
+ }
+
fn build(&self) -> Result<FinalConfig, syn::Error> {
let flavor = self.flavor.unwrap_or(self.default_flavor);
use RuntimeFlavor::*;
- match (flavor, self.worker_threads) {
- (CurrentThread, Some((_, worker_threads_span))) => Err(syn::Error::new(
- worker_threads_span,
- "The `worker_threads` option requires the `multi_thread` runtime flavor.",
- )),
- (CurrentThread, None) => Ok(FinalConfig {
- flavor,
- worker_threads: None,
- }),
- (Threaded, worker_threads) if self.rt_multi_thread_available => Ok(FinalConfig {
- flavor,
- worker_threads: worker_threads.map(|(val, _span)| val),
- }),
+
+ let worker_threads = match (flavor, self.worker_threads) {
+ (CurrentThread, Some((_, worker_threads_span))) => {
+ return Err(syn::Error::new(
+ worker_threads_span,
+ "The `worker_threads` option requires the `multi_thread` runtime flavor.",
+ ))
+ }
+ (CurrentThread, None) => None,
+ (Threaded, worker_threads) if self.rt_multi_thread_available => {
+ worker_threads.map(|(val, _span)| val)
+ }
(Threaded, _) => {
let msg = if self.flavor.is_none() {
"The default runtime flavor is `multi_thread`, but the `rt-multi-thread` feature is disabled."
} else {
"The runtime flavor `multi_thread` requires the `rt-multi-thread` feature."
};
- Err(syn::Error::new(Span::call_site(), msg))
+ return Err(syn::Error::new(Span::call_site(), msg));
}
- }
+ };
+
+ let start_paused = match (flavor, self.start_paused) {
+ (Threaded, Some((_, start_paused_span))) => {
+ return Err(syn::Error::new(
+ start_paused_span,
+ "The `start_paused` option requires the `current_thread` runtime flavor.",
+ ));
+ }
+ (CurrentThread, Some((start_paused, _))) => Some(start_paused),
+ (_, None) => None,
+ };
+
+ Ok(FinalConfig {
+ flavor,
+ worker_threads,
+ start_paused,
+ })
}
}
@@ -134,6 +163,16 @@ fn parse_string(int: syn::Lit, span: Span, field: &str) -> Result<String, syn::E
}
}
+fn parse_bool(bool: syn::Lit, span: Span, field: &str) -> Result<bool, syn::Error> {
+ match bool {
+ syn::Lit::Bool(b) => Ok(b.value),
+ _ => Err(syn::Error::new(
+ span,
+ format!("Failed to parse {} as bool.", field),
+ )),
+ }
+}
+
fn parse_knobs(
mut input: syn::ItemFn,
args: syn::AttributeArgs,
@@ -174,6 +213,9 @@ fn parse_knobs(
"flavor" => {
config.set_flavor(namevalue.lit.clone(), namevalue.span())?;
}
+ "start_paused" => {
+ config.set_start_paused(namevalue.lit.clone(), namevalue.span())?;
+ }
"core_threads" => {
let msg = "Attribute `core_threads` is renamed to `worker_threads`";
return Err(syn::Error::new_spanned(namevalue, msg));
@@ -204,11 +246,11 @@ fn parse_knobs(
macro_name
)
}
- "flavor" | "worker_threads" => {
+ "flavor" | "worker_threads" | "start_paused" => {
format!("The `{}` attribute requires an argument.", name)
}
name => {
- format!("Unknown attribute {} is specified; expected one of: `flavor`, `worker_threads`", name)
+ format!("Unknown attribute {} is specified; expected one of: `flavor`, `worker_threads`, `start_paused`", name)
}
};
return Err(syn::Error::new_spanned(path, msg));
@@ -235,6 +277,9 @@ fn parse_knobs(
if let Some(v) = config.worker_threads {
rt = quote! { #rt.worker_threads(#v) };
}
+ if let Some(v) = config.start_paused {
+ rt = quote! { #rt.start_paused(#v) };
+ }
let header = {
if is_test {
@@ -254,7 +299,7 @@ fn parse_knobs(
.enable_all()
.build()
.unwrap()
- .block_on(async { #body })
+ .block_on(async #body)
}
};