Commit af7689ea2489b2e92d46086a689ec074dd0854f5

Vicent Martí 2013-05-02T09:50:34

Merge pull request #1535 from carlosmn/pack-threading Switch to index_version as "git_pack_file is ready" flag

diff --git a/src/pack.c b/src/pack.c
index 1ffad29..417d225 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -293,8 +293,8 @@ static int pack_index_check(const char *path, struct git_pack_file *p)
 		}
 	}
 
-	p->index_version = version;
 	p->num_objects = nr;
+	p->index_version = version;
 	return 0;
 }
 
@@ -304,7 +304,7 @@ static int pack_index_open(struct git_pack_file *p)
 	int error = 0;
 	size_t name_len, base_len;
 
-	if (p->index_map.data)
+	if (p->index_version > -1)
 		return 0;
 
 	name_len = strlen(p->pack_name);
@@ -320,7 +320,7 @@ static int pack_index_open(struct git_pack_file *p)
 	if ((error = git_mutex_lock(&p->lock)) < 0)
 		return error;
 
-	if (!p->index_map.data)
+	if (p->index_version == -1)
 		error = pack_index_check(idx_name, p);
 
 	git__free(idx_name);
@@ -826,7 +826,7 @@ static int packfile_open(struct git_pack_file *p)
 	git_oid sha1;
 	unsigned char *idx_sha1;
 
-	if (!p->index_map.data && pack_index_open(p) < 0)
+	if (p->index_version == -1 && pack_index_open(p) < 0)
 		return git_odb__error_notfound("failed to open packfile", NULL);
 
 	/* if mwf opened by another thread, return now */
@@ -942,6 +942,7 @@ int git_packfile_alloc(struct git_pack_file **pack_out, const char *path)
 	p->mwf.size = st.st_size;
 	p->pack_local = 1;
 	p->mtime = (git_time_t)st.st_mtime;
+	p->index_version = -1;
 
 	git_mutex_init(&p->lock);
 
@@ -1050,24 +1051,24 @@ static int pack_entry_find_offset(
 	const git_oid *short_oid,
 	size_t len)
 {
-	const uint32_t *level1_ofs;
-	const unsigned char *index;
+	const uint32_t *level1_ofs = p->index_map.data;
+	const unsigned char *index = p->index_map.data;
 	unsigned hi, lo, stride;
 	int pos, found = 0;
 	const unsigned char *current = 0;
 
 	*offset_out = 0;
 
-	if (!p->index_map.data && pack_index_open(p) < 0)
-		return git_odb__error_notfound("failed to open packfile", NULL);
-
-	if (git_mutex_lock(&p->lock) < 0)
-		return packfile_error("failed to get lock for finding entry offset");
+	if (p->index_version == -1) {
+		int error;
 
-	assert(p->index_map.data);
+		if ((error = pack_index_open(p)) < 0)
+			return error;
+		assert(p->index_map.data);
 
-	index = p->index_map.data;
-	level1_ofs = p->index_map.data;
+		index = p->index_map.data;
+		level1_ofs = p->index_map.data;
+	}
 
 	if (p->index_version > 1) {
 		level1_ofs += 2;
@@ -1093,8 +1094,6 @@ static int pack_entry_find_offset(
 	/* Use git.git lookup code */
 	pos = sha1_entry_pos(index, stride, 0, lo, hi, p->num_objects, short_oid->id);
 
-	git_mutex_unlock(&p->lock);
-
 	if (pos >= 0) {
 		/* An object matching exactly the oid was found */
 		found = 1;