<feed xmlns='http://www.w3.org/2005/Atom'>
<title>git/object.c, branch v1.5.0-rc3</title>
<subtitle>Mirror of https://git.kernel.org/pub/scm/git/git.git/
</subtitle>
<id>https://git.shady.money/git/atom?h=v1.5.0-rc3</id>
<link rel='self' href='https://git.shady.money/git/atom?h=v1.5.0-rc3'/>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/'/>
<updated>2006-09-16T17:22:02Z</updated>
<entry>
<title>Add git-for-each-ref: helper for language bindings</title>
<updated>2006-09-16T17:22:02Z</updated>
<author>
<name>Junio C Hamano</name>
<email>junkio@cox.net</email>
</author>
<published>2006-09-15T20:30:02Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=9f613ddd21cbd05bfc139d9b1551b5780aa171f6'/>
<id>urn:sha1:9f613ddd21cbd05bfc139d9b1551b5780aa171f6</id>
<content type='text'>
This adds a new command, git-for-each-ref.  You can have it iterate
over refs and have it output various aspects of the objects they
refer to.

Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Use xcalloc instead of calloc</title>
<updated>2006-08-28T03:49:43Z</updated>
<author>
<name>Jonas Fonseca</name>
<email>fonseca@diku.dk</email>
</author>
<published>2006-08-28T00:26:07Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=b3c952f8386cebe12fc95227866683bb1cec99a9'/>
<id>urn:sha1:b3c952f8386cebe12fc95227866683bb1cec99a9</id>
<content type='text'>
Signed-off-by: Jonas Fonseca &lt;fonseca@diku.dk&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Convert memcpy(a,b,20) to hashcpy(a,b).</title>
<updated>2006-08-23T20:53:10Z</updated>
<author>
<name>Shawn Pearce</name>
<email>spearce@spearce.org</email>
</author>
<published>2006-08-23T06:49:00Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=e702496e434a160f798447b95b9cea3cd138c140'/>
<id>urn:sha1:e702496e434a160f798447b95b9cea3cd138c140</id>
<content type='text'>
This abstracts away the size of the hash values when copying them
from memory location to memory location, much as the introduction
of hashcmp abstracted away hash value comparsion.

A few call sites were using char* rather than unsigned char* so
I added the cast rather than open hashcpy to be void*.  This is a
reasonable tradeoff as most call sites already use unsigned char*
and the existing hashcmp is also declared to be unsigned char*.

[jc: Splitted the patch to "master" part, to be followed by a
 patch for merge-recursive.c which is not in "master" yet.

 Fixed the cast in the latter hunk to combine-diff.c which was
 wrong in the original.

 Also converted ones left-over in combine-diff.c, diff-lib.c and
 upload-pack.c ]

Signed-off-by: Shawn O. Pearce &lt;spearce@spearce.org&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Do not use memcmp(sha1_1, sha1_2, 20) with hardcoded length.</title>
<updated>2006-08-17T21:23:53Z</updated>
<author>
<name>David Rientjes</name>
<email>rientjes@google.com</email>
</author>
<published>2006-08-17T18:54:57Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=a89fccd28197fa179828c8596791ff16e2268d20'/>
<id>urn:sha1:a89fccd28197fa179828c8596791ff16e2268d20</id>
<content type='text'>
Introduces global inline:

	hashcmp(const unsigned char *sha1, const unsigned char *sha2)

Uses memcmp for comparison and returns the result based on the length of
the hash name (a future runtime decision).

Acked-by: Alex Riesen &lt;raa.lkml@gmail.com&gt;
Signed-off-by: David Rientjes &lt;rientjes@google.com&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Remove TYPE_* constant macros and use object_type enums consistently.</title>
<updated>2006-07-13T06:18:03Z</updated>
<author>
<name>Linus Torvalds</name>
<email>torvalds@osdl.org</email>
</author>
<published>2006-07-12T03:45:31Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=1974632c664c2d573b36a00fa993c1c13dd8a967'/>
<id>urn:sha1:1974632c664c2d573b36a00fa993c1c13dd8a967</id>
<content type='text'>
This updates the type-enumeration constants introduced to reduce
the memory footprint of "struct object" to match the type bits
already used in the packfile format, by removing the former
(i.e. TYPE_* constant macros) and using the latter (i.e. enum
object_type) throughout the code for consistency.

Eventually we can stop passing around the "type strings"
entirely, and this will help - no confusion about two different
integer enumeration.

Signed-off-by: Linus Torvalds &lt;torvalds@osdl.org&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>git object hash cleanups</title>
<updated>2006-07-02T01:28:15Z</updated>
<author>
<name>Linus Torvalds</name>
<email>torvalds@osdl.org</email>
</author>
<published>2006-06-30T18:20:33Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=0556a11a0df6b4119e01aa77dfb795561e62eb34'/>
<id>urn:sha1:0556a11a0df6b4119e01aa77dfb795561e62eb34</id>
<content type='text'>
This IMNSHO cleans up the object hashing.

The hash expansion is separated out into a function of its own, the hash
array (and size) names are made more obvious, and the code is generally
made to look a bit more like the object-ref hashing.

It also gets rid of "find_object()" returning an index (or negative
position if no object is found), since that is made redundant by the
simplified object rehashing. The basic operation is now "lookup_object()"
which just returns the object itself.

There's an almost unmeasurable speed increase, but more importantly, I
think the end result is more readable.

