| #ifndef COMMIT_SLAB_DECL_H | |
| #define COMMIT_SLAB_DECL_H | |
| /* allocate ~512kB at once, allowing for malloc overhead */ | |
| #ifndef COMMIT_SLAB_SIZE | |
| #define COMMIT_SLAB_SIZE (512*1024-32) | |
| #endif | |
| #define declare_commit_slab(slabname, elemtype) \ | |
| \ | |
| struct slabname { \ | |
| unsigned slab_size; \ | |
| unsigned stride; \ | |
| unsigned slab_count; \ | |
| elemtype **slab; \ | |
| } | |
| /* | |
| * Statically initialize a commit slab named "var". Note that this | |
| * evaluates "stride" multiple times! Example: | |
| * | |
| * struct indegree indegrees = COMMIT_SLAB_INIT(1, indegrees); | |
| * | |
| */ | |
| #define COMMIT_SLAB_INIT(stride, var) { \ | |
| COMMIT_SLAB_SIZE / sizeof(**((var).slab)) / (stride), \ | |
| (stride), 0, NULL \ | |
| } | |
| #define declare_commit_slab_prototypes(slabname, elemtype) \ | |
| \ | |
| void init_ ##slabname## _with_stride(struct slabname *s, unsigned stride); \ | |
| void init_ ##slabname(struct slabname *s); \ | |
| void clear_ ##slabname(struct slabname *s); \ | |
| void deep_clear_ ##slabname(struct slabname *s, void (*free_fn)(elemtype *ptr)); \ | |
| elemtype *slabname## _at_peek(struct slabname *s, const struct commit *c, int add_if_missing); \ | |
| elemtype *slabname## _at(struct slabname *s, const struct commit *c); \ | |
| elemtype *slabname## _peek(struct slabname *s, const struct commit *c) | |
| #define define_shared_commit_slab(slabname, elemtype) \ | |
| declare_commit_slab(slabname, elemtype); \ | |
| declare_commit_slab_prototypes(slabname, elemtype) | |
| #endif /* COMMIT_SLAB_DECL_H */ |