Permalink
Cannot retrieve contributors at this time
44 lines (38 sloc)
1.42 KB
#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 */ |