From b6a2d7e82249bba271599732e16ffba176ae7de8 Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Fri, 31 Mar 2017 23:06:34 -0400 Subject: support pub(restricted) in thread_local! --- src/libstd/thread/local.rs | 75 ++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 32 deletions(-) (limited to 'src/libstd/thread') diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index dad21473eae..49ceaff8d3e 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -115,7 +115,7 @@ impl fmt::Debug for 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: +/// Publicity and attributes for each static are allowed. Example: /// /// ``` /// use std::cell::RefCell; @@ -136,31 +136,40 @@ impl fmt::Debug for LocalKey { #[stable(feature = "rust1", since = "1.0.0")] #[allow_internal_unstable] macro_rules! thread_local { - // rule 0: empty (base case for the recursion) + // empty (base case for the recursion) () => {}; - // rule 1: process multiple declarations where the first one is private + // 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_inner!($(#[$attr])* [] $name, $t, $init); thread_local!($($rest)*); ); - // rule 2: handle a single private declaration + // 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); + __thread_local_inner!($(#[$attr])* [] $name, $t, $init); ); - // rule 3: handle multiple declarations where the first one is public + // 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_inner!($(#[$attr])* [pub] $name, $t, $init); thread_local!($($rest)*); ); - // rule 4: handle a single public declaration + // 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); + __thread_local_inner!($(#[$attr])* [pub] $name, $t, $init); + ); + + // handle multiple declarations where the first one is restricted public + ($(#[$attr:meta])* pub $vis:tt static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => ( + __thread_local_inner!($(#[$attr])* [pub $vis] $name, $t, $init); + thread_local!($($rest)*); + ); + + // handle a single restricted public declaration + ($(#[$attr:meta])* pub $vis:tt static $name:ident: $t:ty = $init:expr) => ( + __thread_local_inner!($(#[$attr])* [pub $vis] $name, $t, $init); ); } @@ -171,27 +180,29 @@ macro_rules! thread_local { #[macro_export] #[allow_internal_unstable] macro_rules! __thread_local_inner { - ($t:ty, $init:expr) => {{ - fn __init() -> $t { $init } - - fn __getit() -> $crate::option::Option< - &'static $crate::cell::UnsafeCell< - $crate::option::Option<$t>>> - { - #[thread_local] - #[cfg(target_thread_local)] - static __KEY: $crate::thread::__FastLocalKeyInner<$t> = - $crate::thread::__FastLocalKeyInner::new(); - - #[cfg(not(target_thread_local))] - static __KEY: $crate::thread::__OsLocalKeyInner<$t> = - $crate::thread::__OsLocalKeyInner::new(); - - __KEY.get() - } + ($(#[$attr:meta])* [$($vis:tt)*] $name:ident, $t:ty, $init:expr) => { + $(#[$attr])* $($vis)* static $name: $crate::thread::LocalKey<$t> = { + fn __init() -> $t { $init } + + fn __getit() -> $crate::option::Option< + &'static $crate::cell::UnsafeCell< + $crate::option::Option<$t>>> + { + #[thread_local] + #[cfg(target_thread_local)] + static __KEY: $crate::thread::__FastLocalKeyInner<$t> = + $crate::thread::__FastLocalKeyInner::new(); + + #[cfg(not(target_thread_local))] + static __KEY: $crate::thread::__OsLocalKeyInner<$t> = + $crate::thread::__OsLocalKeyInner::new(); + + __KEY.get() + } - $crate::thread::LocalKey::new(__getit, __init) - }} + $crate::thread::LocalKey::new(__getit, __init) + }; + } } /// Indicator of the state of a thread local storage key. -- cgit 1.4.1-3-g733a5 From 8cce5bc7aba5b2f4f57df4e108e998b96fa01c8d Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Wed, 19 Apr 2017 02:29:40 +0000 Subject: use :vis in thread_local! --- src/libstd/lib.rs | 1 + src/libstd/thread/local.rs | 38 ++++++++------------------------------ 2 files changed, 9 insertions(+), 30 deletions(-) (limited to 'src/libstd/thread') diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 2fc107c663b..dda069324b0 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -277,6 +277,7 @@ #![feature(link_args)] #![feature(linkage)] #![feature(macro_reexport)] +#![feature(macro_vis_matcher)] #![feature(needs_panic_runtime)] #![feature(needs_drop)] #![feature(never_type)] diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index 49ceaff8d3e..c3aa3ff79c6 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -139,37 +139,15 @@ macro_rules! thread_local { // empty (base case for the recursion) () => {}; - // process multiple declarations where the first one is private - ($(#[$attr:meta])* static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => ( - __thread_local_inner!($(#[$attr])* [] $name, $t, $init); + // process multiple declarations + ($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => ( + __thread_local_inner!($(#[$attr])* $vis $name, $t, $init); thread_local!($($rest)*); ); - // handle a single private declaration - ($(#[$attr:meta])* static $name:ident: $t:ty = $init:expr) => ( - __thread_local_inner!($(#[$attr])* [] $name, $t, $init); - ); - - // handle multiple declarations where the first one is public - ($(#[$attr:meta])* pub static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => ( - __thread_local_inner!($(#[$attr])* [pub] $name, $t, $init); - thread_local!($($rest)*); - ); - - // handle a single public declaration - ($(#[$attr:meta])* pub static $name:ident: $t:ty = $init:expr) => ( - __thread_local_inner!($(#[$attr])* [pub] $name, $t, $init); - ); - - // handle multiple declarations where the first one is restricted public - ($(#[$attr:meta])* pub $vis:tt static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => ( - __thread_local_inner!($(#[$attr])* [pub $vis] $name, $t, $init); - thread_local!($($rest)*); - ); - - // handle a single restricted public declaration - ($(#[$attr:meta])* pub $vis:tt static $name:ident: $t:ty = $init:expr) => ( - __thread_local_inner!($(#[$attr])* [pub $vis] $name, $t, $init); + // handle a single declaration + ($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr) => ( + __thread_local_inner!($(#[$attr])* $vis $name, $t, $init); ); } @@ -180,8 +158,8 @@ macro_rules! thread_local { #[macro_export] #[allow_internal_unstable] macro_rules! __thread_local_inner { - ($(#[$attr:meta])* [$($vis:tt)*] $name:ident, $t:ty, $init:expr) => { - $(#[$attr])* $($vis)* static $name: $crate::thread::LocalKey<$t> = { + ($(#[$attr:meta])* $vis:vis $name:ident, $t:ty, $init:expr) => { + $(#[$attr])* $vis static $name: $crate::thread::LocalKey<$t> = { fn __init() -> $t { $init } fn __getit() -> $crate::option::Option< -- cgit 1.4.1-3-g733a5 From 8e7c4888b717a24dfc68f47c5dde00334fed2317 Mon Sep 17 00:00:00 2001 From: Alex Burka Date: Fri, 21 Apr 2017 04:30:08 +0000 Subject: stage0 fallback --- src/libstd/thread/local.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'src/libstd/thread') diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index c3aa3ff79c6..8b2064c9d61 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -110,6 +110,7 @@ impl fmt::Debug for LocalKey { } } +#[cfg(not(stage0))] /// Declare a new thread local storage key of type [`std::thread::LocalKey`]. /// /// # Syntax @@ -151,6 +152,7 @@ macro_rules! thread_local { ); } +#[cfg(not(stage0))] #[doc(hidden)] #[unstable(feature = "thread_local_internals", reason = "should not be necessary", @@ -183,6 +185,71 @@ macro_rules! __thread_local_inner { } } +#[cfg(stage0)] +/// Declare a new thread local storage key of type `std::thread::LocalKey`. +#[macro_export] +#[stable(feature = "rust1", since = "1.0.0")] +#[allow_internal_unstable] +macro_rules! thread_local { + // 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); + ); + + // 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); + ); +} + +#[cfg(stage0)] +#[doc(hidden)] +#[unstable(feature = "thread_local_internals", + reason = "should not be necessary", + issue = "0")] +#[macro_export] +#[allow_internal_unstable] +macro_rules! __thread_local_inner { + ($t:ty, $init:expr) => {{ + fn __init() -> $t { $init } + + fn __getit() -> $crate::option::Option< + &'static $crate::cell::UnsafeCell< + $crate::option::Option<$t>>> + { + #[thread_local] + #[cfg(target_thread_local)] + static __KEY: $crate::thread::__FastLocalKeyInner<$t> = + $crate::thread::__FastLocalKeyInner::new(); + + #[cfg(not(target_thread_local))] + static __KEY: $crate::thread::__OsLocalKeyInner<$t> = + $crate::thread::__OsLocalKeyInner::new(); + + __KEY.get() + } + + $crate::thread::LocalKey::new(__getit, __init) + }} +} + /// Indicator of the state of a thread local storage key. #[unstable(feature = "thread_local_state", reason = "state querying was recently added", -- cgit 1.4.1-3-g733a5