summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 8c1f22d)
raw | patch | inline | side by side (parent: 8c1f22d)
author | Shawn O. Pearce <spearce@spearce.org> | |
Mon, 5 Feb 2007 21:34:56 +0000 (16:34 -0500) | ||
committer | Shawn O. Pearce <spearce@spearce.org> | |
Mon, 5 Feb 2007 21:34:56 +0000 (16:34 -0500) |
Some structs are allocated rather frequently, but were using integer
types which were far larger than required to actually store their
full value range.
As packfiles are limited to 4 GiB we don't need more than 32 bits to
store the offset of an object within that packfile, an `unsigned long`
on a 64 bit system is likely a 64 bit unsigned value. Saving 4 bytes
per object on a 64 bit system can add up fast on any sizable import.
As atom strings are strictly single components in a path name these
are probably limited to just 255 bytes by the underlying OS. Going
to that short of a string is probably too restrictive, but certainly
`unsigned int` is far too large for their lengths. `unsigned short`
is a reasonable limit.
Modes within a tree really only need two bytes to store their whole
value; using `unsigned int` here is vast overkill. Saving 4 bytes
per file entry in an active branch can add up quickly on a project
with a large number of files.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
types which were far larger than required to actually store their
full value range.
As packfiles are limited to 4 GiB we don't need more than 32 bits to
store the offset of an object within that packfile, an `unsigned long`
on a 64 bit system is likely a 64 bit unsigned value. Saving 4 bytes
per object on a 64 bit system can add up fast on any sizable import.
As atom strings are strictly single components in a path name these
are probably limited to just 255 bytes by the underlying OS. Going
to that short of a string is probably too restrictive, but certainly
`unsigned int` is far too large for their lengths. `unsigned short`
is a reasonable limit.
Modes within a tree really only need two bytes to store their whole
value; using `unsigned int` here is vast overkill. Saving 4 bytes
per file entry in an active branch can add up quickly on a project
with a large number of files.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
fast-import.c | patch | blob | history |
diff --git a/fast-import.c b/fast-import.c
index 1559f9c0ff30a6ea8c75f49fb15394c9d590fffe..9658c28413bc01b7f096b96841f6ed993d055b48 100644 (file)
--- a/fast-import.c
+++ b/fast-import.c
struct object_entry
{
struct object_entry *next;
- unsigned long offset;
+ uint32_t offset;
unsigned type : TYPE_BITS;
unsigned pack_id : PACK_ID_BITS;
unsigned char sha1[20];
{
void *data;
unsigned long len;
- unsigned long offset;
+ uint32_t offset;
unsigned int depth;
unsigned no_free:1;
};
struct atom_str
{
struct atom_str *next_atom;
- unsigned int str_len;
+ unsigned short str_len;
char str_dat[FLEX_ARRAY]; /* more */
};
struct atom_str* name;
struct tree_entry_ms
{
- unsigned int mode;
+ uint16_t mode;
unsigned char sha1[20];
} versions[2];
};
return oe;
}
-static struct atom_str* to_atom(const char *s, size_t len)
+static struct atom_str* to_atom(const char *s, unsigned short len)
{
unsigned int hc = hc_str(s, len) % atom_table_sz;
struct atom_str *c;
return unpack_entry(p, oe->offset, type, sizep);
}
-static const char *get_mode(const char *str, unsigned int *modep)
+static const char *get_mode(const char *str, uint16_t *modep)
{
unsigned char c;
- unsigned int mode = 0;
+ uint16_t mode = 0;
while ((c = *str++) != ' ') {
if (c < '0' || c > '7')
if (!c)
die("Corrupt mode in %s", sha1_to_hex(sha1));
e->versions[0].mode = e->versions[1].mode;
- e->name = to_atom(c, strlen(c));
+ e->name = to_atom(c, (unsigned short)strlen(c));
c += e->name->str_len + 1;
hashcpy(e->versions[0].sha1, (unsigned char*)c);
hashcpy(e->versions[1].sha1, (unsigned char*)c);
struct tree_entry *e = t->entries[i];
if (!e->versions[v].mode)
continue;
- c += sprintf(c, "%o", e->versions[v].mode);
+ c += sprintf(c, "%o", (unsigned int)e->versions[v].mode);
*c++ = ' ';
strcpy(c, e->name->str_dat);
c += e->name->str_len + 1;
struct tree_entry *root,
const char *p,
const unsigned char *sha1,
- const unsigned int mode)
+ const uint16_t mode)
{
struct tree_content *t = root->tree;
const char *slash1;
if (t->entry_count == t->entry_capacity)
root->tree = t = grow_tree_content(t, 8);
e = new_tree_entry();
- e->name = to_atom(p, n);
+ e->name = to_atom(p, (unsigned short)n);
e->versions[0].mode = 0;
hashclr(e->versions[0].sha1);
t->entries[t->entry_count++] = e;
const char *endp;
struct object_entry *oe;
unsigned char sha1[20];
- unsigned int mode, inline_data = 0;
+ uint16_t mode, inline_data = 0;
char type[20];
p = get_mode(p, &mode);