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() functionmaint
						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,16 +97,33 @@ 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 | ||||||
|  |  | ||||||
							
								
								
									
										28
									
								
								commit.c
								
								
								
								
							
							
						
						
									
										28
									
								
								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); | ||||||
| 	free(v->buffer); | 	if (v) { | ||||||
| 	v->buffer = NULL; | 		free(v->buffer); | ||||||
| 	v->size = 0; | 		v->buffer = NULL; | ||||||
|  | 		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
	
	 Junio C Hamano
						Junio C Hamano