diff options
| author | Junio C Hamano <gitster@pobox.com> | 2015-05-14 15:25:52 -0700 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2015-05-22 14:40:30 -0700 | 
| commit | 862e730ec1c13f28bfb7c8c9ecb39bcc92dd0922 (patch) | |
| tree | 83f241cbdd890926053221fd0932ab6d47217108 /commit.c | |
| parent | 282616c72d1d08a77ca4fe1186cb708c38408d87 (diff) | |
| download | git-862e730ec1c13f28bfb7c8c9ecb39bcc92dd0922.tar.gz | |
commit-slab: introduce slabname##_peek() functionjc/commit-slab
There is no API to ask "Does this commit have associated data in
slab?".  If an application wants to (1) parse just a few commits at
the beginning of a process, (2) store data for only these commits,
and then (3) start processing many commits, taking into account the
data stored (for a few of them) in the slab, the application would
use slabname##_at() to allocate a space to store data in (2), but
there is no API other than slabname##_at() to use in step (3).  This
allocates and wastes new space for these commits the caller is only
interested in checking if they have data stored in step (2).
Introduce slabname##_peek(), which is similar to slabname##_at() but
returns NULL when there is no data already associated to it in such
a use case.
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'commit.c')
| -rw-r--r-- | commit.c | 28 | 
1 files changed, 20 insertions, 8 deletions
| @@ -244,7 +244,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)  { -	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)  		*sizep = v->size;  	return v->buffer; @@ -271,24 +276,31 @@ const void *get_commit_buffer(const struct commit *commit, unsigned long *sizep)  void unuse_commit_buffer(const struct commit *commit, const void *buffer)  { -	struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit); -	if (v->buffer != buffer) +	struct commit_buffer *v = buffer_slab_peek(&buffer_slab, commit); +	if (!(v && v->buffer == buffer))  		free((void *)buffer);  }  void free_commit_buffer(struct commit *commit)  { -	struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit); -	free(v->buffer); -	v->buffer = NULL; -	v->size = 0; +	struct commit_buffer *v = buffer_slab_peek(&buffer_slab, commit); +	if (v) { +		free(v->buffer); +		v->buffer = NULL; +		v->size = 0; +	}  }  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; +	if (!v) { +		if (sizep) +			*sizep = 0; +		return NULL; +	}  	ret = v->buffer;  	if (sizep)  		*sizep = v->size; | 
