revindex: export new APIs

Allow users to efficiently lookup consecutive entries that are expected to be found on the same revindex by exporting `find_revindex_position`: this function takes a pointer to revindex itself, instead of looking up the proper revindex for a given packfile on each call. Signed-off-by: Vicent Marti <tanoku@gmail.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Vicent Marti committed Oct 24, 2013 at 14:00 UTC 92e5c77c3791567e299cc858a7ddfed410e2cec5
2 files changed +33 -13
pack-revindex.c
+25 -13
@@ -16,11 +16,6 @@
16 * get the object sha1 from the main index.
17 */
18
19 -struct pack_revindex {
20 - struct packed_git *p;
21 - struct revindex_entry *revindex;
22 -};
23 -
19 static struct pack_revindex *pack_revindex;
20 static int pack_revindex_hashsz;
21
@@ -201,15 +196,14 @@ static void create_pack_revindex(struct pack_revindex *rix)
196 sort_revindex(rix->revindex, num_ent, p->pack_size);
197 }
198
204 -struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
199 +struct pack_revindex *revindex_for_pack(struct packed_git *p)
200 {
201 int num;
207 - unsigned lo, hi;
202 struct pack_revindex *rix;
209 - struct revindex_entry *revindex;
203
204 if (!pack_revindex_hashsz)
205 init_pack_revindex();
206 +
207 num = pack_revindex_ix(p);
208 if (num < 0)
209 die("internal error: pack revindex fubar");
@@ -217,21 +211,39 @@ struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
211 rix = &pack_revindex[num];
212 if (!rix->revindex)
213 create_pack_revindex(rix);
220 - revindex = rix->revindex;
214
222 - lo = 0;
223 - hi = p->num_objects + 1;
215 + return rix;
216 +}
217 +
218 +int find_revindex_position(struct pack_revindex *pridx, off_t ofs)
219 +{
220 + int lo = 0;
221 + int hi = pridx->p->num_objects + 1;
222 + struct revindex_entry *revindex = pridx->revindex;
223 +
224 do {
225 unsigned mi = lo + (hi - lo) / 2;
226 if (revindex[mi].offset == ofs) {
227 - return revindex + mi;
227 + return mi;
228 } else if (ofs < revindex[mi].offset)
229 hi = mi;
230 else
231 lo = mi + 1;
232 } while (lo < hi);
233 +
234 error("bad offset for revindex");
234 - return NULL;
235 + return -1;
236 +}
237 +
238 +struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
239 +{
240 + struct pack_revindex *pridx = revindex_for_pack(p);
241 + int pos = find_revindex_position(pridx, ofs);
242 +
243 + if (pos < 0)
244 + return NULL;
245 +
246 + return pridx->revindex + pos;
247 }
248
249 void discard_revindex(void)
pack-revindex.h
+8
@@ -6,6 +6,14 @@ struct revindex_entry {
6 unsigned int nr;
7 };
8
9 +struct pack_revindex {
10 + struct packed_git *p;
11 + struct revindex_entry *revindex;
12 +};
13 +
14 +struct pack_revindex *revindex_for_pack(struct packed_git *p);
15 +int find_revindex_position(struct pack_revindex *pridx, off_t ofs);
16 +
17 struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs);
18 void discard_revindex(void);
19