On Tue, May 1, 2018 at 11:34 PM, Stefan Beller <[email protected]> wrote:
> #include "cache.h"
> #include "object.h"
> @@ -30,8 +31,25 @@ struct alloc_state {
> int count; /* total number of nodes allocated */
> int nr; /* number of nodes left in current allocation */
> void *p; /* first free node in current allocation */
> +
> + /* bookkeeping of allocations */
> + void **slabs;
Another way to manage this is linked list: you could reserve one
"object" in each slab to store the "next" (or "prev") pointer to
another slab, then you can just walk through all slabs and free. It's
a bit cheaper than reallocating slabs[], but I guess we reallocate so
few times that readability matters more (whichever way is chosen).
> + int slab_nr, slab_alloc;
> };
>
> +void *allocate_alloc_state(void)
> +{
> + return xcalloc(1, sizeof(struct alloc_state));
> +}
> +
> +void clear_alloc_state(struct alloc_state *s)
> +{
> + while (s->slab_nr > 0) {
> + s->slab_nr--;
> + free(s->slabs[s->slab_nr]);
I think you're leaking memory here. Commit and tree objects may have
more allocations in them (especially trees, but I think we have
commit_list in struct commit too). Those need to be freed as well.
> + }
> +}
> +
> static inline void *alloc_node(struct alloc_state *s, size_t node_size)
> {
> void *ret;
--
Duy