summaryrefslogtreecommitdiff
path: root/src/odb_pack.c
diff options
context:
space:
mode:
authorBen Straub <bs@github.com>2012-09-19 04:55:16 -0700
committerBen Straub <bs@github.com>2012-09-19 04:55:16 -0700
commit63409451860749cfe1efbb509fbe8c5a0a1648a0 (patch)
tree97a8f445c7a53460418eb80ddc307a65f787a8f4 /src/odb_pack.c
parent78216495b0aaca66dc76ae33516a679385495c6a (diff)
downloadlibgit2-63409451860749cfe1efbb509fbe8c5a0a1648a0.tar.gz
ODB pack: snapshot last_found to avoid race
Also removed unnecessary refresh call and fixed some indentation.
Diffstat (limited to 'src/odb_pack.c')
-rw-r--r--src/odb_pack.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/odb_pack.c b/src/odb_pack.c
index 50949bc6b..964e82afb 100644
--- a/src/odb_pack.c
+++ b/src/odb_pack.c
@@ -259,12 +259,13 @@ static int packfile_refresh_all(struct pack_backend *backend)
return 0;
}
-static int pack_entry_find_inner(struct git_pack_entry *e,
- struct pack_backend *backend,
- const git_oid *oid)
+static int pack_entry_find_inner(
+ struct git_pack_entry *e,
+ struct pack_backend *backend,
+ const git_oid *oid,
+ struct git_pack_file *last_found)
{
unsigned int i;
- struct git_pack_file *last_found = backend->last_found;
if (last_found &&
git_pack_entry_find(e, last_found, oid, GIT_OID_HEXSZ) == 0)
@@ -289,33 +290,32 @@ static int pack_entry_find_inner(struct git_pack_entry *e,
static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backend, const git_oid *oid)
{
int error;
+ struct git_pack_file *last_found = backend->last_found;
if (backend->last_found &&
git_pack_entry_find(e, backend->last_found, oid, GIT_OID_HEXSZ) == 0)
return 0;
- if (!pack_entry_find_inner(e, backend, oid))
+ if (!pack_entry_find_inner(e, backend, oid, last_found))
return 0;
if ((error = packfile_refresh_all(backend)) < 0)
return error;
- if (!pack_entry_find_inner(e, backend, oid))
+ if (!pack_entry_find_inner(e, backend, oid, last_found))
return 0;
return git_odb__error_notfound("failed to find pack entry", oid);
}
-static unsigned pack_entry_find_prefix_inner(struct git_pack_entry *e,
- struct pack_backend *backend,
- const git_oid *short_oid,
- size_t len)
+static unsigned pack_entry_find_prefix_inner(
+ struct git_pack_entry *e,
+ struct pack_backend *backend,
+ const git_oid *short_oid,
+ size_t len,
+ struct git_pack_file *last_found)
{
int error;
unsigned int i;
unsigned found = 0;
- struct git_pack_file *last_found = backend->last_found;
-
- if ((error = packfile_refresh_all(backend)) < 0)
- return error;
if (last_found) {
error = git_pack_entry_find(e, last_found, short_oid, len);
@@ -353,12 +353,13 @@ static int pack_entry_find_prefix(
{
unsigned found = 0;
int error;
+ struct git_pack_file *last_found = backend->last_found;
- if ((found = pack_entry_find_prefix_inner(e, backend, short_oid, len)) > 0)
+ if ((found = pack_entry_find_prefix_inner(e, backend, short_oid, len, last_found)) > 0)
goto cleanup;
if ((error = packfile_refresh_all(backend)) < 0)
return error;
- found = pack_entry_find_prefix_inner(e, backend, short_oid, len);
+ found = pack_entry_find_prefix_inner(e, backend, short_oid, len, last_found);
cleanup:
if (!found)