From 878f0bb81990170cde5dba934fcd1ae4c2e698ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= Date: Sat, 19 May 2018 07:28:18 +0200 Subject: [PATCH] commit-slab: support shared commit-slab define_shared_commit_slab() could be used in a header file to define a commit-slab. One of these C files must include commit-slab-impl.h and "call" implement_shared_commit_slab(). Signed-off-by: Junio C Hamano --- commit-slab-decl.h | 13 +++++++++++++ commit-slab-impl.h | 22 ++++++++++++++-------- commit-slab.h | 2 +- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/commit-slab-decl.h b/commit-slab-decl.h index fb5220fb7d..adc7b46c83 100644 --- a/commit-slab-decl.h +++ b/commit-slab-decl.h @@ -27,4 +27,17 @@ struct slabname { \ (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); \ +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_HDR_H */ diff --git a/commit-slab-impl.h b/commit-slab-impl.h index 234d9ee5f0..87a9cadfcc 100644 --- a/commit-slab-impl.h +++ b/commit-slab-impl.h @@ -3,11 +3,17 @@ #define MAYBE_UNUSED __attribute__((__unused__)) -#define implement_commit_slab(slabname, elemtype) \ +#define implement_static_commit_slab(slabname, elemtype) \ + implement_commit_slab(slabname, elemtype, static MAYBE_UNUSED) + +#define implement_shared_commit_slab(slabname, elemtype) \ + implement_commit_slab(slabname, elemtype, ) + +#define implement_commit_slab(slabname, elemtype, scope) \ \ static int stat_ ##slabname## realloc; \ \ -static MAYBE_UNUSED void init_ ##slabname## _with_stride(struct slabname *s, \ +scope void init_ ##slabname## _with_stride(struct slabname *s, \ unsigned stride) \ { \ unsigned int elem_size; \ @@ -20,12 +26,12 @@ static MAYBE_UNUSED void init_ ##slabname## _with_stride(struct slabname *s, \ s->slab = NULL; \ } \ \ -static MAYBE_UNUSED void init_ ##slabname(struct slabname *s) \ +scope void init_ ##slabname(struct slabname *s) \ { \ init_ ##slabname## _with_stride(s, 1); \ } \ \ -static MAYBE_UNUSED void clear_ ##slabname(struct slabname *s) \ +scope void clear_ ##slabname(struct slabname *s) \ { \ unsigned int i; \ for (i = 0; i < s->slab_count; i++) \ @@ -34,7 +40,7 @@ static MAYBE_UNUSED void clear_ ##slabname(struct slabname *s) \ FREE_AND_NULL(s->slab); \ } \ \ -static MAYBE_UNUSED elemtype *slabname## _at_peek(struct slabname *s, \ +scope elemtype *slabname## _at_peek(struct slabname *s, \ const struct commit *c, \ int add_if_missing) \ { \ @@ -62,13 +68,13 @@ static MAYBE_UNUSED elemtype *slabname## _at_peek(struct slabname *s, \ return &s->slab[nth_slab][nth_slot * s->stride]; \ } \ \ -static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s, \ +scope elemtype *slabname## _at(struct slabname *s, \ const struct commit *c) \ { \ return slabname##_at_peek(s, c, 1); \ } \ \ -static MAYBE_UNUSED elemtype *slabname## _peek(struct slabname *s, \ +scope elemtype *slabname## _peek(struct slabname *s, \ const struct commit *c) \ { \ return slabname##_at_peek(s, c, 0); \ @@ -81,7 +87,7 @@ struct slabname * to allow a terminating semicolon, which makes instantiations look * like function declarations. I.e., the expansion of * - * implement_commit_slab(indegree, int); + * implement_commit_slab(indegree, int, static); * * ends in 'struct indegree;'. This would otherwise * be a syntax error according (at least) to ISO C. It's hard to diff --git a/commit-slab.h b/commit-slab.h index 32aa2c0e46..69bf0c807c 100644 --- a/commit-slab.h +++ b/commit-slab.h @@ -46,6 +46,6 @@ #define define_commit_slab(slabname, elemtype) \ declare_commit_slab(slabname, elemtype); \ - implement_commit_slab(slabname, elemtype) + implement_static_commit_slab(slabname, elemtype) #endif /* COMMIT_SLAB_H */