commit - a2965dbecb29aa632bfb7346d3f970ae1545dde3
commit + 50bc349d7794337cf8810482840482511e013a0d
blob - b6db6c4cf6bcf528729664f7257826ed6a72156c
blob + 969dcdf4312f278586f048c6fca9172a54d4e5e1
--- lib/got_lib_repository.h
+++ lib/got_lib_repository.h
/* Open file handles for pack files. */
struct got_pack packs[GOT_PACK_CACHE_SIZE];
- SIMPLEQ_HEAD(, got_objcache_entry) objcache;
+ struct got_object_idset *objcache;
int ncached;
int cache_hit;
int cache_miss;
blob - 4b82bfc8dee6c770f92a5844aaa072c4bd77a9aa
blob + 28df53bafa09c4b36087e5de8cae9d29844edf5c
--- lib/repository.c
+++ lib/repository.c
#include "got_lib_pack.h"
#include "got_lib_repository.h"
#include "got_lib_worktree.h"
+#include "got_lib_object_idset.h"
#ifndef nitems
#define nitems(_a) (sizeof(_a) / sizeof((_a)[0]))
}
-const struct got_error*
+const struct got_error *
got_repo_cache_object(struct got_repository *repo, struct got_object_id *id,
struct got_object *obj)
{
+ const struct got_error *err = NULL;
struct got_objcache_entry *ce;
if (repo->ncached >= GOT_OBJECT_CACHE_SIZE) {
- ce = SIMPLEQ_FIRST(&repo->objcache);
- SIMPLEQ_REMOVE_HEAD(&repo->objcache, entry);
+ err = got_object_idset_remove_random((void **)&ce,
+ repo->objcache);
+ if (err)
+ return err;
got_object_close(ce->obj);
free(ce);
repo->ncached--;
return got_error_from_errno();
memcpy(&ce->id, id, sizeof(ce->id));
ce->obj = obj;
- obj->refcnt++;
- SIMPLEQ_INSERT_HEAD(&repo->objcache, ce, entry);
- repo->ncached++;
- return NULL;
+ err = got_object_idset_add(NULL, repo->objcache, id, ce);
+ if (err) {
+ if (err->code == GOT_ERR_OBJ_EXISTS) {
+ free(ce);
+ err = NULL;
+ }
+ } else {
+ obj->refcnt++;
+ repo->ncached++;
+ }
+
+ return err;
}
struct got_object *
{
struct got_objcache_entry *ce;
- SIMPLEQ_FOREACH(ce, &repo->objcache, entry) {
- if (got_object_id_cmp(&ce->id, id) != 0)
- continue;
+ ce = got_object_idset_get(repo->objcache, id);
+ if (ce) {
repo->cache_hit++;
return ce->obj;
}
goto done;
}
+ repo->objcache = got_object_idset_alloc();
+ if (repo->objcache == NULL) {
+ err = got_error_from_errno();
+ goto done;
+ }
+
repo->path = got_path_normalize(abspath);
if (repo->path == NULL) {
err = got_error(GOT_ERR_BAD_PATH);
got_pack_close(&repo->packs[i]);
}
- while (!SIMPLEQ_EMPTY(&repo->objcache)) {
- struct got_objcache_entry *ce;
- ce = SIMPLEQ_FIRST(&repo->objcache);
- SIMPLEQ_REMOVE_HEAD(&repo->objcache, entry);
- got_object_close(ce->obj);
- free(ce);
- }
-
free(repo->path);
free(repo->path_git_dir);
+ if (repo->objcache)
+ got_object_idset_free(repo->objcache);
free(repo);
}
blob - 35a2c48dd780532592d387e60fde43f989958b1f
blob + cc88d708abda2769b4f800637914f7387beef06e
--- regress/idset/idset_test.c
+++ regress/idset/idset_test.c
goto done;
}
- err = got_object_idset_remove(set, &id2);
+ err = got_object_idset_remove(NULL, set, &id2);
if (err)
goto done;
if (got_object_idset_num_elements(set) != 2) {
blob - 18bd5277937e56ca6c47c5538db76068e10d5685
blob + f8b2b59598ba8b5bcd3cd5ba387f87af186e03d2
--- regress/repository/Makefile
+++ regress/repository/Makefile
.PATH:${.CURDIR}/../../lib
PROG = repository_test
-SRCS = path.c repository.c error.c reference.c object.c opentemp.c \
- sha1.c diff.c diffreg.c pack.c privsep.c delta.c fileindex.c \
- worktree.c zbuf.c repository_test.c
+SRCS = path.c repository.c error.c reference.c object.c object_idset.c \
+ opentemp.c sha1.c diff.c diffreg.c pack.c privsep.c delta.c \
+ fileindex.c worktree.c zbuf.c repository_test.c
CPPFLAGS = -I${.CURDIR}/../../include -I${.CURDIR}/../../lib
LDADD = -lutil -lz
blob - bdce9e6ef00763c45f688ceec5563b895cf56dd6
blob + 90487491477b18e37724fd9a9abd505fb267ecf5
--- regress/worktree/Makefile
+++ regress/worktree/Makefile
.PATH:${.CURDIR}/../../lib
PROG = worktree_test
-SRCS = worktree.c repository.c object.c opentemp.c path.c error.c \
- reference.c sha1.c pack.c privsep.c delta.c zbuf.c \
+SRCS = worktree.c repository.c object.c object_idset.c opentemp.c path.c \
+ error.c reference.c sha1.c pack.c privsep.c delta.c zbuf.c \
fileindex.c worktree_test.c
CPPFLAGS = -I${.CURDIR}/../../include -I${.CURDIR}/../../lib