Commit 4df53a64 by Vicent Marti

Merge pull request #2335 from libgit2/cmn/indexer-vector-handling

indexer: avoid memory moves
parents 5ebe18b7 2dde1e0c
...@@ -717,6 +717,9 @@ static int fix_thin_pack(git_indexer *idx, git_transfer_progress *stats) ...@@ -717,6 +717,9 @@ static int fix_thin_pack(git_indexer *idx, git_transfer_progress *stats)
/* Loop until we find the first REF delta */ /* Loop until we find the first REF delta */
git_vector_foreach(&idx->deltas, i, delta) { git_vector_foreach(&idx->deltas, i, delta) {
if (!delta)
continue;
curpos = delta->delta_off; curpos = delta->delta_off;
error = git_packfile_unpack_header(&size, &type, &idx->pack->mwf, &w, &curpos); error = git_packfile_unpack_header(&size, &type, &idx->pack->mwf, &w, &curpos);
git_mwindow_close(&w); git_mwindow_close(&w);
...@@ -756,13 +759,18 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats) ...@@ -756,13 +759,18 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats)
{ {
unsigned int i; unsigned int i;
struct delta_info *delta; struct delta_info *delta;
int progressed = 0, progress_cb_result; int progressed = 0, non_null = 0, progress_cb_result;
while (idx->deltas.length > 0) { while (idx->deltas.length > 0) {
progressed = 0; progressed = 0;
non_null = 0;
git_vector_foreach(&idx->deltas, i, delta) { git_vector_foreach(&idx->deltas, i, delta) {
git_rawobj obj; git_rawobj obj;
if (!delta)
continue;
non_null = 1;
idx->off = delta->delta_off; idx->off = delta->delta_off;
if (git_packfile_unpack(&obj, idx->pack, &idx->off) < 0) if (git_packfile_unpack(&obj, idx->pack, &idx->off) < 0)
continue; continue;
...@@ -777,16 +785,15 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats) ...@@ -777,16 +785,15 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats)
if ((progress_cb_result = do_progress_callback(idx, stats)) < 0) if ((progress_cb_result = do_progress_callback(idx, stats)) < 0)
return progress_cb_result; return progress_cb_result;
/* /* remove from the list */
* Remove this delta from the list and git_vector_set(NULL, &idx->deltas, i, NULL);
* decrease i so we don't skip over the next
* delta.
*/
git_vector_remove(&idx->deltas, i);
git__free(delta); git__free(delta);
i--;
} }
/* if none were actually set, we're done */
if (!non_null)
break;
if (!progressed && (fix_thin_pack(idx, stats) < 0)) { if (!progressed && (fix_thin_pack(idx, stats) < 0)) {
giterr_set(GITERR_INDEXER, "missing delta bases"); giterr_set(GITERR_INDEXER, "missing delta bases");
return -1; return -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment