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