mirror of
https://github.com/git/git.git
synced 2024-05-23 17:16:18 +02:00
Merge branch 'jc/commit-slab'
Memory use reduction when commit-slab facility is used to annotate sparsely (which is not recommended in the first place). * jc/commit-slab: commit-slab: introduce slabname##_peek() function
This commit is contained in:
commit
720e20eb68
|
@ -15,7 +15,13 @@
|
||||||
* - int *indegree_at(struct indegree *, struct commit *);
|
* - int *indegree_at(struct indegree *, struct commit *);
|
||||||
*
|
*
|
||||||
* This function locates the data associated with the given commit in
|
* This function locates the data associated with the given commit in
|
||||||
* the indegree slab, and returns the pointer to it.
|
* the indegree slab, and returns the pointer to it. The location to
|
||||||
|
* store the data is allocated as necessary.
|
||||||
|
*
|
||||||
|
* - int *indegree_peek(struct indegree *, struct commit *);
|
||||||
|
*
|
||||||
|
* This function is similar to indegree_at(), but it will return NULL
|
||||||
|
* until a call to indegree_at() was made for the commit.
|
||||||
*
|
*
|
||||||
* - void init_indegree(struct indegree *);
|
* - void init_indegree(struct indegree *);
|
||||||
* void init_indegree_with_stride(struct indegree *, int);
|
* void init_indegree_with_stride(struct indegree *, int);
|
||||||
|
@ -80,8 +86,9 @@ static MAYBE_UNUSED void clear_ ##slabname(struct slabname *s) \
|
||||||
s->slab = NULL; \
|
s->slab = NULL; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s, \
|
static MAYBE_UNUSED elemtype *slabname## _at_peek(struct slabname *s, \
|
||||||
const struct commit *c) \
|
const struct commit *c, \
|
||||||
|
int add_if_missing) \
|
||||||
{ \
|
{ \
|
||||||
int nth_slab, nth_slot; \
|
int nth_slab, nth_slot; \
|
||||||
\
|
\
|
||||||
|
@ -90,18 +97,35 @@ static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s, \
|
||||||
\
|
\
|
||||||
if (s->slab_count <= nth_slab) { \
|
if (s->slab_count <= nth_slab) { \
|
||||||
int i; \
|
int i; \
|
||||||
|
if (!add_if_missing) \
|
||||||
|
return NULL; \
|
||||||
REALLOC_ARRAY(s->slab, nth_slab + 1); \
|
REALLOC_ARRAY(s->slab, nth_slab + 1); \
|
||||||
stat_ ##slabname## realloc++; \
|
stat_ ##slabname## realloc++; \
|
||||||
for (i = s->slab_count; i <= nth_slab; i++) \
|
for (i = s->slab_count; i <= nth_slab; i++) \
|
||||||
s->slab[i] = NULL; \
|
s->slab[i] = NULL; \
|
||||||
s->slab_count = nth_slab + 1; \
|
s->slab_count = nth_slab + 1; \
|
||||||
} \
|
} \
|
||||||
if (!s->slab[nth_slab]) \
|
if (!s->slab[nth_slab]) { \
|
||||||
|
if (!add_if_missing) \
|
||||||
|
return NULL; \
|
||||||
s->slab[nth_slab] = xcalloc(s->slab_size, \
|
s->slab[nth_slab] = xcalloc(s->slab_size, \
|
||||||
sizeof(**s->slab) * s->stride); \
|
sizeof(**s->slab) * s->stride); \
|
||||||
|
} \
|
||||||
return &s->slab[nth_slab][nth_slot * s->stride]; \
|
return &s->slab[nth_slab][nth_slot * s->stride]; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s, \
|
||||||
|
const struct commit *c) \
|
||||||
|
{ \
|
||||||
|
return slabname##_at_peek(s, c, 1); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
static MAYBE_UNUSED elemtype *slabname## _peek(struct slabname *s, \
|
||||||
|
const struct commit *c) \
|
||||||
|
{ \
|
||||||
|
return slabname##_at_peek(s, c, 0); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
static int stat_ ##slabname## realloc
|
static int stat_ ##slabname## realloc
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
22
commit.c
22
commit.c
|
@ -245,7 +245,12 @@ void set_commit_buffer(struct commit *commit, void *buffer, unsigned long size)
|
||||||
|
|
||||||
const void *get_cached_commit_buffer(const struct commit *commit, unsigned long *sizep)
|
const void *get_cached_commit_buffer(const struct commit *commit, unsigned long *sizep)
|
||||||
{
|
{
|
||||||
struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
|
struct commit_buffer *v = buffer_slab_peek(&buffer_slab, commit);
|
||||||
|
if (!v) {
|
||||||
|
if (sizep)
|
||||||
|
*sizep = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
if (sizep)
|
if (sizep)
|
||||||
*sizep = v->size;
|
*sizep = v->size;
|
||||||
return v->buffer;
|
return v->buffer;
|
||||||
|
@ -272,24 +277,31 @@ const void *get_commit_buffer(const struct commit *commit, unsigned long *sizep)
|
||||||
|
|
||||||
void unuse_commit_buffer(const struct commit *commit, const void *buffer)
|
void unuse_commit_buffer(const struct commit *commit, const void *buffer)
|
||||||
{
|
{
|
||||||
struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
|
struct commit_buffer *v = buffer_slab_peek(&buffer_slab, commit);
|
||||||
if (v->buffer != buffer)
|
if (!(v && v->buffer == buffer))
|
||||||
free((void *)buffer);
|
free((void *)buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_commit_buffer(struct commit *commit)
|
void free_commit_buffer(struct commit *commit)
|
||||||
{
|
{
|
||||||
struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
|
struct commit_buffer *v = buffer_slab_peek(&buffer_slab, commit);
|
||||||
|
if (v) {
|
||||||
free(v->buffer);
|
free(v->buffer);
|
||||||
v->buffer = NULL;
|
v->buffer = NULL;
|
||||||
v->size = 0;
|
v->size = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep)
|
const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep)
|
||||||
{
|
{
|
||||||
struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
|
struct commit_buffer *v = buffer_slab_peek(&buffer_slab, commit);
|
||||||
void *ret;
|
void *ret;
|
||||||
|
|
||||||
|
if (!v) {
|
||||||
|
if (sizep)
|
||||||
|
*sizep = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
ret = v->buffer;
|
ret = v->buffer;
|
||||||
if (sizep)
|
if (sizep)
|
||||||
*sizep = v->size;
|
*sizep = v->size;
|
||||||
|
|
Loading…
Reference in New Issue