parallel-checkout: support progress displaying
Original-patch-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7531e4b66e
commit
1c4d6f46be
@ -3,6 +3,7 @@
|
|||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
#include "parallel-checkout.h"
|
#include "parallel-checkout.h"
|
||||||
#include "pkt-line.h"
|
#include "pkt-line.h"
|
||||||
|
#include "progress.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
#include "sigchain.h"
|
#include "sigchain.h"
|
||||||
#include "streaming.h"
|
#include "streaming.h"
|
||||||
@ -17,6 +18,8 @@ struct parallel_checkout {
|
|||||||
enum pc_status status;
|
enum pc_status status;
|
||||||
struct parallel_checkout_item *items; /* The parallel checkout queue. */
|
struct parallel_checkout_item *items; /* The parallel checkout queue. */
|
||||||
size_t nr, alloc;
|
size_t nr, alloc;
|
||||||
|
struct progress *progress;
|
||||||
|
unsigned int *progress_cnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct parallel_checkout parallel_checkout;
|
static struct parallel_checkout parallel_checkout;
|
||||||
@ -146,6 +149,20 @@ int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t pc_queue_size(void)
|
||||||
|
{
|
||||||
|
return parallel_checkout.nr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void advance_progress_meter(void)
|
||||||
|
{
|
||||||
|
if (parallel_checkout.progress) {
|
||||||
|
(*parallel_checkout.progress_cnt)++;
|
||||||
|
display_progress(parallel_checkout.progress,
|
||||||
|
*parallel_checkout.progress_cnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int handle_results(struct checkout *state)
|
static int handle_results(struct checkout *state)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -194,6 +211,7 @@ static int handle_results(struct checkout *state)
|
|||||||
*/
|
*/
|
||||||
ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
|
ret |= checkout_entry_ca(pc_item->ce, &pc_item->ca,
|
||||||
state, NULL, NULL);
|
state, NULL, NULL);
|
||||||
|
advance_progress_meter();
|
||||||
break;
|
break;
|
||||||
case PC_ITEM_PENDING:
|
case PC_ITEM_PENDING:
|
||||||
have_pending = 1;
|
have_pending = 1;
|
||||||
@ -534,6 +552,9 @@ static void parse_and_save_result(const char *buffer, int len,
|
|||||||
pc_item->status = res->status;
|
pc_item->status = res->status;
|
||||||
if (st)
|
if (st)
|
||||||
pc_item->st = *st;
|
pc_item->st = *st;
|
||||||
|
|
||||||
|
if (res->status != PC_ITEM_COLLIDED)
|
||||||
|
advance_progress_meter();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gather_results_from_workers(struct pc_worker *workers,
|
static void gather_results_from_workers(struct pc_worker *workers,
|
||||||
@ -596,11 +617,16 @@ static void write_items_sequentially(struct checkout *state)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
for (i = 0; i < parallel_checkout.nr; i++)
|
for (i = 0; i < parallel_checkout.nr; i++) {
|
||||||
write_pc_item(¶llel_checkout.items[i], state);
|
struct parallel_checkout_item *pc_item = ¶llel_checkout.items[i];
|
||||||
|
write_pc_item(pc_item, state);
|
||||||
|
if (pc_item->status != PC_ITEM_COLLIDED)
|
||||||
|
advance_progress_meter();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int run_parallel_checkout(struct checkout *state, int num_workers, int threshold)
|
int run_parallel_checkout(struct checkout *state, int num_workers, int threshold,
|
||||||
|
struct progress *progress, unsigned int *progress_cnt)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -608,6 +634,8 @@ int run_parallel_checkout(struct checkout *state, int num_workers, int threshold
|
|||||||
BUG("cannot run parallel checkout: uninitialized or already running");
|
BUG("cannot run parallel checkout: uninitialized or already running");
|
||||||
|
|
||||||
parallel_checkout.status = PC_RUNNING;
|
parallel_checkout.status = PC_RUNNING;
|
||||||
|
parallel_checkout.progress = progress;
|
||||||
|
parallel_checkout.progress_cnt = progress_cnt;
|
||||||
|
|
||||||
if (parallel_checkout.nr < num_workers)
|
if (parallel_checkout.nr < num_workers)
|
||||||
num_workers = parallel_checkout.nr;
|
num_workers = parallel_checkout.nr;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
struct cache_entry;
|
struct cache_entry;
|
||||||
struct checkout;
|
struct checkout;
|
||||||
|
struct progress;
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* Users of parallel checkout
|
* Users of parallel checkout
|
||||||
@ -31,13 +32,15 @@ void init_parallel_checkout(void);
|
|||||||
* for later write and return 0.
|
* for later write and return 0.
|
||||||
*/
|
*/
|
||||||
int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
|
int enqueue_checkout(struct cache_entry *ce, struct conv_attrs *ca);
|
||||||
|
size_t pc_queue_size(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write all the queued entries, returning 0 on success. If the number of
|
* Write all the queued entries, returning 0 on success. If the number of
|
||||||
* entries is smaller than the specified threshold, the operation is performed
|
* entries is smaller than the specified threshold, the operation is performed
|
||||||
* sequentially.
|
* sequentially.
|
||||||
*/
|
*/
|
||||||
int run_parallel_checkout(struct checkout *state, int num_workers, int threshold);
|
int run_parallel_checkout(struct checkout *state, int num_workers, int threshold,
|
||||||
|
struct progress *progress, unsigned int *progress_cnt);
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
* Interface with checkout--worker
|
* Interface with checkout--worker
|
||||||
|
@ -474,17 +474,22 @@ static int check_updates(struct unpack_trees_options *o,
|
|||||||
struct cache_entry *ce = index->cache[i];
|
struct cache_entry *ce = index->cache[i];
|
||||||
|
|
||||||
if (ce->ce_flags & CE_UPDATE) {
|
if (ce->ce_flags & CE_UPDATE) {
|
||||||
|
size_t last_pc_queue_size = pc_queue_size();
|
||||||
|
|
||||||
if (ce->ce_flags & CE_WT_REMOVE)
|
if (ce->ce_flags & CE_WT_REMOVE)
|
||||||
BUG("both update and delete flags are set on %s",
|
BUG("both update and delete flags are set on %s",
|
||||||
ce->name);
|
ce->name);
|
||||||
display_progress(progress, ++cnt);
|
|
||||||
ce->ce_flags &= ~CE_UPDATE;
|
ce->ce_flags &= ~CE_UPDATE;
|
||||||
errs |= checkout_entry(ce, &state, NULL, NULL);
|
errs |= checkout_entry(ce, &state, NULL, NULL);
|
||||||
|
|
||||||
|
if (last_pc_queue_size == pc_queue_size())
|
||||||
|
display_progress(progress, ++cnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stop_progress(&progress);
|
|
||||||
if (pc_workers > 1)
|
if (pc_workers > 1)
|
||||||
errs |= run_parallel_checkout(&state, pc_workers, pc_threshold);
|
errs |= run_parallel_checkout(&state, pc_workers, pc_threshold,
|
||||||
|
progress, &cnt);
|
||||||
|
stop_progress(&progress);
|
||||||
errs |= finish_delayed_checkout(&state, NULL);
|
errs |= finish_delayed_checkout(&state, NULL);
|
||||||
git_attr_set_direction(GIT_ATTR_CHECKIN);
|
git_attr_set_direction(GIT_ATTR_CHECKIN);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user