Re: [PATCH 15/17] commit-slab: provide a static initializer
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 12, 2014, 18:15 UTC
- Message-ID
- <xmqq7g4m6lka.fsf@gitster.dls.corp.google.com>
- In-Reply-To
- <20140610214251.GO19147@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 11 quoted lines
> Callers currently must use init_foo_slab() at runtime before > accessing a slab. For global slabs, it's much nicer if we > can initialize them in BSS, so that each user does not have > to add code to check-and-initialize. > > Signed-off-by: Jeff King <peff@peff.net> > --- > There was no comment on this one in v1. I'd be curious if anyone has > comments on what I wrote in: > > http://article.gmane.org/gmane.comp.version-control.git/251099
Why do we need an initialiser at this point (in other words, how have other existing slab users coped without having one)?
I think they call init_*_slab() when the slab is needed/used the first time (e.g. it is not even worth initialising indegree slab unless we are sorting in topo order).
Unlike the author-date and indegree slabs, there are too many entry points that may want access to the buffer slab (save_commit_buffer's default being on does not help us either), so it would be much less error prone to always initialise a static slab like this patch does, I guess.
Show 24 quoted lines
> commit-slab.h | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/commit-slab.h b/commit-slab.h
> index cc114b5..375c9c7 100644
> --- a/commit-slab.h
> +++ b/commit-slab.h
> @@ -117,4 +117,16 @@ static int stat_ ##slabname## realloc
> * catch because GCC silently parses it by default.
> */
>
> +/*
> + * 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 \
> +}
> +
> #endif /* COMMIT_SLAB_H */