Nguyễn Thái Ngọc Duy | a9f1f1f | 2018-05-19 07:28:17 +0200 | [diff] [blame] | 1 | #ifndef COMMIT_SLAB_HDR_H |
| 2 | #define COMMIT_SLAB_HDR_H |
| 3 | |
| 4 | /* allocate ~512kB at once, allowing for malloc overhead */ |
| 5 | #ifndef COMMIT_SLAB_SIZE |
| 6 | #define COMMIT_SLAB_SIZE (512*1024-32) |
| 7 | #endif |
| 8 | |
| 9 | #define declare_commit_slab(slabname, elemtype) \ |
| 10 | \ |
| 11 | struct slabname { \ |
| 12 | unsigned slab_size; \ |
| 13 | unsigned stride; \ |
| 14 | unsigned slab_count; \ |
| 15 | elemtype **slab; \ |
| 16 | } |
| 17 | |
| 18 | /* |
| 19 | * Statically initialize a commit slab named "var". Note that this |
| 20 | * evaluates "stride" multiple times! Example: |
| 21 | * |
| 22 | * struct indegree indegrees = COMMIT_SLAB_INIT(1, indegrees); |
| 23 | * |
| 24 | */ |
| 25 | #define COMMIT_SLAB_INIT(stride, var) { \ |
| 26 | COMMIT_SLAB_SIZE / sizeof(**((var).slab)) / (stride), \ |
| 27 | (stride), 0, NULL \ |
| 28 | } |
| 29 | |
Nguyễn Thái Ngọc Duy | 878f0bb | 2018-05-19 07:28:18 +0200 | [diff] [blame] | 30 | #define declare_commit_slab_prototypes(slabname, elemtype) \ |
| 31 | \ |
| 32 | void init_ ##slabname## _with_stride(struct slabname *s, unsigned stride); \ |
| 33 | void init_ ##slabname(struct slabname *s); \ |
| 34 | void clear_ ##slabname(struct slabname *s); \ |
| 35 | elemtype *slabname## _at_peek(struct slabname *s, const struct commit *c, int add_if_missing); \ |
| 36 | elemtype *slabname## _at(struct slabname *s, const struct commit *c); \ |
| 37 | elemtype *slabname## _peek(struct slabname *s, const struct commit *c) |
| 38 | |
| 39 | #define define_shared_commit_slab(slabname, elemtype) \ |
| 40 | declare_commit_slab(slabname, elemtype); \ |
| 41 | declare_commit_slab_prototypes(slabname, elemtype) |
| 42 | |
Nguyễn Thái Ngọc Duy | a9f1f1f | 2018-05-19 07:28:17 +0200 | [diff] [blame] | 43 | #endif /* COMMIT_SLAB_HDR_H */ |