commit-slab: support shared commit-slab
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 19 May 2018 05:28:18 +0000 (07:28 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 May 2018 05:07:19 +0000 (14:07 +0900)
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 <gitster@pobox.com>
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
index fb5220fb7d487122bc158639dd57859b426cddbe..adc7b46c83b15f50ae2a85ce7e109fae4178f5fa 100644 (file)
@@ -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 */
index 234d9ee5f08c1585272c841fabd42658f0880a93..87a9cadfcca3f58045e2d7b2c3a143c8c4501f8d 100644 (file)
@@ -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
index 32aa2c0e46e9149ee1556dcfe9bc3046aec6dfde..69bf0c807c64b79216118f3485cfd5dac3b6a273 100644 (file)
@@ -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 */