Merge branch 'jk/diff-filespec-cleanup'
[gitweb.git] / commit-slab.h
index d4c8286470c1adef499ca30e9f57c7fe4b2be2da..cc114b53b096c6fc8574629b86659a639fdfed61 100644 (file)
  *
  *   Initializes the indegree slab that associates an array of integers
  *   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.
+ *
+ * - 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 */
@@ -31,6 +40,8 @@
 #define COMMIT_SLAB_SIZE (512*1024-32)
 #endif
 
+#define MAYBE_UNUSED __attribute__((__unused__))
+
 #define define_commit_slab(slabname, elemtype)                                 \
                                                                        \
 struct slabname {                                                      \
@@ -41,8 +52,8 @@ struct slabname {                                                     \
 };                                                                     \
 static int stat_ ##slabname## realloc;                                 \
                                                                        \
-static void init_ ##slabname## _with_stride(struct slabname *s,                \
-                                           unsigned stride)            \
+static MAYBE_UNUSED void init_ ##slabname## _with_stride(struct slabname *s, \
+                                                  unsigned stride)     \
 {                                                                      \
        unsigned int elem_size;                                         \
        if (!stride)                                                    \
@@ -54,12 +65,12 @@ static void init_ ##slabname## _with_stride(struct slabname *s,             \
        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);                          \
 }                                                                      \
                                                                        \
-static void clear_ ##slabname(struct slabname *s)                      \
+static MAYBE_UNUSED void clear_ ##slabname(struct slabname *s)         \
 {                                                                      \
        int i;                                                          \
        for (i = 0; i < s->slab_count; i++)                             \
@@ -69,8 +80,8 @@ static void clear_ ##slabname(struct slabname *s)                     \
        s->slab = NULL;                                                 \
 }                                                                      \
                                                                        \
-static elemtype *slabname## _at(struct slabname *s,                    \
-                               const struct commit *c)                 \
+static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s,       \
+                                      const struct commit *c)          \
 {                                                                      \
        int nth_slab, nth_slot;                                         \
                                                                        \
@@ -80,7 +91,7 @@ static elemtype *slabname## _at(struct slabname *s,                   \
        if (s->slab_count <= nth_slab) {                                \
                int i;                                                  \
                s->slab = xrealloc(s->slab,                             \
-                                  (nth_slab + 1) * sizeof(s->slab));   \
+                                  (nth_slab + 1) * sizeof(*s->slab));  \
                stat_ ##slabname## realloc++;                           \
                for (i = s->slab_count; i <= nth_slab; i++)             \
                        s->slab[i] = NULL;                              \
@@ -94,4 +105,16 @@ static elemtype *slabname## _at(struct slabname *s,                 \
                                                                        \
 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 */