From a9c1152c4bf72132806cb76045b3464d59db07da Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 14 Nov 2014 14:20:57 -0800 Subject: std: Add a new top-level thread_local module This commit removes the `std::local_data` module in favor of a new `std::thread_local` module providing thread local storage. The module provides two variants of TLS: one which owns its contents and one which is based on scoped references. Each implementation has pros and cons listed in the documentation. Both flavors have accessors through a function called `with` which yield a reference to a closure provided. Both flavors also panic if a reference cannot be yielded and provide a function to test whether an access would panic or not. This is an implementation of [RFC 461][rfc] and full details can be found in that RFC. This is a breaking change due to the removal of the `std::local_data` module. All users can migrate to the new thread local system like so: thread_local!(static FOO: Rc>> = Rc::new(RefCell::new(None))) The old `local_data` module inherently contained the `Rc>>` as an implementation detail which must now be explicitly stated by users. [rfc]: https://github.com/rust-lang/rfcs/pull/461 [breaking-change] --- src/libsyntax/parse/token.rs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'src/libsyntax/parse') diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 4272b57a4dc..3a3407aedba 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -560,15 +560,10 @@ pub type IdentInterner = StrInterner; // fresh one. // FIXME(eddyb) #8726 This should probably use a task-local reference. pub fn get_ident_interner() -> Rc { - local_data_key!(key: Rc<::parse::token::IdentInterner>) - match key.get() { - Some(interner) => interner.clone(), - None => { - let interner = Rc::new(mk_fresh_ident_interner()); - key.replace(Some(interner.clone())); - interner - } - } + thread_local!(static KEY: Rc<::parse::token::IdentInterner> = { + Rc::new(mk_fresh_ident_interner()) + }) + KEY.with(|k| k.clone()) } /// Represents a string stored in the task-local interner. Because the -- cgit 1.4.1-3-g733a5