Skip to content

Commit

Permalink
Move "void *util" from "struct object" into "struct commit"
Browse files Browse the repository at this point in the history
Every single user actually wanted this only for commit objects, and we
have no reason to waste space on it for other object types. So just move
the structure member from the low-level "struct object" into the "struct
commit".

This leaves the commit object the same size, and removes one unnecessary
pointer from all other object allocations.

This shrinks memory usage (still at a fairly hefty half-gig, admittedly)
of "git-rev-list --all --objects" on the mozilla repo by another 5% in my
tests.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Jun 18, 2006
1 parent 885a86a commit d3ff6f5
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 42 deletions.
48 changes: 24 additions & 24 deletions blame.c
Expand Up @@ -110,8 +110,8 @@ static struct patch *get_patch(struct commit *commit, struct commit *other)
xdemitconf_t xecfg;
mmfile_t file_c, file_o;
xdemitcb_t ecb;
struct util_info *info_c = (struct util_info *)commit->object.util;
struct util_info *info_o = (struct util_info *)other->object.util;
struct util_info *info_c = (struct util_info *)commit->util;
struct util_info *info_o = (struct util_info *)other->util;
struct timeval tv_start, tv_end;

get_blob(commit);
Expand Down Expand Up @@ -197,7 +197,7 @@ static int get_blob_sha1_internal(const unsigned char *sha1, const char *base,

static void get_blob(struct commit *commit)
{
struct util_info *info = commit->object.util;
struct util_info *info = commit->util;
char type[20];

if (info->buf)
Expand All @@ -223,8 +223,8 @@ static void print_patch(struct patch *p)
/* For debugging only */
static void print_map(struct commit *cmit, struct commit *other)
{
struct util_info *util = cmit->object.util;
struct util_info *util2 = other->object.util;
struct util_info *util = cmit->util;
struct util_info *util2 = other->util;

int i;
int max =
Expand Down Expand Up @@ -259,8 +259,8 @@ static void print_map(struct commit *cmit, struct commit *other)
static void fill_line_map(struct commit *commit, struct commit *other,
struct patch *p)
{
struct util_info *util = commit->object.util;
struct util_info *util2 = other->object.util;
struct util_info *util = commit->util;
struct util_info *util2 = other->util;
int *map = util->line_map;
int *map2 = util2->line_map;
int cur_chunk = 0;
Expand Down Expand Up @@ -322,14 +322,14 @@ static void fill_line_map(struct commit *commit, struct commit *other,

static int map_line(struct commit *commit, int line)
{
struct util_info *info = commit->object.util;
struct util_info *info = commit->util;
assert(line >= 0 && line < info->num_lines);
return info->line_map[line];
}

static struct util_info* get_util(struct commit *commit)
{
struct util_info *util = commit->object.util;
struct util_info *util = commit->util;

if (util)
return util;
Expand All @@ -340,13 +340,13 @@ static struct util_info* get_util(struct commit *commit)
util->line_map = NULL;
util->num_lines = -1;
util->pathname = NULL;
commit->object.util = util;
commit->util = util;
return util;
}

static int fill_util_info(struct commit *commit)
{
struct util_info *util = commit->object.util;
struct util_info *util = commit->util;

assert(util);
assert(util->pathname);
Expand All @@ -359,7 +359,7 @@ static int fill_util_info(struct commit *commit)

static void alloc_line_map(struct commit *commit)
{
struct util_info *util = commit->object.util;
struct util_info *util = commit->util;
int i;

if (util->line_map)
Expand All @@ -383,7 +383,7 @@ static void alloc_line_map(struct commit *commit)

static void init_first_commit(struct commit* commit, const char* filename)
{
struct util_info* util = commit->object.util;
struct util_info* util = commit->util;
int i;

util->pathname = filename;
Expand All @@ -392,7 +392,7 @@ static void init_first_commit(struct commit* commit, const char* filename)

alloc_line_map(commit);

util = commit->object.util;
util = commit->util;

for (i = 0; i < util->num_lines; i++)
util->line_map[i] = i;
Expand All @@ -413,7 +413,7 @@ static void process_commits(struct rev_info *rev, const char *path,
assert(commit);
init_first_commit(commit, path);

util = commit->object.util;
util = commit->util;
num_blame_lines = util->num_lines;
blame_lines = xmalloc(sizeof(struct commit *) * num_blame_lines);
blame_contents = util->buf;
Expand Down Expand Up @@ -452,7 +452,7 @@ static void process_commits(struct rev_info *rev, const char *path,
continue;

alloc_line_map(commit);
util = commit->object.util;
util = commit->util;

for (parents = commit->parents;
parents != NULL; parents = parents->next) {
Expand Down Expand Up @@ -512,7 +512,7 @@ static int compare_tree_path(struct rev_info* revs,
{
int ret;
const char* paths[2];
struct util_info* util = c2->object.util;
struct util_info* util = c2->util;
paths[0] = util->pathname;
paths[1] = NULL;

Expand Down Expand Up @@ -541,7 +541,7 @@ static int same_tree_as_empty_path(struct rev_info *revs, struct tree* t1,

static const char* find_rename(struct commit* commit, struct commit* parent)
{
struct util_info* cutil = commit->object.util;
struct util_info* cutil = commit->util;
struct diff_options diff_opts;
const char *paths[1];
int i;
Expand Down Expand Up @@ -585,7 +585,7 @@ static void simplify_commit(struct rev_info *revs, struct commit *commit)
return;

if (!commit->parents) {
struct util_info* util = commit->object.util;
struct util_info* util = commit->util;
if (!same_tree_as_empty_path(revs, commit->tree,
util->pathname))
commit->object.flags |= TREECHANGE;
Expand All @@ -612,7 +612,7 @@ static void simplify_commit(struct rev_info *revs, struct commit *commit)
case REV_TREE_NEW:
{

struct util_info* util = commit->object.util;
struct util_info* util = commit->util;
if (revs->remove_empty_trees &&
same_tree_as_empty_path(revs, p->tree,
util->pathname)) {
Expand Down Expand Up @@ -709,13 +709,13 @@ static const char* format_time(unsigned long time, const char* tz_str,

static void topo_setter(struct commit* c, void* data)
{
struct util_info* util = c->object.util;
struct util_info* util = c->util;
util->topo_data = data;
}

static void* topo_getter(struct commit* c)
{
struct util_info* util = c->object.util;
struct util_info* util = c->util;
return util->topo_data;
}

Expand Down Expand Up @@ -863,7 +863,7 @@ int main(int argc, const char **argv)
struct util_info* u;
if (!c)
c = initial;
u = c->object.util;
u = c->util;

if (!found_rename && strcmp(filename, u->pathname))
found_rename = 1;
Expand All @@ -881,7 +881,7 @@ int main(int argc, const char **argv)
if (!c)
c = initial;

u = c->object.util;
u = c->util;
get_commit_info(c, &ci);
fwrite(sha1_to_hex(c->object.sha1), sha1_len, 1, stdout);
if(compability) {
Expand Down
24 changes: 12 additions & 12 deletions builtin-show-branch.c
Expand Up @@ -51,9 +51,9 @@ struct commit_name {
static void name_commit(struct commit *commit, const char *head_name, int nth)
{
struct commit_name *name;
if (!commit->object.util)
commit->object.util = xmalloc(sizeof(struct commit_name));
name = commit->object.util;
if (!commit->util)
commit->util = xmalloc(sizeof(struct commit_name));
name = commit->util;
name->head_name = head_name;
name->generation = nth;
}
Expand All @@ -65,8 +65,8 @@ static void name_commit(struct commit *commit, const char *head_name, int nth)
*/
static void name_parent(struct commit *commit, struct commit *parent)
{
struct commit_name *commit_name = commit->object.util;
struct commit_name *parent_name = parent->object.util;
struct commit_name *commit_name = commit->util;
struct commit_name *parent_name = parent->util;
if (!commit_name)
return;
if (!parent_name ||
Expand All @@ -80,12 +80,12 @@ static int name_first_parent_chain(struct commit *c)
int i = 0;
while (c) {
struct commit *p;
if (!c->object.util)
if (!c->util)
break;
if (!c->parents)
break;
p = c->parents->item;
if (!p->object.util) {
if (!p->util) {
name_parent(c, p);
i++;
}
Expand All @@ -106,7 +106,7 @@ static void name_commits(struct commit_list *list,
/* First give names to the given heads */
for (cl = list; cl; cl = cl->next) {
c = cl->item;
if (c->object.util)
if (c->util)
continue;
for (i = 0; i < num_rev; i++) {
if (rev[i] == c) {
Expand All @@ -132,17 +132,17 @@ static void name_commits(struct commit_list *list,
struct commit_name *n;
int nth;
c = cl->item;
if (!c->object.util)
if (!c->util)
continue;
n = c->object.util;
n = c->util;
parents = c->parents;
nth = 0;
while (parents) {
struct commit *p = parents->item;
char newname[1000], *en;
parents = parents->next;
nth++;
if (p->object.util)
if (p->util)
continue;
en = newname;
switch (n->generation) {
Expand Down Expand Up @@ -257,7 +257,7 @@ static void join_revs(struct commit_list **list_p,
static void show_one_commit(struct commit *commit, int no_name)
{
char pretty[256], *cp;
struct commit_name *name = commit->object.util;
struct commit_name *name = commit->util;
if (commit->object.parsed)
pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
pretty, sizeof(pretty), 0, NULL, NULL);
Expand Down
4 changes: 2 additions & 2 deletions commit.c
Expand Up @@ -711,12 +711,12 @@ int count_parents(struct commit * commit)

void topo_sort_default_setter(struct commit *c, void *data)
{
c->object.util = data;
c->util = data;
}

void *topo_sort_default_getter(struct commit *c)
{
return c->object.util;
return c->util;
}

/*
Expand Down
1 change: 1 addition & 0 deletions commit.h
Expand Up @@ -11,6 +11,7 @@ struct commit_list {

struct commit {
struct object object;
void *util;
unsigned long date;
struct commit_list *parents;
struct tree *tree;
Expand Down
12 changes: 9 additions & 3 deletions name-rev.c
Expand Up @@ -19,7 +19,7 @@ static void name_rev(struct commit *commit,
const char *tip_name, int merge_traversals, int generation,
int deref)
{
struct rev_name *name = (struct rev_name *)commit->object.util;
struct rev_name *name = (struct rev_name *)commit->util;
struct commit_list *parents;
int parent_number = 1;

Expand All @@ -41,7 +41,7 @@ static void name_rev(struct commit *commit,

if (name == NULL) {
name = xmalloc(sizeof(rev_name));
commit->object.util = name;
commit->util = name;
goto copy_data;
} else if (name->merge_traversals > merge_traversals ||
(name->merge_traversals == merge_traversals &&
Expand Down Expand Up @@ -108,7 +108,13 @@ static int name_ref(const char *path, const unsigned char *sha1)
static const char* get_rev_name(struct object *o)
{
static char buffer[1024];
struct rev_name *n = (struct rev_name *)o->util;
struct rev_name *n;
struct commit *c;

if (o->type != TYPE_COMMIT)
return "undefined";
c = (struct commit *) o;
n = c->util;
if (!n)
return "undefined";

Expand Down
1 change: 0 additions & 1 deletion object.h
Expand Up @@ -29,7 +29,6 @@ struct object {
unsigned flags : FLAG_BITS;
unsigned char sha1[20];
struct object_refs *refs;
void *util;
};

extern int track_object_refs;
Expand Down

0 comments on commit d3ff6f5

Please sign in to comment.