commit - f7e127f30cad9649e5db1fb673001810def7c3d5
commit + e1ad6ebcf6e7b7a707020aa0829c05a16e8a24a4
blob - 61b5c9df2c64806f9e005f5d22b41bb3e6888f72
blob + 0cea059d4070e73bec61397b7463e60ca1cf8a40
--- lib/got_pack_lib.h
+++ lib/got_pack_lib.h
#define GOT_DELTA_CACHE_SIZE 1024
struct got_delta_cache {
- char *path_packfile;
+ int nentries;
struct got_delta_cache_entry deltas[GOT_DELTA_CACHE_SIZE];
};
blob - cdb886371c7622edfa24b52b72cbc2dfab99d7c2
blob + 4975158ecf8a6b5d094fba6b824c1375df001d71
--- lib/pack.c
+++ lib/pack.c
got_pack_close(struct got_pack *pack)
{
const struct got_error *err = NULL;
- struct got_delta_cache *cache = &pack->delta_cache;
int i;
while (!TAILQ_EMPTY(&pack->mappings)) {
pack->filesize = 0;
}
- free(cache->path_packfile);
- cache->path_packfile = NULL;
- for (i = 0; i < nitems(cache->deltas); i++) {
- struct got_delta_cache_entry *entry = &cache->deltas[i];
- if (entry->data_offset == 0)
- break;
+ for (i = 0; i < pack->delta_cache.nentries; i++) {
+ struct got_delta_cache_entry *entry;
+ entry = &pack->delta_cache.deltas[i];
entry->data_offset = 0;
free(entry->delta_buf);
entry->delta_buf = NULL;
entry->delta_len = 0;
}
+ pack->delta_cache.nentries = 0;
return err;
}
}
const struct got_error *
-add_delta_cache_entry(struct got_delta_cache *cache, off_t data_offset,
- uint8_t *delta_buf, size_t delta_len)
+cache_delta(off_t data_offset, uint8_t *delta_buf, size_t delta_len,
+ struct got_pack *pack)
{
int i;
+ struct got_delta_cache *cache = &pack->delta_cache;
struct got_delta_cache_entry *entry;
- for (i = 0; i < nitems(cache->deltas); i++) {
- entry = &cache->deltas[i];
- if (entry->data_offset == 0)
- break;
- }
-
- if (i == nitems(cache->deltas)) {
- entry = &cache->deltas[i - 1];
+ if (cache->nentries == nitems(cache->deltas)) {
+ entry = &cache->deltas[cache->nentries - 1];
clear_delta_cache_entry(entry);
+ cache->nentries--;
memmove(&cache->deltas[1], &cache->deltas[0],
sizeof(cache->deltas) - sizeof(cache->deltas[0]));
i = 0;
- }
+ } else
+ i = cache->nentries;
entry = &cache->deltas[i];
entry->data_offset = data_offset;
entry->delta_buf = delta_buf;
entry->delta_len = delta_len;
+ cache->nentries++;
return NULL;
}
-const struct got_error *
-cache_delta(off_t data_offset, uint8_t *delta_buf, size_t delta_len,
- struct got_pack *pack)
-{
- return add_delta_cache_entry(&pack->delta_cache, data_offset,
- delta_buf, delta_len);
-}
-
void
get_cached_delta(uint8_t **delta_buf, size_t *delta_len, off_t data_offset,
struct got_pack *pack)