ewah/ewah_bitmap.c: avoid open-coding ALLOC_GROW()
'ewah/ewah_bitmap.c:buffer_grow()' is responsible for growing the buffer used to store the bits of an EWAH bitmap. It is essentially doing the same task as the 'ALLOC_GROW()' macro, so use that instead. This simplifies the callers of 'buffer_grow()', who no longer have to ask for a specific size, but rather specify how much of the buffer they need. They also no longer need to guard 'buffer_grow()' behind an if statement, since 'ALLOC_GROW()' (and, by extension, 'buffer_grow()') is a noop if the buffer is already large enough. But, the most significant change is that this fixes a bug when calling buffer_grow() with both 'alloc_size' and 'new_size' set to 1. In this case, truncating integer math will leave the new size set to 1, causing the buffer to never grow. Instead, let alloc_nr() handle this, which asks for '(new_size + 16) * 3 / 2' instead of 'new_size * 3 / 2'. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e31aba42fb
commit
3b1ca60f8f
@ -19,6 +19,7 @@
|
|||||||
#include "git-compat-util.h"
|
#include "git-compat-util.h"
|
||||||
#include "ewok.h"
|
#include "ewok.h"
|
||||||
#include "ewok_rlw.h"
|
#include "ewok_rlw.h"
|
||||||
|
#include "cache.h"
|
||||||
|
|
||||||
static inline size_t min_size(size_t a, size_t b)
|
static inline size_t min_size(size_t a, size_t b)
|
||||||
{
|
{
|
||||||
@ -33,20 +34,13 @@ static inline size_t max_size(size_t a, size_t b)
|
|||||||
static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size)
|
static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size)
|
||||||
{
|
{
|
||||||
size_t rlw_offset = (uint8_t *)self->rlw - (uint8_t *)self->buffer;
|
size_t rlw_offset = (uint8_t *)self->rlw - (uint8_t *)self->buffer;
|
||||||
|
ALLOC_GROW(self->buffer, new_size, self->alloc_size);
|
||||||
if (self->alloc_size >= new_size)
|
|
||||||
return;
|
|
||||||
|
|
||||||
self->alloc_size = new_size;
|
|
||||||
REALLOC_ARRAY(self->buffer, self->alloc_size);
|
|
||||||
self->rlw = self->buffer + (rlw_offset / sizeof(eword_t));
|
self->rlw = self->buffer + (rlw_offset / sizeof(eword_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void buffer_push(struct ewah_bitmap *self, eword_t value)
|
static inline void buffer_push(struct ewah_bitmap *self, eword_t value)
|
||||||
{
|
{
|
||||||
if (self->buffer_size + 1 >= self->alloc_size)
|
buffer_grow(self, self->buffer_size + 1);
|
||||||
buffer_grow(self, self->buffer_size * 3 / 2);
|
|
||||||
|
|
||||||
self->buffer[self->buffer_size++] = value;
|
self->buffer[self->buffer_size++] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,8 +131,7 @@ void ewah_add_dirty_words(
|
|||||||
|
|
||||||
rlw_set_literal_words(self->rlw, literals + can_add);
|
rlw_set_literal_words(self->rlw, literals + can_add);
|
||||||
|
|
||||||
if (self->buffer_size + can_add >= self->alloc_size)
|
buffer_grow(self, self->buffer_size + can_add);
|
||||||
buffer_grow(self, (self->buffer_size + can_add) * 3 / 2);
|
|
||||||
|
|
||||||
if (negate) {
|
if (negate) {
|
||||||
size_t i;
|
size_t i;
|
||||||
|
Loading…
Reference in New Issue
Block a user