cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

progress.c (2028B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/kernel.h>
      3#include "../progress.h"
      4#include "../libslang.h"
      5#include "../ui.h"
      6#include "tui.h"
      7#include "units.h"
      8#include "../browser.h"
      9
     10static void __tui_progress__init(struct ui_progress *p)
     11{
     12	p->next = p->step = p->total / (SLtt_Screen_Cols - 2) ?: 1;
     13}
     14
     15static int get_title(struct ui_progress *p, char *buf, size_t size)
     16{
     17	char buf_cur[20];
     18	char buf_tot[20];
     19	int ret;
     20
     21	ret  = unit_number__scnprintf(buf_cur, sizeof(buf_cur), p->curr);
     22	ret += unit_number__scnprintf(buf_tot, sizeof(buf_tot), p->total);
     23
     24	return ret + scnprintf(buf, size, "%s [%s/%s]",
     25			       p->title, buf_cur, buf_tot);
     26}
     27
     28static void tui_progress__update(struct ui_progress *p)
     29{
     30	char buf[100], *title = (char *) p->title;
     31	int bar, y;
     32	/*
     33	 * FIXME: We should have a per UI backend way of showing progress,
     34	 * stdio will just show a percentage as NN%, etc.
     35	 */
     36	if (use_browser <= 0)
     37		return;
     38
     39	if (p->total == 0)
     40		return;
     41
     42	if (p->size) {
     43		get_title(p, buf, sizeof(buf));
     44		title = buf;
     45	}
     46
     47	ui__refresh_dimensions(false);
     48	pthread_mutex_lock(&ui__lock);
     49	y = SLtt_Screen_Rows / 2 - 2;
     50	SLsmg_set_color(0);
     51	SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
     52	SLsmg_gotorc(y++, 1);
     53	SLsmg_write_string(title);
     54	SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' ');
     55	SLsmg_set_color(HE_COLORSET_SELECTED);
     56	bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total;
     57	SLsmg_fill_region(y, 1, 1, bar, ' ');
     58	SLsmg_refresh();
     59	pthread_mutex_unlock(&ui__lock);
     60}
     61
     62static void tui_progress__finish(void)
     63{
     64	int y;
     65
     66	if (use_browser <= 0)
     67		return;
     68
     69	ui__refresh_dimensions(false);
     70	pthread_mutex_lock(&ui__lock);
     71	y = SLtt_Screen_Rows / 2 - 2;
     72	SLsmg_set_color(0);
     73	SLsmg_fill_region(y, 0, 3, SLtt_Screen_Cols, ' ');
     74	SLsmg_refresh();
     75	pthread_mutex_unlock(&ui__lock);
     76}
     77
     78static struct ui_progress_ops tui_progress__ops = {
     79	.init   = __tui_progress__init,
     80	.update = tui_progress__update,
     81	.finish = tui_progress__finish,
     82};
     83
     84void tui_progress__init(void)
     85{
     86	ui_progress__ops = &tui_progress__ops;
     87}