summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 885a86a)
raw | patch | inline | side by side (parent: 885a86a)
author | Linus Torvalds <torvalds@osdl.org> | |
Sun, 18 Jun 2006 01:26:18 +0000 (18:26 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Sun, 18 Jun 2006 01:49:45 +0000 (18:49 -0700) |
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>
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>
blame.c | patch | blob | history | |
builtin-show-branch.c | patch | blob | history | |
commit.c | patch | blob | history | |
commit.h | patch | blob | history | |
name-rev.c | patch | blob | history | |
object.h | patch | blob | history |
index 25d3bcf647f44bbaed1c273d5886df6a7cfe6e03..7c0b62cf3f5ff78f95cf96c2582f693b5d124752 100644 (file)
--- a/blame.c
+++ b/blame.c
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);
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)
/* 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 =
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;
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;
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);
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)
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;
alloc_line_map(commit);
- util = commit->object.util;
+ util = commit->util;
for (i = 0; i < util->num_lines; i++)
util->line_map[i] = i;
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;
continue;
alloc_line_map(commit);
- util = commit->object.util;
+ util = commit->util;
for (parents = commit->parents;
parents != NULL; parents = parents->next) {
{
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;
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;
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;
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)) {
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;
}
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;
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) {
diff --git a/builtin-show-branch.c b/builtin-show-branch.c
index cf9c071a53c09476acaecb6bcbf95d4ff76dca79..09d82278625584213f710a984652a7efc07339c5 100644 (file)
--- a/builtin-show-branch.c
+++ b/builtin-show-branch.c
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;
}
*/
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 ||
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++;
}
/* 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) {
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) {
char newname[1000], *en;
parents = parents->next;
nth++;
- if (p->object.util)
+ if (p->util)
continue;
en = newname;
switch (n->generation) {
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);
diff --git a/commit.c b/commit.c
index 11fca559d8a4bcb6b6dc67f41ec54991acaba11a..5914200a2fba2d618951c3210e2b407c29a62d7b 100644 (file)
--- a/commit.c
+++ b/commit.c
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;
}
/*
diff --git a/commit.h b/commit.h
index c9de1677e903ead414e5133424b722bea907b4d9..7c9ca3fbed728d946e48c787720b3ab5ad575a85 100644 (file)
--- a/commit.h
+++ b/commit.h
struct commit {
struct object object;
+ void *util;
unsigned long date;
struct commit_list *parents;
struct tree *tree;
diff --git a/name-rev.c b/name-rev.c
index 1f0135f5ab92a3eaadfb05b62a5ccea62cb43826..c29b93ea7199643885cd74148d03db7d1bbb533b 100644 (file)
--- a/name-rev.c
+++ b/name-rev.c
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;
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 &&
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";
diff --git a/object.h b/object.h
index a0762b66725a1f8af45ea65147178b9130e2e056..f4ee2e55ba7853e3b49cbca7409c89b71d4b848f 100644 (file)
--- a/object.h
+++ b/object.h
unsigned flags : FLAG_BITS;
unsigned char sha1[20];
struct object_refs *refs;
- void *util;
};
extern int track_object_refs;