diff options
| author | Alex Burka <durka42+github@gmail.com> | 2016-06-04 15:19:22 -0400 |
|---|---|---|
| committer | Alex Burka <aburka@seas.upenn.edu> | 2016-06-22 20:29:37 -0400 |
| commit | fc28ee256a851b4274a2f8c8f776197f81bc7f07 (patch) | |
| tree | 69a6d9912105a69ca5e646885631e07c050235db /src/libstd | |
| parent | fe96928d7de991e527a7ed7b88bb30aa965c8a08 (diff) | |
| download | rust-fc28ee256a851b4274a2f8c8f776197f81bc7f07.tar.gz rust-fc28ee256a851b4274a2f8c8f776197f81bc7f07.zip | |
upgrade thread_local! invocation syntax
Allows declaring multiple statics in one macro invocation, and supports attaching attributes to the generated items.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/thread/local.rs | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index 6b54ec8afca..152b9771086 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -100,18 +100,52 @@ pub struct LocalKey<T: 'static> { /// Declare a new thread local storage key of type `std::thread::LocalKey`. /// +/// # Syntax +/// +/// The macro wraps any number of static declarations and makes them thread local. +/// Each static may be public or private, and attributes are allowed. Example: +/// +/// ``` +/// use std::cell::RefCell; +/// thread_local! { +/// pub static FOO: RefCell<u32> = RefCell::new(1); +/// +/// #[allow(unused)] +/// static BAR: RefCell<f32> = RefCell::new(1.0); +/// } +/// # fn main() {} +/// ``` +/// /// See [LocalKey documentation](thread/struct.LocalKey.html) for more /// information. #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] #[allow_internal_unstable] macro_rules! thread_local { - (static $name:ident: $t:ty = $init:expr) => ( - static $name: $crate::thread::LocalKey<$t> = + // rule 0: empty (base case for the recursion) + () => {}; + + // rule 1: process multiple declarations where the first one is private + ($(#[$attr:meta])* static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => ( + thread_local!($(#[$attr])* static $name: $t = $init); // go to rule 2 + thread_local!($($rest)*); + ); + + // rule 2: handle a single private declaration + ($(#[$attr:meta])* static $name:ident: $t:ty = $init:expr) => ( + $(#[$attr])* static $name: $crate::thread::LocalKey<$t> = __thread_local_inner!($t, $init); ); - (pub static $name:ident: $t:ty = $init:expr) => ( - pub static $name: $crate::thread::LocalKey<$t> = + + // rule 3: handle multiple declarations where the first one is public + ($(#[$attr:meta])* pub static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => ( + thread_local!($(#[$attr])* pub static $name: $t = $init); // go to rule 4 + thread_local!($($rest)*); + ); + + // rule 4: handle a single public declaration + ($(#[$attr:meta])* pub static $name:ident: $t:ty = $init:expr) => ( + $(#[$attr])* pub static $name: $crate::thread::LocalKey<$t> = __thread_local_inner!($t, $init); ); } |
