-
Notifications
You must be signed in to change notification settings - Fork 791
core: vendor lazy_static and spin for no_std support #424
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 2 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
ad97ad6
core: vendor lazy_static and spin for no_std support
thombles 91726e0
core: fmt vendored code
thombles c292d32
core: trim down vendored spin, reduce visibility and addresss warnings
thombles 92328c7
core: limit vendored lazy_static for use only with no_std, fix warnings
thombles 4a95b8b
core: update paths to now-vendored no_std libs
thombles 1af7b23
tracing: use spin::Once re-exported from tracing-core instead of crate
thombles fde192d
core: remove ineffectual doc(hidden)
thombles d94e0e1
core: refmt stdlib module
thombles a289dd5
core: bump to 0.1.8 to expose export of vendored spin::Once to tracing
thombles File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
|
||
Copyright (c) 2010 The Rust Project Developers | ||
|
||
Permission is hereby granted, free of charge, to any | ||
person obtaining a copy of this software and associated | ||
documentation files (the "Software"), to deal in the | ||
Software without restriction, including without | ||
limitation the rights to use, copy, modify, merge, | ||
publish, distribute, sublicense, and/or sell copies of | ||
the Software, and to permit persons to whom the Software | ||
is furnished to do so, subject to the following | ||
conditions: | ||
|
||
The above copyright notice and this permission notice | ||
shall be included in all copies or substantial portions | ||
of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF | ||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED | ||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | ||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | ||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR | ||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | ||
DEALINGS IN THE SOFTWARE. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// Copyright 2016 lazy-static.rs Developers | ||
// | ||
// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or | ||
// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or | ||
// http://opensource.org/licenses/MIT>, at your option. This file may not be | ||
// copied, modified, or distributed except according to those terms. | ||
|
||
use crate::spin::Once; | ||
|
||
pub struct Lazy<T: Sync>(Once<T>); | ||
|
||
impl<T: Sync> Lazy<T> { | ||
pub const INIT: Self = Lazy(Once::INIT); | ||
|
||
#[inline(always)] | ||
pub fn get<F>(&'static self, builder: F) -> &T | ||
where | ||
F: FnOnce() -> T, | ||
{ | ||
self.0.call_once(builder) | ||
} | ||
} | ||
|
||
#[macro_export] | ||
#[doc(hidden)] | ||
macro_rules! __lazy_static_create { | ||
($NAME:ident, $T:ty) => { | ||
static $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy::INIT; | ||
}; | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
// Copyright 2016 lazy-static.rs Developers | ||
// | ||
// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or | ||
// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or | ||
// http://opensource.org/licenses/MIT>, at your option. This file may not be | ||
// copied, modified, or distributed except according to those terms. | ||
|
||
use std::cell::Cell; | ||
use std::hint::unreachable_unchecked; | ||
use std::prelude::v1::*; | ||
use std::sync::Once; | ||
#[allow(deprecated)] | ||
pub use std::sync::ONCE_INIT; | ||
|
||
// FIXME: Replace Option<T> with MaybeUninit<T> (stable since 1.36.0) | ||
#[allow(missing_debug_implementations)] | ||
pub struct Lazy<T: Sync>(Cell<Option<T>>, Once); | ||
|
||
impl<T: Sync> Lazy<T> { | ||
#[allow(deprecated)] | ||
pub const INIT: Self = Lazy(Cell::new(None), ONCE_INIT); | ||
|
||
#[inline(always)] | ||
pub fn get<F>(&'static self, f: F) -> &T | ||
where | ||
F: FnOnce() -> T, | ||
{ | ||
self.1.call_once(|| { | ||
self.0.set(Some(f())); | ||
}); | ||
|
||
// `self.0` is guaranteed to be `Some` by this point | ||
// The `Once` will catch and propagate panics | ||
unsafe { | ||
match *self.0.as_ptr() { | ||
Some(ref x) => x, | ||
None => { | ||
debug_assert!( | ||
false, | ||
"attempted to derefence an uninitialized lazy static. This is a bug" | ||
); | ||
|
||
unreachable_unchecked() | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
unsafe impl<T: Sync> Sync for Lazy<T> {} | ||
|
||
#[macro_export] | ||
#[doc(hidden)] | ||
macro_rules! __lazy_static_create { | ||
($NAME:ident, $T:ty) => { | ||
static $NAME: $crate::lazy_static::lazy::Lazy<$T> = $crate::lazy_static::lazy::Lazy::INIT; | ||
}; | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// Copyright 2016 lazy-static.rs Developers | ||
// | ||
// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or | ||
// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or | ||
// http://opensource.org/licenses/MIT>, at your option. This file may not be | ||
// copied, modified, or distributed except according to those terms. | ||
|
||
/*! | ||
A macro for declaring lazily evaluated statics. | ||
Using this macro, it is possible to have `static`s that require code to be | ||
executed at runtime in order to be initialized. | ||
This includes anything requiring heap allocations, like vectors or hash maps, | ||
as well as anything that requires function calls to be computed. | ||
*/ | ||
|
||
#[cfg(feature = "std")] | ||
#[path = "inline_lazy.rs"] | ||
#[doc(hidden)] | ||
pub mod lazy; | ||
|
||
#[cfg(not(feature = "std"))] | ||
#[path = "core_lazy.rs"] | ||
#[doc(hidden)] | ||
pub mod lazy; | ||
|
||
#[doc(hidden)] | ||
pub use core::ops::Deref as __Deref; | ||
|
||
#[macro_export(local_inner_macros)] | ||
#[doc(hidden)] | ||
macro_rules! __lazy_static_internal { | ||
// optional visibility restrictions are wrapped in `()` to allow for | ||
// explicitly passing otherwise implicit information about private items | ||
($(#[$attr:meta])* ($($vis:tt)*) static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => { | ||
__lazy_static_internal!(@MAKE TY, $(#[$attr])*, ($($vis)*), $N); | ||
__lazy_static_internal!(@TAIL, $N : $T = $e); | ||
lazy_static!($($t)*); | ||
}; | ||
(@TAIL, $N:ident : $T:ty = $e:expr) => { | ||
impl $crate::lazy_static::__Deref for $N { | ||
type Target = $T; | ||
fn deref(&self) -> &$T { | ||
#[inline(always)] | ||
fn __static_ref_initialize() -> $T { $e } | ||
|
||
#[inline(always)] | ||
fn __stability() -> &'static $T { | ||
__lazy_static_create!(LAZY, $T); | ||
LAZY.get(__static_ref_initialize) | ||
} | ||
__stability() | ||
} | ||
} | ||
impl $crate::lazy_static::LazyStatic for $N { | ||
fn initialize(lazy: &Self) { | ||
let _ = &**lazy; | ||
} | ||
} | ||
}; | ||
// `vis` is wrapped in `()` to prevent parsing ambiguity | ||
(@MAKE TY, $(#[$attr:meta])*, ($($vis:tt)*), $N:ident) => { | ||
#[allow(missing_copy_implementations)] | ||
#[allow(non_camel_case_types)] | ||
#[allow(dead_code)] | ||
$(#[$attr])* | ||
$($vis)* struct $N {__private_field: ()} | ||
#[doc(hidden)] | ||
$($vis)* static $N: $N = $N {__private_field: ()}; | ||
}; | ||
() => () | ||
} | ||
|
||
#[macro_export(local_inner_macros)] | ||
/// lazy_static (suppress docs_missing warning) | ||
macro_rules! lazy_static { | ||
($(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => { | ||
// use `()` to explicitly forward the information about private items | ||
__lazy_static_internal!($(#[$attr])* () static ref $N : $T = $e; $($t)*); | ||
}; | ||
($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => { | ||
__lazy_static_internal!($(#[$attr])* (pub) static ref $N : $T = $e; $($t)*); | ||
}; | ||
($(#[$attr:meta])* pub ($($vis:tt)+) static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => { | ||
__lazy_static_internal!($(#[$attr])* (pub ($($vis)+)) static ref $N : $T = $e; $($t)*); | ||
}; | ||
() => () | ||
} | ||
|
||
/// Support trait for enabling a few common operation on lazy static values. | ||
/// | ||
/// This is implemented by each defined lazy static, and | ||
/// used by the free functions in this crate. | ||
pub trait LazyStatic { | ||
#[doc(hidden)] | ||
fn initialize(lazy: &Self); | ||
} | ||
|
||
/// Takes a shared reference to a lazy static and initializes | ||
/// it if it has not been already. | ||
/// | ||
/// This can be used to control the initialization point of a lazy static. | ||
pub fn initialize<T: LazyStatic>(lazy: &T) { | ||
LazyStatic::initialize(lazy); | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
The MIT License (MIT) | ||
|
||
Copyright (c) 2014 Mathijs van de Nes | ||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
|
||
The above copyright notice and this permission notice shall be included in all | ||
copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
//! Synchronization primitives based on spinning | ||
|
||
#[cfg(test)] | ||
#[macro_use] | ||
extern crate std; | ||
|
||
pub use mutex::*; | ||
pub use once::*; | ||
|
||
mod mutex; | ||
mod once; |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.