@@ -11,11 +11,12 @@ use aptos_crypto::HashValue;
1111use aptos_drop_helper:: ArcAsyncDrop ;
1212use aptos_infallible:: Mutex ;
1313use aptos_metrics_core:: IntGaugeVecHelper ;
14- use std:: { marker:: PhantomData , sync:: Arc } ;
14+ use std:: { marker:: PhantomData , sync:: { Arc , Weak } } ;
1515
1616#[ derive( Debug ) ]
1717struct LayerInner < K : ArcAsyncDrop , V : ArcAsyncDrop > {
1818 peak : FlattenPerfectTree < K , V > ,
19+ parent : Weak < LayerInner < K , V > > ,
1920 children : Mutex < Vec < Arc < LayerInner < K , V > > > > ,
2021 use_case : & ' static str ,
2122 family : HashValue ,
@@ -50,6 +51,7 @@ impl<K: ArcAsyncDrop, V: ArcAsyncDrop> LayerInner<K, V> {
5051 let family = HashValue :: random ( ) ;
5152 Arc :: new ( Self {
5253 peak : FlattenPerfectTree :: new_with_empty_nodes ( 1 ) ,
54+ parent : Weak :: new ( ) ,
5355 children : Mutex :: new ( Vec :: new ( ) ) ,
5456 use_case,
5557 family,
@@ -61,6 +63,7 @@ impl<K: ArcAsyncDrop, V: ArcAsyncDrop> LayerInner<K, V> {
6163 fn spawn ( self : & Arc < Self > , child_peak : FlattenPerfectTree < K , V > , base_layer : u64 ) -> Arc < Self > {
6264 let child = Arc :: new ( Self {
6365 peak : child_peak,
66+ parent : Arc :: downgrade ( self ) ,
6467 children : Mutex :: new ( Vec :: new ( ) ) ,
6568 use_case : self . use_case ,
6669 family : self . family ,
@@ -108,6 +111,11 @@ impl<K: ArcAsyncDrop, V: ArcAsyncDrop> MapLayer<K, V> {
108111 }
109112 }
110113
114+ pub ( crate ) fn parent ( & self ) -> Option < Self > {
115+ let parent_inner = self . inner . parent . upgrade ( ) ;
116+ parent_inner. map ( Self :: new)
117+ }
118+
111119 pub fn into_layers_view_after ( self , base_layer : MapLayer < K , V > ) -> LayeredMap < K , V > {
112120 assert ! ( base_layer. is_family( & self ) ) ;
113121 assert ! ( base_layer. inner. layer >= self . inner. base_layer) ;
0 commit comments