Skip to content

Commit 25abb90

Browse files
committed
cleanup free list and macros
1 parent 1bf7618 commit 25abb90

File tree

3 files changed

+40
-42
lines changed

3 files changed

+40
-42
lines changed

flexfile.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
#include "generic.h"
1717

1818
// the address space flexfile manages
19-
#ifdef FLEXFILE_MAX_OFFSET_OVERRIDE
20-
#define FLEXFILE_MAX_OFFSET FLEXFILE_MAX_OFFSET_OVERRIDE
21-
#else
19+
#ifndef FLEXFILE_MAX_OFFSET
2220
#define FLEXFILE_MAX_OFFSET (800lu << 30) // 800 GB
2321
#endif
2422
static_assert(FLEXFILE_MAX_OFFSET >= (4lu << 30), "dont manage small space");

flextree.c

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,6 @@
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-
3020
struct 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);

test_flextree.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,8 @@ static void test9(const u64 count)
567567
fflush(stdout);
568568
flextree_close(ft);
569569
ft = flextree_open(PATH, FLEXTREE_MAX_EXTENT_SIZE_LIMIT);
570-
for (u32 i=0; i<100; i++) {
570+
for (u32 i=0; i<10000; i++) {
571+
printf("round %u\n", i);
571572
random_append(ft, NULL, count);
572573
flextree_close(ft);
573574
ft = flextree_open(PATH, FLEXTREE_MAX_EXTENT_SIZE_LIMIT);
@@ -585,7 +586,7 @@ int main(int argc, char ** argv) {
585586
char * cmd = argc > 1 ? argv[1] : "0123456789";
586587
for (u32 i = 0; i < 10; i++) {
587588
if (strchr(cmd, (char)((u8)'0'+i)) && tests[i])
588-
tests[i](500000);
589+
tests[i](50000);
589590
}
590591
return 0;
591592
}

0 commit comments

Comments
 (0)