From b6f03aa59129488d6dc790cae44b986724b1c996 Mon Sep 17 00:00:00 2001 From: shuaihu Date: Thu, 14 Jul 2022 05:07:25 +0000 Subject: [PATCH 1/8] lazyobj --- src/lazyobj.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 ++ 2 files changed, 78 insertions(+) create mode 100644 src/lazyobj.rs diff --git a/src/lazyobj.rs b/src/lazyobj.rs new file mode 100644 index 0000000..2480cf5 --- /dev/null +++ b/src/lazyobj.rs @@ -0,0 +1,75 @@ +use core::{ + marker::PhantomData, + mem::transmute, + ops::{Deref, DerefMut}, + sync::atomic::{ + AtomicUsize, + Ordering::{AcqRel, Acquire}, + }, +}; +pub trait ILazyObj +where + Self: Sized, +{ + fn init() -> usize; + fn cancle_init(x: usize) { + Self::destory(x); + } + fn destory(_: usize) {} +} +pub struct LazyObj { + v: AtomicUsize, + _mark: PhantomData, +} +impl LazyObj { + #[inline] + pub const fn new() -> Self { + Self { + v: AtomicUsize::new(EMPTY), + _mark: PhantomData, + } + } + #[inline] + unsafe fn get_pointer(&self) -> *mut T { + if self.v.load(Acquire) == EMPTY { + self.initialize(); + }; + if ISPTR { + transmute(*self.v.as_mut_ptr()) + } else { + transmute(self.v.as_mut_ptr()) + } + } + #[cold] + fn initialize(&self) { + let new = T::init(); + if self + .v + .compare_exchange(EMPTY, new, AcqRel, Acquire) + .is_err() + { + T::cancle_init(new); + } + } +} +impl Deref for LazyObj { + type Target = T; + #[inline] + fn deref(&self) -> &Self::Target { + unsafe { &*self.get_pointer() } + } +} +impl DerefMut for LazyObj { + #[inline] + fn deref_mut(&mut self) -> &mut Self::Target { + unsafe { &mut *self.get_pointer() } + } +} +impl Drop for LazyObj { + fn drop(&mut self) { + let v = self.v.load(Acquire); + if v != EMPTY { + T::destory(v) + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 352fd43..81bb117 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,6 @@ #![no_std] +#![feature(atomic_mut_ptr)] mod defer; pub use defer::Defer; +mod lazyobj; +pub use lazyobj::*; -- Gitee From 2c65238f1ad502bd4151941e8b43ca136e2aeb99 Mon Sep 17 00:00:00 2001 From: shuaihu Date: Thu, 14 Jul 2022 08:07:46 +0000 Subject: [PATCH 2/8] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=99=90=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lazyobj.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/lazyobj.rs b/src/lazyobj.rs index 2480cf5..a910f02 100644 --- a/src/lazyobj.rs +++ b/src/lazyobj.rs @@ -7,10 +7,7 @@ use core::{ Ordering::{AcqRel, Acquire}, }, }; -pub trait ILazyObj -where - Self: Sized, -{ +pub trait ILazyObj { fn init() -> usize; fn cancle_init(x: usize) { Self::destory(x); -- Gitee From d32bb98fed6436f8b913facb5b694847d2a44dc6 Mon Sep 17 00:00:00 2001 From: shuaihu Date: Fri, 15 Jul 2022 03:40:35 +0000 Subject: [PATCH 3/8] add empty line --- src/lazyobj.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/lazyobj.rs b/src/lazyobj.rs index a910f02..744d894 100644 --- a/src/lazyobj.rs +++ b/src/lazyobj.rs @@ -7,6 +7,7 @@ use core::{ Ordering::{AcqRel, Acquire}, }, }; + pub trait ILazyObj { fn init() -> usize; fn cancle_init(x: usize) { @@ -14,10 +15,12 @@ pub trait ILazyObj { } fn destory(_: usize) {} } -pub struct LazyObj { + +pub struct LazyObj { v: AtomicUsize, _mark: PhantomData, } + impl LazyObj { #[inline] pub const fn new() -> Self { @@ -49,6 +52,7 @@ impl LazyObj Deref for LazyObj { type Target = T; #[inline] @@ -56,12 +60,14 @@ impl Deref for LazyObj DerefMut for LazyObj { #[inline] fn deref_mut(&mut self) -> &mut Self::Target { unsafe { &mut *self.get_pointer() } } } + impl Drop for LazyObj { fn drop(&mut self) { let v = self.v.load(Acquire); -- Gitee From 5f97fc310cc3964b13608720a74dd9784d7e86b2 Mon Sep 17 00:00:00 2001 From: shuaihu Date: Fri, 15 Jul 2022 05:38:36 +0000 Subject: [PATCH 4/8] change to unsafe --- src/lazyobj.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lazyobj.rs b/src/lazyobj.rs index 744d894..bb58e6f 100644 --- a/src/lazyobj.rs +++ b/src/lazyobj.rs @@ -9,11 +9,11 @@ use core::{ }; pub trait ILazyObj { - fn init() -> usize; - fn cancle_init(x: usize) { + unsafe fn init() -> usize; + unsafe fn cancle_init(x: usize) { Self::destory(x); } - fn destory(_: usize) {} + unsafe fn destory(_: usize) {} } pub struct LazyObj { @@ -42,13 +42,13 @@ impl LazyObj Drop for LazyObj Date: Thu, 21 Jul 2022 09:24:27 +0000 Subject: [PATCH 5/8] remove lazyobj --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 81bb117..c2ada36 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,4 +3,4 @@ mod defer; pub use defer::Defer; mod lazyobj; -pub use lazyobj::*; +pub use lazyobj:: \ No newline at end of file -- Gitee From 6f8d2e99117bd15aadab4004cdb92f9af36f4ed2 Mon Sep 17 00:00:00 2001 From: shuaihu Date: Thu, 21 Jul 2022 09:24:58 +0000 Subject: [PATCH 6/8] remove Lazyobj --- src/lazyobj.rs | 78 -------------------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 src/lazyobj.rs diff --git a/src/lazyobj.rs b/src/lazyobj.rs deleted file mode 100644 index bb58e6f..0000000 --- a/src/lazyobj.rs +++ /dev/null @@ -1,78 +0,0 @@ -use core::{ - marker::PhantomData, - mem::transmute, - ops::{Deref, DerefMut}, - sync::atomic::{ - AtomicUsize, - Ordering::{AcqRel, Acquire}, - }, -}; - -pub trait ILazyObj { - unsafe fn init() -> usize; - unsafe fn cancle_init(x: usize) { - Self::destory(x); - } - unsafe fn destory(_: usize) {} -} - -pub struct LazyObj { - v: AtomicUsize, - _mark: PhantomData, -} - -impl LazyObj { - #[inline] - pub const fn new() -> Self { - Self { - v: AtomicUsize::new(EMPTY), - _mark: PhantomData, - } - } - #[inline] - unsafe fn get_pointer(&self) -> *mut T { - if self.v.load(Acquire) == EMPTY { - self.initialize(); - }; - if ISPTR { - transmute(*self.v.as_mut_ptr()) - } else { - transmute(self.v.as_mut_ptr()) - } - } - #[cold] - fn initialize(&self) { - let new = unsafe { T::init() }; - if self - .v - .compare_exchange(EMPTY, new, AcqRel, Acquire) - .is_err() - { - unsafe { T::cancle_init(new) }; - } - } -} - -impl Deref for LazyObj { - type Target = T; - #[inline] - fn deref(&self) -> &Self::Target { - unsafe { &*self.get_pointer() } - } -} - -impl DerefMut for LazyObj { - #[inline] - fn deref_mut(&mut self) -> &mut Self::Target { - unsafe { &mut *self.get_pointer() } - } -} - -impl Drop for LazyObj { - fn drop(&mut self) { - let v = self.v.load(Acquire); - if v != EMPTY { - unsafe { T::destory(v) } - } - } -} -- Gitee From 6eb240d63d4a65131d22475761fc22268bbeed38 Mon Sep 17 00:00:00 2001 From: shuaihu Date: Thu, 21 Jul 2022 09:27:46 +0000 Subject: [PATCH 7/8] remove LazyObject --- src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c2ada36..f9be447 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,5 +2,3 @@ #![feature(atomic_mut_ptr)] mod defer; pub use defer::Defer; -mod lazyobj; -pub use lazyobj:: \ No newline at end of file -- Gitee From 50c020901dbfd5fb3d0ccb9d24ed37b0b3f8ea6d Mon Sep 17 00:00:00 2001 From: shuaihu Date: Fri, 22 Jul 2022 08:32:34 +0000 Subject: [PATCH 8/8] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E7=89=B9=E5=BE=81=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index f9be447..352fd43 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,3 @@ #![no_std] -#![feature(atomic_mut_ptr)] mod defer; pub use defer::Defer; -- Gitee