提交 df5f0ad2 编写于 作者: J Junio C Hamano

Merge branch 'tr/commit-slab-cleanup'

* tr/commit-slab-cleanup:
  commit-slab: sizeof() the right type in xrealloc
  commit-slab: declare functions "static inline"
  commit-slab: document clear_$slabname()
...@@ -22,8 +22,17 @@ ...@@ -22,8 +22,17 @@
* *
* Initializes the indegree slab that associates an array of integers * Initializes the indegree slab that associates an array of integers
* to each commit. 'stride' specifies how big each array is. The slab * to each commit. 'stride' specifies how big each array is. The slab
* that id initialied by the variant without "_with_stride" associates * that is initialized by the variant without "_with_stride" associates
* each commit with an array of one integer. * each commit with an array of one integer.
*
* - void clear_indegree(struct indegree *);
*
* Empties the slab. The slab can be reused with the same stride
* without calling init_indegree() again or can be reconfigured to a
* different stride by calling init_indegree_with_stride().
*
* Call this function before the slab falls out of scope to avoid
* leaking memory.
*/ */
/* allocate ~512kB at once, allowing for malloc overhead */ /* allocate ~512kB at once, allowing for malloc overhead */
...@@ -31,6 +40,8 @@ ...@@ -31,6 +40,8 @@
#define COMMIT_SLAB_SIZE (512*1024-32) #define COMMIT_SLAB_SIZE (512*1024-32)
#endif #endif
#define MAYBE_UNUSED __attribute__((__unused__))
#define define_commit_slab(slabname, elemtype) \ #define define_commit_slab(slabname, elemtype) \
\ \
struct slabname { \ struct slabname { \
...@@ -41,8 +52,8 @@ struct slabname { \ ...@@ -41,8 +52,8 @@ struct slabname { \
}; \ }; \
static int stat_ ##slabname## realloc; \ static int stat_ ##slabname## realloc; \
\ \
static void init_ ##slabname## _with_stride(struct slabname *s, \ static MAYBE_UNUSED void init_ ##slabname## _with_stride(struct slabname *s, \
unsigned stride) \ unsigned stride) \
{ \ { \
unsigned int elem_size; \ unsigned int elem_size; \
if (!stride) \ if (!stride) \
...@@ -54,12 +65,12 @@ static void init_ ##slabname## _with_stride(struct slabname *s, \ ...@@ -54,12 +65,12 @@ static void init_ ##slabname## _with_stride(struct slabname *s, \
s->slab = NULL; \ s->slab = NULL; \
} \ } \
\ \
static void init_ ##slabname(struct slabname *s) \ static MAYBE_UNUSED void init_ ##slabname(struct slabname *s) \
{ \ { \
init_ ##slabname## _with_stride(s, 1); \ init_ ##slabname## _with_stride(s, 1); \
} \ } \
\ \
static void clear_ ##slabname(struct slabname *s) \ static MAYBE_UNUSED void clear_ ##slabname(struct slabname *s) \
{ \ { \
int i; \ int i; \
for (i = 0; i < s->slab_count; i++) \ for (i = 0; i < s->slab_count; i++) \
...@@ -69,8 +80,8 @@ static void clear_ ##slabname(struct slabname *s) \ ...@@ -69,8 +80,8 @@ static void clear_ ##slabname(struct slabname *s) \
s->slab = NULL; \ s->slab = NULL; \
} \ } \
\ \
static elemtype *slabname## _at(struct slabname *s, \ static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s, \
const struct commit *c) \ const struct commit *c) \
{ \ { \
int nth_slab, nth_slot; \ int nth_slab, nth_slot; \
\ \
...@@ -80,7 +91,7 @@ static elemtype *slabname## _at(struct slabname *s, \ ...@@ -80,7 +91,7 @@ static elemtype *slabname## _at(struct slabname *s, \
if (s->slab_count <= nth_slab) { \ if (s->slab_count <= nth_slab) { \
int i; \ int i; \
s->slab = xrealloc(s->slab, \ s->slab = xrealloc(s->slab, \
(nth_slab + 1) * sizeof(s->slab)); \ (nth_slab + 1) * sizeof(*s->slab)); \
stat_ ##slabname## realloc++; \ stat_ ##slabname## realloc++; \
for (i = s->slab_count; i <= nth_slab; i++) \ for (i = s->slab_count; i <= nth_slab; i++) \
s->slab[i] = NULL; \ s->slab[i] = NULL; \
...@@ -94,4 +105,16 @@ static elemtype *slabname## _at(struct slabname *s, \ ...@@ -94,4 +105,16 @@ static elemtype *slabname## _at(struct slabname *s, \
\ \
static int stat_ ##slabname## realloc static int stat_ ##slabname## realloc
/*
* Note that this seemingly redundant second declaration is required
* to allow a terminating semicolon, which makes instantiations look
* like function declarations. I.e., the expansion of
*
* define_commit_slab(indegree, int);
*
* ends in 'static int stat_indegreerealloc;'. This would otherwise
* be a syntax error according (at least) to ISO C. It's hard to
* catch because GCC silently parses it by default.
*/
#endif /* COMMIT_SLAB_H */ #endif /* COMMIT_SLAB_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册