1717#define FLEXTREE_POFF_MASK (0xffffffffffff) // 48 bits
1818#define FLEXTREE_PATH_DEPTH 7 // at most 7 levels
1919
20- struct flextree_free_list {
21- struct flextree * tree ;
22- u64 cap ;
23- u64 count ;
24- struct {
25- u64 _ ;
26- u64 v [];
27- } * list ;
28- };
29-
3020struct flextree_path {
3121 u8 level ;
3222 u8 path [FLEXTREE_PATH_DEPTH ];
@@ -38,51 +28,55 @@ static_assert(FLEXTREE_INTERNAL_CAP < 254, "u8 for path");
3828
3929// free_list {{{
4030
41- static struct flextree_free_list * flextree_free_list_create (struct flextree * const tree )
31+ struct flextree_free_list {
32+ u64 cap ;
33+ u64 count ;
34+ u64 * list ;
35+ };
36+
37+ static struct flextree_free_list * flextree_free_list_create ()
4238{
43- struct flextree_free_list * const ffl = generic_malloc (sizeof (* ffl ));
44- ffl -> tree = tree ;
45- ffl -> cap = 1024 ;
46- ffl -> count = 0 ;
47- ffl -> list = generic_malloc (sizeof (* (ffl -> list )) + sizeof (u64 ) * ffl -> cap );
48- return ffl ;
39+ struct flextree_free_list * const fl = generic_malloc (sizeof (* fl ));
40+ fl -> cap = 4096 ;
41+ fl -> count = 0 ;
42+ fl -> list = generic_malloc (sizeof (fl -> list [0 ]) * fl -> cap );
43+ return fl ;
4944}
5045
51- static void flextree_free_list_extend (struct flextree_free_list * const ffl )
46+ static void flextree_free_list_extend (struct flextree_free_list * const fl )
5247{
53- ffl -> list = generic_realloc (
54- ffl -> list , sizeof (* ffl -> list ) + sizeof (u64 ) * ffl -> cap * 2 );
55- ffl -> cap *= 2 ;
48+ fl -> list = generic_realloc (fl -> list , sizeof (fl -> list [0 ]) * fl -> cap * 2 );
49+ fl -> cap *= 2 ;
5650}
5751
58- static void flextree_free_list_put (struct flextree_free_list * const ffl , const u64 idx )
52+ static void flextree_free_list_put (struct flextree_free_list * const fl , const u64 val )
5953{
60- if (ffl -> cap == ffl -> count ) {
61- flextree_free_list_extend (ffl );
54+ if (fl -> cap == fl -> count ) {
55+ flextree_free_list_extend (fl );
6256 }
63- ffl -> list -> v [ ffl -> count ++ ] = idx ;
57+ fl -> list [ fl -> count ++ ] = val ;
6458}
6559
66- static inline u8 flextree_free_list_ne (const struct flextree_free_list * const ffl )
60+ static inline u8 flextree_free_list_ne (const struct flextree_free_list * const fl )
6761{
68- return (ffl -> count > 0 ) ? 1 : 0 ;
62+ return (fl -> count > 0 ) ? 1 : 0 ;
6963}
7064
71- static inline u64 flextree_free_list_get (struct flextree_free_list * const ffl )
65+ static inline u64 flextree_free_list_get (struct flextree_free_list * const fl )
7266{
73- return ffl -> list -> v [-- ffl -> count ];
67+ return fl -> list [-- fl -> count ];
7468}
7569
76- static inline void flextree_free_list_destroy (struct flextree_free_list * const ffl )
70+ static inline void flextree_free_list_destroy (struct flextree_free_list * const fl )
7771{
78- generic_free (ffl -> list );
79- generic_free (ffl );
72+ generic_free (fl -> list );
73+ generic_free (fl );
8074}
8175
82- static void flextree_free_list_merge (struct flextree_free_list * const ffl1 , const struct flextree_free_list * const ffl2 )
76+ static void flextree_free_list_merge (struct flextree_free_list * const fl1 , const struct flextree_free_list * const fl2 )
8377{
84- for (u64 i = 0 ; i < ffl2 -> count ; i ++ ) {
85- flextree_free_list_put (ffl1 , ffl2 -> list -> v [i ]);
78+ for (u64 i = 0 ; i < fl2 -> count ; i ++ ) {
79+ flextree_free_list_put (fl1 , fl2 -> list [i ]);
8680 }
8781}
8882
@@ -254,6 +248,11 @@ static struct flextree_node *flextree_find_leaf_node(
254248
255249 path -> nodes [path -> level ] = node ;
256250 path -> path [path -> level ++ ] = (u8 )target ; // although it is u32
251+ if (path -> level > FLEXTREE_PATH_DEPTH ) {
252+ printf ("the tree is too high, panic.\n" );
253+ fflush (stdout );
254+ exit (1 );
255+ }
257256 node = ie -> children [target ].node ;
258257 if (node -> is_leaf ) {
259258 * ploff = loff ;
@@ -1047,7 +1046,7 @@ struct flextree *flextree_open(const char* const path, const u32 max_extent_size
10471046
10481047 u8 new = 0 ;
10491048 tree -> node_slab = slab_create (sizeof (struct flextree_node ), 1lu << 21 );
1050- tree -> free_list = flextree_free_list_create (tree );
1049+ tree -> free_list = flextree_free_list_create ();
10511050
10521051 if (tree -> in_memory_mode ) {
10531052 new = 1 ;
@@ -1102,7 +1101,7 @@ void flextree_sync(struct flextree *const tree)
11021101 return ;
11031102 }
11041103 tree -> version += 1 ; // increase the version here
1105- struct flextree_free_list * const tffl = flextree_free_list_create (tree );
1104+ struct flextree_free_list * const tffl = flextree_free_list_create ();
11061105 struct flextree_path path ;
11071106 path .level = 0 ;
11081107 flextree_sync_cow_rec (tree -> root , & path , tffl );
0 commit comments