| #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 */ |