• Ramsay Jones's avatar
    commit-slab.h: Fix memory allocation and addressing · d7a1d629
    Ramsay Jones authored
    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: default avatarRamsay Jones <ramsay@ramsay1.demon.co.uk>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    d7a1d629
commit-slab.h 2.87 KB