Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Commits on Sep 18, 2014
  1. @gitster

    use REALLOC_ARRAY for changing the allocation size of arrays

    René Scharfe authored gitster committed
    Signed-off-by: Rene Scharfe <>
    Signed-off-by: Junio C Hamano <>
Commits on Jun 13, 2014
  1. @peff @gitster

    commit-slab: provide a static initializer

    peff authored gitster committed
    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 <>
    Signed-off-by: Junio C Hamano <>
Commits on Dec 2, 2013
  1. @trast @gitster

    commit-slab: sizeof() the right type in xrealloc

    trast authored gitster committed
    When allocating the slab, the code accidentally computed the array
    size from s->slab (an elemtype**).  The slab is an array of elemtype*,
    however, so we should take the size of *s->slab.
    Noticed-by: Nguyễn Thái Ngọc Duy <>
    Signed-off-by: Thomas Rast <>
    Reviewed-by: Jeff King <>
    Signed-off-by: Junio C Hamano <>
Commits on Nov 27, 2013
  1. @trast @gitster

    commit-slab: declare functions "static inline"

    trast authored gitster committed
    This shuts up compiler warnings about unused functions.  No such
    warnings are currently triggered, but if someone were to actually
    use init_NAME_with_stride() as documented, they would get a warning
    about init_NAME() being unused.
    While there, write a comment about why the last real declaration of
    the variable is without a terminating semicolon, while another
    forward declarations have one.
    Signed-off-by: Thomas Rast <>
    Helped-by: Jonathan Nieder <>
    Signed-off-by: Junio C Hamano <>
  2. @trast @gitster

    commit-slab: document clear_$slabname()

    trast authored gitster committed
    The clear_$slabname() function was only documented by source code so
    far.  Write something about it.
    Signed-off-by: Thomas Rast <>
    Helped-by: Jonathan Nieder <>
    Signed-off-by: Junio C Hamano <>
Commits on Jul 29, 2013
  1. @gitster

    commit-slab.h: Fix memory allocation and addressing

    Ramsay Jones authored gitster committed
    The slab initialization code includes the calculation of the
    slab 'elem_size', which is in turn used to determine the size
    (capacity) of the slab. Each element of the slab represents an
    array, of length 'stride', of 'elemtype'. (Note that it may be
    clearer if the define_commit_slab macro parameter was called
    'basetype' rather than 'elemtype'). However, the 'elem_size'
    calculation incorrectly uses 'sizeof(struct slabname)' in the
    expression, rather than 'sizeof(elemtype)'.
    Within the slab access routine, <slabname>_at(), the given commit
    'index' is transformed into an (slab#, slot#) pair used to address
    the required element (a pointer to the first element of the array
    of 'elemtype' associated with that commit). The current code to
    calculate these address coordinates multiplies the commit index
    by the 'stride' which, at least for the slab#, produces the wrong
    result. Using the commit index directly, without scaling by the
    'stride', produces the correct 'logical' address.
    Also, when allocating a new slab, the size of the allocation only
    allows for a slab containing elements of single element arrays of
    'elemtype'. This should allow for elements of an array of length
    'stride' of 'elemtype'. In order to fix this, we need to change
    the element size parameter to xcalloc() by multiplying the current
    element size (sizeof(**s->slab)) by the s->stride.
    Having changed the calculation of the slot#, we now need to convert
    the logical 'nth_slot', by scaling with s->stride, into the correct
    physical address.
    Signed-off-by: Ramsay Jones <>
    Signed-off-by: Junio C Hamano <>
Commits on Jun 7, 2013
  1. @gitster

    commit-slab: introduce a macro to define a slab for new type

    gitster authored
    Introduce a header file to define a macro that can define the struct
    type, initializer, accessor and cleanup functions to manage a commit
    slab.  Update the "indegree" topological sort facility using it.
    To associate 32 flag bits with each commit, you can write:
    	define_commit_slab(flag32, uint32);
    to declare "struct flag32" type, define an instance of it with
    	struct flag32 flags;
    and initialize it by calling
    After that, a call to flag32_at() function
    	uint32 *fp = flag32_at(&flags, commit);
    will return a pointer pointing at a uint32 for that commit.  Once
    you are done with these flags, clean them up with
    Callers that cannot hard-code how wide the data to be associated
    with the commit be at compile time can use the "_with_stride"
    variant to initialize the slab.
    Suppose you want to give one bit per existing ref, and paint commits
    down to find which refs are descendants of each commit.  Saying
    	typedef uint32 bits320[5];
    	define_commit_slab(flagbits, bits320);
    at compile time will still limit your code with hard-coded limit,
    because you may find that you have more than 320 refs at runtime.
    The code can declare a commit slab "struct flagbits" like this
    	define_commit_slab(flagbits, unsigned char);
    	struct flagbits flags;
    and initialize it by:
    	nrefs = ... count number of refs ...
    	init_flagbits_with_stride(&flags, (nrefs + 7) / 8);
    so that
    	unsigned char *fp = flagbits_at(&flags, commit);
    will return a pointer pointing at an array of 40 "unsigned char"s
    associated with the commit, once you figure out nrefs is 320 at
    Signed-off-by: Junio C Hamano <>
Something went wrong with that request. Please try again.