[Pdbg] [PATCH] libpdbg: progress bars!
Amitay Isaacs
amitay at ozlabs.org
Fri May 11 16:53:58 AEST 2018
On Thu, 2018-05-10 at 16:58 +0930, Joel Stanley wrote:
> $ pdbg -p 0 getmem 0x8040278 100 > /tmp/log
> [==================================================] 100%
>
> Signed-off-by: Joel Stanley <joel at jms.id.au>
This probably belongs to the pdbg tool and not the library. In that
case we may need a polling interface to library functions to find out
the progress. :-(
Or, we can register callbacks for progress_tick from pdbg tool and emit
progress_tick from various long operations in the library.
> ---
> Makefile.am | 1 +
> libpdbg/adu.c | 6 +++
> libpdbg/progress.c | 99
> ++++++++++++++++++++++++++++++++++++++++++++++
> libpdbg/progress.h | 24 +++++++++++
> 4 files changed, 130 insertions(+)
> create mode 100644 libpdbg/progress.c
> create mode 100644 libpdbg/progress.h
>
> diff --git a/Makefile.am b/Makefile.am
> index c6668d8e8038..ae8929bdd510 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -52,6 +52,7 @@ libpdbg_la_SOURCES = \
> libpdbg/adu.c \
> libpdbg/device.c \
> libpdbg/target.c \
> + libpdbg/progress.c \
> libpdbg/htm.c
>
> M4_V = $(M4_V_$(V))
> diff --git a/libpdbg/adu.c b/libpdbg/adu.c
> index 2a0b8d5f0020..a97d250a9245 100644
> --- a/libpdbg/adu.c
> +++ b/libpdbg/adu.c
> @@ -20,6 +20,7 @@
>
> #include "operations.h"
> #include "bitutils.h"
> +#include "progress.h"
>
> /* P8 ADU SCOM Register Definitions */
> #define P8_ALTD_CONTROL_REG 0x0
> @@ -88,6 +89,8 @@ int adu_getmem(struct pdbg_target *adu_target,
> uint64_t start_addr, uint8_t *out
> assert(!strcmp(adu_target->class, "adu"));
> adu = target_to_adu(adu_target);
>
> + progress_init(size);
> +
> /* We read data in 8-byte aligned chunks */
> for (addr = 8*(start_addr / 8); addr < start_addr + size;
> addr += 8) {
> uint64_t data;
> @@ -107,7 +110,10 @@ int adu_getmem(struct pdbg_target *adu_target,
> uint64_t start_addr, uint8_t *out
> memcpy(output, &data, 8);
> output += 8;
> }
> + progress_tick(addr - start_addr);
> }
> + progress_tick(size);
> + progress_end();
>
> return rc;
> }
> diff --git a/libpdbg/progress.c b/libpdbg/progress.c
> new file mode 100644
> index 000000000000..cf95015444e7
> --- /dev/null
> +++ b/libpdbg/progress.c
> @@ -0,0 +1,99 @@
> +/* Copyright 2018 IBM Corp.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> + * implied.
> + */
> +
> +#include <inttypes.h>
> +#include <limits.h>
> +#include <stdint.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <time.h>
> +
> +#include "progress.h"
> +
> +static uint64_t progress_max;
> +static uint64_t progress_pcent;
> +static uint64_t progress_n_upd;
> +static time_t progress_prevsec;
> +static struct timespec progress_start;
> +
> +#define PROGRESS_CHARS 50
> +
> +void progress_init(uint64_t count)
> +{
> + unsigned int i;
> +
> + progress_max = count;
> + progress_pcent = 0;
> + progress_n_upd = ULONG_MAX;
> + progress_prevsec = ULONG_MAX;
> +
> + fprintf(stderr, "\r[");
> + for (i = 0; i < PROGRESS_CHARS; i++)
> + fprintf(stderr, " ");
> + fprintf(stderr, "] 0%%");
> + fflush(stderr);
> + clock_gettime(CLOCK_MONOTONIC, &progress_start);}
> +
> +void progress_tick(uint64_t cur)
> +{
> + unsigned int i, pos;
> + struct timespec now;
> + uint64_t pcent;
> + double sec;
> +
> + pcent = (cur * 100) / progress_max;
> + if (progress_pcent == pcent && cur < progress_n_upd &&
> + cur < progress_max)
> + return;
> + progress_pcent = pcent;
> + pos = (pcent * PROGRESS_CHARS) / 101;
> + clock_gettime(CLOCK_MONOTONIC, &now);
> +
> + fprintf(stderr, "\r[");
> + for (i = 0; i <= pos; i++)
> + fprintf(stderr, "=");
> + for (; i < PROGRESS_CHARS; i++)
> + fprintf(stderr, " ");
> + fprintf(stderr, "] %" PRIu64 "%%", pcent);
> +
> + sec = difftime(now.tv_sec, progress_start.tv_sec);
> + if (sec >= 5 && pcent > 0) {
> + uint64_t persec = cur / sec;
> + uint64_t rem_sec;
> +
> + if (!persec)
> + persec = 1;
> + progress_n_upd = cur + persec;
> + rem_sec = ((sec * 100) + (pcent / 2)) / pcent - sec;
> + if (rem_sec > progress_prevsec)
> + rem_sec = progress_prevsec;
> + progress_prevsec = rem_sec;
> + if (rem_sec < 60)
> + fprintf(stderr, " ETA:%" PRIu64 "s ",
> rem_sec);
> + else {
> + fprintf(stderr, " ETA:%" PRIu64 ":%02"
> PRIu64 ":%02" PRIu64 " ",
> + rem_sec / 3600,
> + (rem_sec / 60) % 60,
> + rem_sec % 60);
> + }
> + }
> +
> + fflush(stderr);
> +}
> +
> +void progress_end(void)
> +{
> + fprintf(stderr, "\n");
> +}
> diff --git a/libpdbg/progress.h b/libpdbg/progress.h
> new file mode 100644
> index 000000000000..990f6d5bd8ac
> --- /dev/null
> +++ b/libpdbg/progress.h
> @@ -0,0 +1,24 @@
> +/* Copyright 2018 IBM Corp.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> + * implied.
> + */
> +
> +#ifndef __PROGRESS_H
> +#define __PROGRESS_H
> +
> +#include <inttypes.h>
> +
> +void progress_init(uint64_t count);
> +void progress_tick(uint64_t cur);
> +void progress_end(void);
> +
> +#endif /* __PROGRESS_H */
> --
> 2.17.0
>
Amitay.
--
Justice and Law are distant cousins. Usually they are not on speaking terms.
More information about the Pdbg
mailing list