Signed-off-by: Linus Torvalds &lt;torvalds@osdl.org&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Abstract out accesses to object hash array</title>
<updated>2006-06-30T06:48:31Z</updated>
<author>
<name>Linus Torvalds</name>
<email>torvalds@osdl.org</email>
</author>
<published>2006-06-30T04:38:55Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=fc046a75d539a78e6b2c16534c4078617a69a327'/>
<id>urn:sha1:fc046a75d539a78e6b2c16534c4078617a69a327</id>
<content type='text'>
There are a few special places where some programs accessed the object
hash array directly, which bothered me because I wanted to play with some
simple re-organizations.

So this patch makes the object hash array data structures all entirely
local to object.c, and the few users who wanted to look at it now get to
use a function to query how many object index entries there can be, and to
actually access the array.

Signed-off-by: Linus Torvalds &lt;torvalds@osdl.org&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Add "named object array" concept</title>
<updated>2006-06-20T01:45:48Z</updated>
<author>
<name>Linus Torvalds</name>
<email>torvalds@osdl.org</email>
</author>
<published>2006-06-20T00:42:35Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=1f1e895fccc52a1e227c464c4558d74604301a9f'/>
<id>urn:sha1:1f1e895fccc52a1e227c464c4558d74604301a9f</id>
<content type='text'>
We've had this notion of a "object_list" for a long time, which eventually
grew a "name" member because some users (notably git-rev-list) wanted to
name each object as it is generated.

That object_list is great for some things, but it isn't all that wonderful
for others, and the "name" member is generally not used by everybody.

This patch splits the users of the object_list array up into two: the
traditional list users, who want the list-like format, and who don't
actually use or want the name. And another class of users that really used
the list as an extensible array, and generally wanted to name the objects.

The patch is fairly straightforward, but it's also biggish. Most of it
really just cleans things up: switching the revision parsing and listing
over to the array makes things like the builtin-diff usage much simpler
(we now see exactly how many members the array has, and we don't get the
objects reversed from the order they were on the command line).

One of the main reasons for doing this at all is that the malloc overhead
of the simple object list was actually pretty high, and the array is just
a lot denser. So this patch brings down memory usage by git-rev-list by
just under 3% (on top of all the other memory use optimizations) on the
mozilla archive.

It does add more lines than it removes, and more importantly, it adds a
whole new infrastructure for maintaining lists of objects, but on the
other hand, the new dynamic array code is pretty obvious. The change to
builtin-diff-tree.c shows a fairly good example of why an array interface
is sometimes more natural, and just much simpler for everybody.

Signed-off-by: Linus Torvalds &lt;torvalds@osdl.org&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Remove "refs" field from "struct object"</title>
<updated>2006-06-18T20:51:27Z</updated>
<author>
<name>Linus Torvalds</name>
<email>torvalds@osdl.org</email>
</author>
<published>2006-06-18T18:45:02Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=3e4339e6f96e8c4f38a9c6607b98d3e96a2ed783'/>
<id>urn:sha1:3e4339e6f96e8c4f38a9c6607b98d3e96a2ed783</id>
<content type='text'>
This shrinks "struct object" to the absolutely minimal size possible.
It now contains /only/ the object flags and the SHA1 hash name of the
object.

The "refs" field, which is really needed only for fsck, is maintained in
a separate hashed lookup-table, allowing all normal users to totally
ignore it.

This helps memory usage, although not as much as I hoped: it looks like
the allocation overhead of malloc (and the alignment constraints in
particular) means that while the structure size shrinks, the actual
allocation overhead mostly does not.

[ That said: memory usage is actually down, but not as much as it should
  be: I suspect just one of the object types actually ended up shrinking
  its effective allocation size.

  To get to the next level, we probably need specialized allocators that
  don't pad the allocation more than necessary. ]

The separation makes for some code cleanup, though, and makes the ref
tracking that fsck wants a clearly separate thing.

Signed-off-by: Linus Torvalds &lt;torvalds@osdl.org&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
<entry>
<title>Shrink "struct object" a bit</title>
<updated>2006-06-18T01:49:18Z</updated>
<author>
<name>Linus Torvalds</name>
<email>torvalds@osdl.org</email>
</author>
<published>2006-06-14T23:45:13Z</published>
<link rel='alternate' type='text/html' href='https://git.shady.money/git/commit/?id=885a86abe2e9f7b96a4e2012183c6751635840aa'/>
<id>urn:sha1:885a86abe2e9f7b96a4e2012183c6751635840aa</id>
<content type='text'>
This shrinks "struct object" by a small amount, by getting rid of the
"struct type *" pointer and replacing it with a 3-bit bitfield instead.

In addition, we merge the bitfields and the "flags" field, which
incidentally should also remove a useless 4-byte padding from the object
when in 64-bit mode.

Now, our "struct object" is still too damn large, but it's now less
obviously bloated, and of the remaining fields, only the "util" (which is
not used by most things) is clearly something that should be eventually
discarded.

This shrinks the "git-rev-list --all" memory use by about 2.5% on the
kernel archive (and, perhaps more importantly, on the larger mozilla
archive). That may not sound like much, but I suspect it's more on a
64-bit platform.

There are other remaining inefficiencies (the parent lists, for example,
probably have horrible malloc overhead), but this was pretty obvious.

Most of the patch is just changing the comparison of the "type" pointer
from one of the constant string pointers to the appropriate new TYPE_xxx
small integer constant.

Signed-off-by: Linus Torvalds &lt;torvalds@osdl.org&gt;
Signed-off-by: Junio C Hamano &lt;junkio@cox.net&gt;
</content>
</entry>
</feed>
