commit - ff563a3de3ff9931c2702516c74c8aea8d5cf142
commit + 704b89c4330d9641c93302516a59957a847736c1
blob - 3952d83a577c5510f0af5c58e08788892c81184c
blob + 7147a9755c2e0788c9ee549a1d956e32fe1c80b9
--- libexec/got-read-pack/got-read-pack.c
+++ libexec/got-read-pack/got-read-pack.c
}
static const struct got_error *
+open_object(struct got_object **obj, struct got_pack *pack,
+ struct got_packidx *packidx, int idx, struct got_object_id *id,
+ struct got_object_cache *objcache)
+{
+ const struct got_error *err;
+
+ err = got_packfile_open_object(obj, pack, packidx, idx, id);
+ if (err)
+ return err;
+ (*obj)->refcnt++;
+
+ err = got_object_cache_add(objcache, id, *obj);
+ if (err)
+ return err;
+ (*obj)->refcnt++;
+
+ return NULL;
+}
+
+static const struct got_error *
object_request(struct imsg *imsg, struct imsgbuf *ibuf, struct got_pack *pack,
struct got_packidx *packidx, struct got_object_cache *objcache)
{
memcpy(&iobj, imsg->data, sizeof(iobj));
memcpy(id.sha1, iobj.id, SHA1_DIGEST_LENGTH);
- err = got_packfile_open_object(&obj, pack, packidx, iobj.idx, &id);
- if (err)
- return err;
- obj->refcnt++;
+ obj = got_object_cache_get(objcache, &id);
+ if (obj) {
+ obj->refcnt++;
+ } else {
+ err = open_object(&obj, pack, packidx, iobj.idx, &id,
+ objcache);
+ if (err)
+ goto done;
+ }
- err = got_object_cache_add(objcache, &obj->id, obj);
- if (err)
- goto done;
- obj->refcnt++;
-
err = got_privsep_send_obj(ibuf, obj);
done:
got_object_close(obj);
memcpy(&iobj, imsg->data, sizeof(iobj));
memcpy(id.sha1, iobj.id, SHA1_DIGEST_LENGTH);
- err = got_packfile_open_object(&obj, pack, packidx, iobj.idx, &id);
- if (err)
- return err;
+ obj = got_object_cache_get(objcache, &id);
+ if (obj) {
+ obj->refcnt++;
+ } else {
+ err = open_object(&obj, pack, packidx, iobj.idx, &id,
+ objcache);
+ if (err)
+ return err;
+ }
err = got_packfile_extract_object_to_mem(&buf, &len, obj, pack);
if (err)
memcpy(&iobj, imsg->data, sizeof(iobj));
memcpy(id.sha1, iobj.id, SHA1_DIGEST_LENGTH);
- err = got_packfile_open_object(&obj, pack, packidx, iobj.idx, &id);
- if (err)
- return err;
+ obj = got_object_cache_get(objcache, &id);
+ if (obj) {
+ obj->refcnt++;
+ } else {
+ err = open_object(&obj, pack, packidx, iobj.idx, &id,
+ objcache);
+ if (err)
+ return err;
+ }
err = got_packfile_extract_object_to_mem(&buf, &len, obj, pack);
if (err)
memcpy(&iobj, imsg->data, sizeof(iobj));
memcpy(id.sha1, iobj.id, SHA1_DIGEST_LENGTH);
- err = got_packfile_open_object(&obj, pack, packidx, iobj.idx, &id);
- if (err)
- return err;
+ obj = got_object_cache_get(objcache, &id);
+ if (obj) {
+ obj->refcnt++;
+ } else {
+ err = open_object(&obj, pack, packidx, iobj.idx, &id,
+ objcache);
+ if (err)
+ return err;
+ }
err = receive_file(&outfile, ibuf, GOT_IMSG_BLOB_OUTFD);
if (err)
memcpy(&iobj, imsg->data, sizeof(iobj));
memcpy(id.sha1, iobj.id, SHA1_DIGEST_LENGTH);
- err = got_packfile_open_object(&obj, pack, packidx, iobj.idx, &id);
- if (err)
- return err;
+ obj = got_object_cache_get(objcache, &id);
+ if (obj) {
+ obj->refcnt++;
+ } else {
+ err = open_object(&obj, pack, packidx, iobj.idx, &id,
+ objcache);
+ if (err)
+ return err;
+ }
err = got_packfile_extract_object_to_mem(&buf, &len, obj, pack);
if (err)