commit - 5df4932d8e7905f8e04dbf16e3879da18a091cec
commit + d83eb5cd1cc329e58e94aa0b17aa348f4df65734
blob - 79206665203625b474ebdbb75bc88916a1593301
blob + 20d9f5cca727758161b7d4f73321ba3f1b271e88
--- lib/got_lib_object_idcache.h
+++ lib/got_lib_object_idcache.h
const struct got_error *got_object_idcache_add(struct got_object_idcache *,
struct got_object_id *, void *);
void *got_object_idcache_get(struct got_object_idcache *, struct got_object_id *);
-const struct got_error *got_object_idcache_remove_least_used(void **,
- struct got_object_idcache *);
+const struct got_error *got_object_idcache_remove_one(void **,
+ struct got_object_idcache *, struct got_object_id *);
int got_object_idcache_contains(struct got_object_idcache *,
struct got_object_id *);
void got_object_idcache_for_each(struct got_object_idcache *,
blob - 7957b39b0d062a400041ff34791a06d38d694832
blob + f4766bb8930bb4f090f7673b33c60c3aed5a0ff0
--- lib/object_cache.c
+++ lib/object_cache.c
nelem = got_object_idcache_num_elements(cache->idcache);
if (nelem >= cache->size) {
- err = got_object_idcache_remove_least_used((void **)&ce,
- cache->idcache);
+ err = got_object_idcache_remove_one((void **)&ce,
+ cache->idcache, id);
if (err)
return err;
switch (cache->type) {
blob - 763294310f44316f6e4616536eae3bc35e3f70d0
blob + 3206b9e9b4efd15c8f08b21fc609d788c1a658ea
--- lib/object_idcache.c
+++ lib/object_idcache.c
}
const struct got_error *
-got_object_idcache_remove_least_used(void **data, struct got_object_idcache *cache)
+got_object_idcache_remove_one(void **data, struct got_object_idcache *cache,
+ struct got_object_id *id)
{
struct got_object_idcache_element *entry;
- int i, idx = 0, maxelem = cache->nelem[0];
+ uint8_t idx = id->sha1[0];
if (data)
*data = NULL;
if (cache->totelem == 0)
return got_error(GOT_ERR_NO_OBJ);
- /* Remove least used element from longest list. */
- for (i = 0; i < nitems(cache->entries); i++) {
- if (maxelem < cache->nelem[i]) {
- idx = i;
- maxelem = cache->nelem[i];
+ if (cache->nelem[idx] == 0) {
+ /* Remove an element from the longest list. */
+ int i, maxelem = cache->nelem[0];
+ idx = 0;
+ for (i = 0; i < nitems(cache->entries); i++) {
+ if (maxelem < cache->nelem[i]) {
+ idx = i;
+ maxelem = cache->nelem[i];
+ }
}
}
+
entry = TAILQ_LAST(&cache->entries[idx], got_object_idcache_head);
TAILQ_REMOVE(&cache->entries[idx], entry, entry);
if (data)