diff -Nru iotop-c-1.22/archlinux/PKGBUILD iotop-c-1.23/archlinux/PKGBUILD --- iotop-c-1.22/archlinux/PKGBUILD 2022-07-09 22:08:54.000000000 +0000 +++ iotop-c-1.23/archlinux/PKGBUILD 2023-01-23 22:56:03.000000000 +0000 @@ -3,7 +3,7 @@ # Maintainer: Boian Bonev pkgname=iotop-c -pkgver=1.22 +pkgver=1.23 pkgrel=1 pkgdesc="simple top-like I/O monitor (implemented in C)" arch=('any') @@ -29,5 +29,6 @@ package() { cd iotop-${pkgver} + unset PREFIX make DESTDIR="${pkgdir}" install } diff -Nru iotop-c-1.22/debian/changelog iotop-c-1.23/debian/changelog --- iotop-c-1.22/debian/changelog 2022-07-09 22:51:40.000000000 +0000 +++ iotop-c-1.23/debian/changelog 2023-01-23 22:56:03.000000000 +0000 @@ -1,3 +1,17 @@ +iotop-c (1.23-1) unstable; urgency=medium + + [ Debian Janitor ] + * Re-export upstream signing key without extra signatures. + * Fix day-of-week for changelog entry 1.22-1. + * Update standards version to 4.6.1, no changes needed. + + [ Boian Bonev ] + * Update standards version to 4.6.2, no changes needed. + * Update to new upstream release of 1.23 + * Fix d/watch + + -- Boian Bonev Tue, 24 Jan 2023 00:00:31 +0000 + iotop-c (1.22-1) unstable; urgency=medium * Update to new upstream release of 1.22 diff -Nru iotop-c-1.22/debian/control iotop-c-1.23/debian/control --- iotop-c-1.22/debian/control 2022-07-09 22:51:49.000000000 +0000 +++ iotop-c-1.23/debian/control 2023-01-22 04:01:55.000000000 +0000 @@ -6,7 +6,7 @@ debhelper-compat (= 13), libncurses-dev, pkg-config, -Standards-Version: 4.6.1 +Standards-Version: 4.6.2 Rules-Requires-Root: no Homepage: https://github.com/Tomas-M/iotop Vcs-Browser: https://github.com/Tomas-M/iotop diff -Nru iotop-c-1.22/debian/copyright iotop-c-1.23/debian/copyright --- iotop-c-1.22/debian/copyright 2022-02-06 07:30:15.000000000 +0000 +++ iotop-c-1.23/debian/copyright 2023-01-22 04:00:53.000000000 +0000 @@ -5,11 +5,11 @@ Files: * Copyright: 2014 Vyacheslav Trushkin - 2020-2022 Boian Bonev + 2020-2023 Boian Bonev License: GPL-2.0+ Files: debian/* -Copyright: 2020-2022 Boian Bonev +Copyright: 2020-2023 Boian Bonev License: GPL-2.0+ License: GPL-2.0+ diff -Nru iotop-c-1.22/debian/upstream/signing-key.asc iotop-c-1.23/debian/upstream/signing-key.asc --- iotop-c-1.22/debian/upstream/signing-key.asc 2021-11-16 22:07:02.000000000 +0000 +++ iotop-c-1.23/debian/upstream/signing-key.asc 2022-12-17 21:13:29.000000000 +0000 @@ -11,191 +11,154 @@ 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 -RUUCx8VdrtF3k6EGlwnjMPlYY54= -=zk1u +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 +=8Zh6 -----END PGP PUBLIC KEY BLOCK----- diff -Nru iotop-c-1.22/debian/watch iotop-c-1.23/debian/watch --- iotop-c-1.22/debian/watch 2022-02-06 07:30:15.000000000 +0000 +++ iotop-c-1.23/debian/watch 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,6 @@ version=4 -opts=\ - "pgpsigurlmangle=s/releases\/download\/v([0-9.]+)\/iotop-([0-9.]+)\.tar\.xz/releases\/download\/v$1\/iotop-$1\.tar\.xz\.asc/" \ - https://github.com/Tomas-M/iotop/releases \ - (?:.*?/)?iotop-?(\d[\d.]*)\.tar\.xz \ - debian uupdate +opts="searchmode=plain, \ + pgpsigurlmangle=s/releases\/download\/v([0-9.]+)\/iotop-([0-9.]+)\.tar\.xz/releases\/download\/v$1\/iotop-$1\.tar\.xz\.asc/" \ + https://api.github.com/repos/Tomas-M/iotop/releases \ + https://github.com/Tomas-M/iotop/releases/download/v\d[\.\d]*/iotop-@ANY_VERSION@.tar.xz diff -Nru iotop-c-1.22/fedora/iotop-c.spec iotop-c-1.23/fedora/iotop-c.spec --- iotop-c-1.22/fedora/iotop-c.spec 2022-07-09 22:13:10.000000000 +0000 +++ iotop-c-1.23/fedora/iotop-c.spec 2023-01-23 22:56:03.000000000 +0000 @@ -1,5 +1,5 @@ Name: iotop-c -Version: 1.22 +Version: 1.23 Release: 1%{?dist} Summary: Simple top-like I/O monitor (implemented in C) @@ -52,6 +52,15 @@ %{_mandir}/man8/iotop-c.8* %changelog +* Tue Jan 24 2023 Boian Bonev - 1.23-1 +- Update to latest ver 1.23 + +* Thu Jan 19 2023 Fedora Release Engineering - 1.22-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Thu Jul 21 2022 Fedora Release Engineering - 1.22-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + * Sun Jul 10 2022 Boian Bonev - 1.22-1 - Update to latest ver 1.22 diff -Nru iotop-c-1.22/.github/workflows/codeql-analysis.yml iotop-c-1.23/.github/workflows/codeql-analysis.yml --- iotop-c-1.22/.github/workflows/codeql-analysis.yml 2022-02-22 01:23:20.000000000 +0000 +++ iotop-c-1.23/.github/workflows/codeql-analysis.yml 2023-01-22 04:00:53.000000000 +0000 @@ -28,7 +28,7 @@ uses: actions/checkout@v2 - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} @@ -36,4 +36,4 @@ run: make -j - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff -Nru iotop-c-1.22/glibcvertest.h iotop-c-1.23/glibcvertest.h --- iotop-c-1.22/glibcvertest.h 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/glibcvertest.h 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020,2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. diff -Nru iotop-c-1.22/iotop.8 iotop-c-1.23/iotop.8 --- iotop-c-1.22/iotop.8 2022-07-08 16:08:52.000000000 +0000 +++ iotop-c-1.23/iotop.8 2023-01-23 22:56:03.000000000 +0000 @@ -1,4 +1,4 @@ -.TH IOTOP "8" "July 8, 2022" +.TH IOTOP "8" "January 22, 2023" .SH NAME iotop \- simple top\-like I/O monitor .SH SYNOPSIS @@ -42,8 +42,9 @@ \fBspace\fR to reverse the sorting order, \fBo\fR to toggle the \fB\-\-only\fR option (this uses the visible values from the \fBGRAPH\fR column or the \fBIO\fR column in case the \fBGRAPH\fR column is hidden), \fBp\fR to toggle -the \fB\-\-processes\fR option, \fBa\fR to toggle the \fB\-\-accumulated\fR -option, \fBi\fR to change the priority of a thread or a process's thread, +the \fB\-\-processes\fR option, \fBa\fR to cycle between the +\fB\-\-accumulated\fR, \fB\-\-accum\-bw\fR and normal operation, +\fBi\fR to change the priority of a thread or a process's thread, \fBf\fR to change filtering by \fBUID\fR/\fBPID\fR (\fB\-\-user\fR and \fB\-\-pid\fR options), \fB1\-9\fR to toggle the visibility of the respective column, \fB0\fR to show all columns, \fBup\fR/\fBdown\fR arrows, @@ -115,6 +116,9 @@ Only show processes or threads actually doing I/O, instead of showing all processes or threads. This can be dynamically toggled by pressing \fBo\fR .TP +\fB\-\-no\-only\fR +Show all processes or threads +.TP \fB\-b\fR, \fB\-\-batch\fR Turn on non\-interactive mode. Useful for logging I/O usage over time @@ -139,9 +143,27 @@ \fB\-P\fR, \fB\-\-processes\fR Only show processes. Normally \fBiotop\fR shows processes and all threads .TP +\fB\-\-no\-processes\fR +Show processes and all threads +.TP \fB\-a\fR, \fB\-\-accumulated\fR Show accumulated I/O instead of bandwidth. In this mode, \fBiotop\fR shows the -amount of I/O processes have done since \fBiotop\fR started +amount of I/O processes have done since the process or \fBiotop\fR started. +Note that this option and \-\-accum\-bw are exclusive and they will turn each +other off +.TP +\fB\-\-no\-accumulated\fR +Show bandwidth (useful when changing config file with \fB\-\-write\fR) +.TP +\fB\-A\fR, \fB\-\-accum-bw\fR +Show accumulated I/O as bandwidth for the whole sampling period. In this mode, +\fBiotop\fR shows the amount of I/O per second for the whole period since the +process or \fBiotop\fR started +Note that this option and \-\-accumulated are exclusive and they will turn each +other off +.TP +\fB\-\-no\-accum-bw\fR +Show bandwidth (useful when changing config file with \fB\-\-write\fR) .TP \fB\-k\fR, \fB\-\-kilobytes\fR Use kilobytes instead of a human friendly unit. @@ -149,6 +171,9 @@ choosing the most appropriate unit \fBiotop\fR will display all sizes in kilobytes .TP +\fB\-\-no\-kilobytes\fR +Use human friendly units +.TP \fB\-t\fR, \fB\-\-time\fR Add a timestamp on each line (implies \-\-batch). Each line will be prefixed by the current time @@ -156,37 +181,73 @@ \fB\-c\fR, \fB\-\-fullcmdline\fR Show processes' full file path and parameters .TP +\fB\-\-no\-fullcmdline\fR +Show processes' names only +.TP \fB\-1\fR, \fB\-\-hide\-pid\fR Hide PID/TID column .TP +\fB\-\-show\-pid\fR +Show PID/TID column +.TP \fB\-2\fR, \fB\-\-hide\-prio\fR Hide PRIO column .TP +\fB\-\-show\-prio\fR +Show PRIO column +.TP \fB\-3\fR, \fB\-\-hide\-user\fR Hide USER column .TP +\fB\-\-show\-user\fR +Show USER column +.TP \fB\-4\fR, \fB\-\-hide\-read\fR Hide DISK READ column .TP +\fB\-\-show\-read\fR +Show DISK READ column +.TP \fB\-5\fR, \fB\-\-hide\-write\fR Hide DISK WRITE column .TP +\fB\-\-show\-write\fR +Show DISK WRITE column +.TP \fB\-6\fR, \fB\-\-hide\-swapin\fR Hide SWAPIN column .TP +\fB\-\-show\-swapin\fR +Show SWAPIN column +.TP \fB\-7\fR, \fB\-\-hide\-io\fR Hide IO column .TP +\fB\-\-show\-io\fR +Show IO column +.TP \fB\-8\fR, \fB\-\-hide\-graph\fR Hide GRAPH column .TP +\fB\-\-show\-graph\fR +Show GRAPH column +.TP \fB\-9\fR, \fB\-\-hide\-command\fR Hide COMMAND column .TP +\fB\-\-show\-command\fR +Show COMMAND column +.TP \fB\-g\fR \fITYPE\fR, \fB\-\-grtype\fR=\fITYPE\fR Set GRAPH column data source. Accepted values for \fITYPE\fR are \fBio\fR, \fBr\fR, \fBw\fR, \fBrw\fR and \fBsw\fR. .TP +\fB\-R\fR, \fB\-\-reverse\-graph\fR +Reverse GRAPH direction \- show most recent values on the right side +.TP +\fB\-\-no\-reverse\-graph\fR +Do not reverse GRAPH direction \- show most recent values on the left side +.TP \fB\-q\fR, \fB\-\-quiet\fR Suppress some lines of header (implies \-\-batch). This option can be specified up to three times to remove header lines @@ -207,18 +268,55 @@ \fB\-x\fR, \fB\-\-dead\-x\fR Show exited processes/threads with letter x instead of inverse background .TP +\fB\-\-no\-dead\-x\fR +Show exited processes/threads with inverse background +.TP \fB\-e\fR, \fB\-\-hide\-exited\fR Hide exited processes .TP +\fB\-\-show\-exited\fR +Show exited processes +.TP \fB\-l\fR, \fB\-\-no\-color\fR Do not colorize values +.TP +\fB\-\-color\fR +Colorize values. This will override the effect of the environment variable +\fBNO_COLOR\fR when explicitly specified on the command line. +.TP +\fB\-\-si\fR +Use SI units of \fB1000\fR when printing values. The default is non\-SI +\fB1024\fR +.TP +\fB\-\-no\-si\fR +Use non-SI units of \fB1024\fR when printing values +.TP +\fB\-\-threshold=1..10\fR +Set the threshold to switch to next unit. The default value is \fB2\fR +.TP +\fB\-\-ascii\fR +Disable using Unicode +.TP +\fB\-\-unicode\fR +Use Unicode drawing chars +.TP +\fB\-W\fR, \fB\-\-write\fR +Merge the preceding options to the current config, save the config and exit. +Note that all options after this one will be ignored. .PD 1 .SH KEYBOARD SHORTCUTS .TP \fBq\fR, \fBQ\fR Exit .TP -\fB\fR, \fBr\fR, \fBR\fR +\fBW\fR +Save current settings to configuration file in +\fB$HOME/.config/iotop/iotoprc\fR +.TP +\fBD\fR +Reset all settings to their default values +.TP +\fB\fR, \fBr\fR Toggle sort order .TP \fB\fR @@ -256,7 +354,7 @@ Toggle showing processes/threads .TP \fBa\fR, \fBA\fR -Toggle showing accumulated/current values +Cycle showing accumulated/accum-bw/current values .TP \fB?\fR Toggle showing inline help @@ -278,6 +376,9 @@ \fBR+W\fR=DISK READ+DISK WRITE, \fBSW\fR=SWAPIN). Using \fBg\fR will cycle forward and \fBG\fR will cycle backward. .TP +\fBR\fR +Toggle reverse GRAPH direction +.TP \fBi\fR, \fBI\fR IOnice a process/thread (depends on process/thread display mode) .TP @@ -300,9 +401,18 @@ \fBs\fR, \fBS\fR Toggle freeze of data collection .TP +\fBCtrl\-B\fR +Toggle SI units +.TP +\fBCtrl\-R\fR +Cycle unit threshold +.TP \fBCtrl\-T\fR Toggle task_delayacct kernel sysctl .TP +\fBCtrl\-L\fR +Redraw screen +.TP \fB/\fR Change search regular expression. While the search regular expression is being edited, there is an indicator next to it that shows if the expression is valid. @@ -361,7 +471,7 @@ character under the cursor. .RE .SH ENVIRONMENT -As per the recommendation of \fBhttps://www.no-color.org/\fR iotop honors the +As per the recommendation of \fBhttps://www.no\-color.org/\fR iotop honors the contents of the environment variable \fBNO_COLOR\fR and when it is set to a non empty string, all color output is suppressed. .SH SEE ALSO @@ -374,7 +484,7 @@ The original Python iotop implementation was written by Guillaume Chazarain. This rewrite in C was started in 2014 by Vyacheslav Trushkin and reworked to include all missing features from the original Python code and several new ones -from 2020 to 2022 by Boian Bonev. +from 2020 to 2023 by Boian Bonev. .PP This manual page was started by Paul Wise for the Debian project and is placed in the public domain. diff -Nru iotop-c-1.22/LICENSE iotop-c-1.23/LICENSE --- iotop-c-1.22/LICENSE 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/LICENSE 2023-01-22 04:00:53.000000000 +0000 @@ -1,6 +1,6 @@ iotop - interactive monitor of Linux IO activity Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020,2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff -Nru iotop-c-1.22/Makefile iotop-c-1.23/Makefile --- iotop-c-1.22/Makefile 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/Makefile 2023-01-23 23:07:32.000000000 +0000 @@ -7,7 +7,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # # Copyright (C) 2014 Vyacheslav Trushkin -# Copyright (C) 2020,2022 Boian Bonev +# Copyright (C) 2020-2023 Boian Bonev # # This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. # @@ -24,7 +24,7 @@ ifndef NO_FLTO CFLAGS?=-O3 -fno-stack-protector -mno-stackrealign -CFLAGS+=-flto +CFLAGS+=-flto=auto else CFLAGS?=-O3 -fno-stack-protector -mno-stackrealign endif @@ -120,6 +120,10 @@ cp -fa ../iotop-c_$(VER).orig.tar.xz ../iotop-$(VER).tar.xz cp -fa ../iotop-c_$(VER).orig.tar.xz.asc ../iotop-$(VER).tar.xz.asc +re: + $(Q)$(MAKE) --no-print-directory clean + $(Q)$(MAKE) --no-print-directory -j + -include $(DEPS) -.PHONY: clean install uninstall +.PHONY: all clean install uninstall mkotar re diff -Nru iotop-c-1.22/README.md iotop-c-1.23/README.md --- iotop-c-1.22/README.md 2022-07-06 19:54:03.000000000 +0000 +++ iotop-c-1.23/README.md 2023-01-23 23:15:49.000000000 +0000 @@ -54,7 +54,7 @@
- CentOS 7/CentOS 8/RHEL 7/RHEL 8 + CentOS 7/CentOS 8/RHEL 7/RHEL 8/RHEL 9   Use the following commands (note that `-y` disables confirmation prompts): @@ -63,6 +63,15 @@ sudo yum install iotop-c -y
+
+ Void Linux +  + +Use the following command: + + sudo xbps-install iotop-c +
+ ## How to build from source Please note that the installation and the usage of this program require root access. @@ -91,7 +100,7 @@
-CentOS 7/CentOS 8/RHEL 7/RHEL 8 +CentOS 8/RHEL 8/RHEL 9   Use the following commands (note that `-y` disables confirmation prompts): @@ -102,6 +111,33 @@ make -j
+
+CentOS 7/RHEL 7 +  + +*Note:* On CentOS 7/RHEL 7 `gcc` does not support `-Wdate-time` and needs a `-Wno-strict-overflow` to suppress a pile of bogus warnings. + +Use the following commands (note that `-y` disables confirmation prompts): + + yum install git gcc make ncurses-devel pkgconfig -y + git clone https://github.com/Tomas-M/iotop + cd iotop + sed -i 's/-Wdate-time/-Wno-strict-overflow/' Makefile + make -j +
+ +
+Void Linux +  + +Use the following commands: + + xbps-install git base-devel ncurses-devel + git clone https://github.com/Tomas-M/iotop + cd iotop + make -j +
+ ### How to install as a system command sudo make install @@ -116,30 +152,57 @@ -h, --help show this help message and exit -H, --help-type=TYPE set type of interactive help (none, win or inline) -o, --only only show processes or threads actually doing I/O + --no-only show all processes or threads -b, --batch non-interactive mode -n NUM, --iter=NUM number of iterations before ending [infinite] -d SEC, --delay=SEC delay between iterations [1 second] -p PID, --pid=PID processes/threads to monitor [all] -u USER, --user=USER users to monitor [all] -P, --processes only show processes, not all threads + --threads show all threads -a, --accumulated show accumulated I/O instead of bandwidth + --no-accumulated show bandwidth + -A, --accum-bw show accumulated bandwidth + --no-accum-bw show last iteration bandwidth -k, --kilobytes use kilobytes instead of a human friendly unit + --no-kilobytes use human friendly unit -t, --time add a timestamp on each line (implies --batch) -c, --fullcmdline show full command line + --no-fullcmdline show program names only -1, --hide-pid hide PID/TID column + --show-pid show PID/TID column -2, --hide-prio hide PRIO column + --show-prio show PRIO column -3, --hide-user hide USER column + --show-user show USER column -4, --hide-read hide DISK READ column + --show-read show DISK READ column -5, --hide-write hide DISK WRITE column + --show-write show DISK WRITE column -6, --hide-swapin hide SWAPIN column + --show-swapin show SWAPIN column -7, --hide-io hide IO column + --show-io show IO column -8, --hide-graph hide GRAPH column + --show-graph show GRAPH column -9, --hide-command hide COMMAND column + --show-command show COMMAND column -g TYPE, --grtype=TYPE set graph data source (io, r, w, rw and sw) + -R, --reverse-graph reverse GRAPH column direction + --no-reverse-graph do not reverse GRAPH column direction -q, --quiet suppress some lines of header (implies --batch) -x, --dead-x show exited processes/threads with letter x + --no-dead-x show exited processes/threads with background -e, --hide-exited hide exited processes + --show-exited show exited processes -l, --no-color do not colorize values + --color colorize values + --si use SI units of 1000 when printing values + --no-si use non-SI units of 1024 when printing values + --threshold=1..10 threshold to switch to next unit + --ascii disable using Unicode + --unicode use Unicode drawing chars + -W, --write write preceding options to the config and exit ## Contribute @@ -161,6 +224,10 @@ Notable contributions (ordered by time of last contribution): +- Leah Neukirchen <[leah@vuxu.org](mailto:leah@vuxu.org)> - Void Linux packaging and testing +- Vitaly Chikunov <[vt@altlinux.org](mailto:vt@altlinux.org)> - ALT Linux packaging and testing +- Matteo Bernardini <[ponce@slackbuilds.org](mailto:ponce@slackbuilds.org)> - SlackBuilds packaging and testing +- Jonathan Papineau <[jonathan@jontech.app](mailto:jonathan@jontech.app)> - OpenSUSE packaging and testing - Vladi Belperchinov-Shabanski <[cade@noxrun.com](mailto:cade@noxrun.com)> - Scroller code improvement, multiple reviews and ideas - Alexander Monakov <[amonakov@ispras.ru](mailto:amonakov@ispras.ru)> - Improvement of ncurses color handling - Alexander Rezvov <[alex@rezvov.ru](mailto:alex@rezvov.ru)> - NixOS packaging and testing @@ -170,8 +237,8 @@ - Milan P. Stanić <[mps@arvanta.net](mailto:mps@arvanta.net)> - Alpine Linux packaging and testing - Arthur Zamarin <[arthurzam+gentoo@gmail.com](mailto:arthurzam+gentoo@gmail.com)> - Gentoo packaging and testing - Yuriy M. Kaminskiy <[yumkam@gmail.com](mailto:yumkam@gmail.com)> - Code fixes and improvements -- alicektx <[alicekot13@gmail.com](mailto:alicekot13@gmail.com)> - Documentation imrpovements -- Filip Kofron <[filip.kofron.cz@gmail.com](mailto:filip.kofron.cz@gmail.com)> - Build system imrpovements +- alicektx <[alicekot13@gmail.com](mailto:alicekot13@gmail.com)> - Documentation improvements +- Filip Kofron <[filip.kofron.cz@gmail.com](mailto:filip.kofron.cz@gmail.com)> - Build system improvements **Thanks!** This project is what it is now because the steam you have put into it diff -Nru iotop-c-1.22/src/arr.c iotop-c-1.23/src/arr.c --- iotop-c-1.22/src/arr.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/arr.c 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. diff -Nru iotop-c-1.22/src/checks.c iotop-c-1.23/src/checks.c --- iotop-c-1.22/src/checks.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/checks.c 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. diff -Nru iotop-c-1.22/src/configfile.c iotop-c-1.23/src/configfile.c --- iotop-c-1.22/src/configfile.c 1970-01-01 00:00:00.000000000 +0000 +++ iotop-c-1.23/src/configfile.c 2023-01-23 22:56:03.000000000 +0000 @@ -0,0 +1,254 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later + +Copyright (C) 2014 Vyacheslav Trushkin +Copyright (C) 2020-2023 Boian Bonev + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include "iotop.h" + +#include +#include +#include +#include +#include +#include + +#define CONFIG_PATH "/.config/iotop" +#define CONFIG_NAME "/iotoprc" +#define MAX_OPT 50 + +static char *av[MAX_OPT]={NULL,}; +static char *ss=NULL; +static int ac=0; + +static inline void mkdir_p(const char *dir) { + char tmp[PATH_MAX]; + char *p=NULL; + size_t len; + + snprintf(tmp,sizeof(tmp),"%s",dir); + len=strlen(tmp); + if (tmp[len-1]=='/') + tmp[len-1]=0; + for (p=tmp+1;*p;p++) + if (*p=='/') { + *p=0; + mkdir(tmp,S_IRWXU); + *p='/'; + } + mkdir(tmp,S_IRWXU); +} + +static inline FILE *config_file_open(const char *mode) { + char path[PATH_MAX]; + char *home; + + home=getenv("HOME"); + if (!home) + home=""; + + strcpy(path,home); + strcat(path,CONFIG_PATH); + mkdir_p(path); + strcat(path,CONFIG_NAME); + + return fopen(path,mode); +} + +inline int config_file_load(int *pac,char ***pav) { + FILE *cf=config_file_open("r"); + ssize_t sz; + char *s; + char *e; + + if (!cf) + return -1; + if (fseek(cf,0,SEEK_END)) { + fclose(cf); + return -1; + } + sz=ftell(cf); + if (sz<=0) { + fclose(cf); + return -1; + } + rewind(cf); + ss=calloc(1,sz+1); + if (!ss) { + fclose(cf); + return -1; + } + if ((size_t)sz!=fread(ss,1,sz,cf)) { // couldn't read all data + free(ss); + ss=NULL; + fclose(cf); + return -1; + } + + av[ac++]="iotop"; // dummy program name + s=ss; + while (*s) { + while (*s&&(*s==' '||*s=='\t'||*s=='\r')) // skip ws + s++; + if (*s=='\n') { // skip empty lines + s++; + continue; + } + if (*s=='#') { // skip comments + while (*s&&*s!='\n') + s++; + if (*s=='\n') + s++; + continue; + } + // found an option + av[ac]=s; + if (ac>=MAX_OPT-1) { + fprintf(stderr,"Too many options in config file\n"); + free(ss); + ss=NULL; + fclose(cf); + return -1; + } + ac++; + while (*s&&*s!='\n') + s++; + e=s-1; + if (*s) { + *s=0; + s++; + } + while (e>av[ac-1]&&(*e==' '||*e=='\t')) // trim trailing white space + *e--=0; + } + + fclose(cf); + *pac=ac; + *pav=av; + return 0; +} + +inline void config_file_free(void) { + if (ss) + free(ss); + ss=NULL; + memset(av,0,sizeof av); + ac=0; +} + +inline int config_file_save(void) { + FILE *cf=config_file_open("w"); + + if (!cf) + return -1; + + fprintf(cf,"# iotop configuration file\n"); + fprintf(cf,"# empty lines are ignored, comments start with #\n"); + fprintf(cf,"# each line contains a single option\n"); + fprintf(cf,"\n"); + + // --version is ignored + // --help is ignored + // --help-type + if (config.f.helptype==0) + fprintf(cf,"--help-type=none\n"); + if (config.f.helptype==1) + fprintf(cf,"--help-type=win\n"); + if (config.f.helptype==2) + fprintf(cf,"--help-type=inline\n"); + // --batch is ignored + // --only + if (config.f.only) + fprintf(cf,"--only\n"); + // --iter is ignored + // --delay + fprintf(cf,"--delay=%d\n",params.delay); + // --pid is ignored + // --user is ignored + // --processes + if (config.f.processes) + fprintf(cf,"--processes\n"); + // --accumulated + if (config.f.accumulated) + fprintf(cf,"--accumulated\n"); + // --accum-bw + if (config.f.accumbw) + fprintf(cf,"--accum-bw\n"); + // --kilobytes + if (config.f.kilobytes) + fprintf(cf,"--kilobytes\n"); + // --timestamp is ignored + // --quiet is ignored + // --fullcmdline + if (config.f.fullcmdline) + fprintf(cf,"--fullcmdline\n"); + // --hide-pid + if (config.f.hidepid) + fprintf(cf,"--hide-pid\n"); + // --hide-prio + if (config.f.hideprio) + fprintf(cf,"--hide-prio\n"); + // --hide-user + if (config.f.hideuser) + fprintf(cf,"--hide-user\n"); + // --hide-read + if (config.f.hideread) + fprintf(cf,"--hide-read\n"); + // --hide-write + if (config.f.hidewrite) + fprintf(cf,"--hide-write\n"); + // --hide-swapin + if (config.f.hideswapin) + fprintf(cf,"--hide-swapin\n"); + // --hide-io + if (config.f.hideio) + fprintf(cf,"--hide-io\n"); + // --hide-graph + if (config.f.hidegraph) + fprintf(cf,"--hide-graph\n"); + // --hide-command + if (config.f.hidecmd) + fprintf(cf,"--hide-command\n"); + // --dead-x + if (config.f.deadx) + fprintf(cf,"--dead-x\n"); + // --hide-exited + if (config.f.hideexited) + fprintf(cf,"--hide-exited\n"); + // --no-color + if (config.f.nocolor) + fprintf(cf,"--no-color\n"); + // --reverse-graph + if (config.f.reverse_graph) + fprintf(cf,"--reverse-graph\n"); + // --grtype + if (config.f.grtype==E_GR_IO) + fprintf(cf,"--grtype=io\n"); + if (config.f.grtype==E_GR_R) + fprintf(cf,"--grtype=r\n"); + if (config.f.grtype==E_GR_W) + fprintf(cf,"--grtype=w\n"); + if (config.f.grtype==E_GR_RW) + fprintf(cf,"--grtype=rw\n"); + if (config.f.grtype==E_GR_SW) + fprintf(cf,"--grtype=sw\n"); + // --si + if (config.f.base==1000) + fprintf(cf,"--si\n"); + // --threshold + fprintf(cf,"--threshold=%d\n",config.f.threshold); + // --ascii + if (!config.f.unicode) + fprintf(cf,"--ascii\n"); + + fclose(cf); + + return 0; +} diff -Nru iotop-c-1.22/src/delayacct.c iotop-c-1.23/src/delayacct.c --- iotop-c-1.22/src/delayacct.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/delayacct.c 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. diff -Nru iotop-c-1.22/src/ioprio.c iotop-c-1.23/src/ioprio.c --- iotop-c-1.22/src/ioprio.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/ioprio.c 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. diff -Nru iotop-c-1.22/src/iotop.h iotop-c-1.23/src/iotop.h --- iotop-c-1.22/src/iotop.h 2022-07-09 22:08:14.000000000 +0000 +++ iotop-c-1.23/src/iotop.h 2023-01-23 22:56:03.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -27,7 +27,7 @@ #include #include -#define VERSION "1.22" +#define VERSION "1.23" typedef enum { E_GR_IO, @@ -61,10 +61,15 @@ int deadx; int hideexited; int nocolor; + int reverse_graph; + int accumbw; + int unicode; // this and below are not part of opts e_grtype grtype; int helptype; int sort_by; int sort_order; + int base; // 1000 or 1024 + int threshold; // 1..10 } f; int opts[22]; } config_t; @@ -98,6 +103,8 @@ uint64_t blkio_delay_total; // nanoseconds uint64_t read_bytes; uint64_t write_bytes; + uint64_t ts_s; // start timestamp for accum-bw + uint64_t ts_e; // end timestamp for accum-bw double blkio_val; double swapin_val; @@ -105,6 +112,8 @@ double write_val; double read_val_acc; double write_val_acc; + double read_val_abw; + double write_val_abw; int io_prio; @@ -184,6 +193,8 @@ inline int is_a_dir(const char *p); inline int is_a_process(pid_t tid); +inline double timediff_in_s(uint64_t sta,uint64_t end); + /* ioprio.c */ enum { @@ -252,7 +263,7 @@ inline void calc_a_total(struct act_stats *act,double *read,double *write,double time_s); inline void humanize_val(double *value,char *str,int allow_accum); inline int iotop_sort_cb(const void *a,const void *b); -inline int create_diff(struct xxxid_stats_arr *cs,struct xxxid_stats_arr *ps,double time_s,filter_callback_w cb,int width,int *cnt); +inline int create_diff(struct xxxid_stats_arr *cs,struct xxxid_stats_arr *ps,double time_s,uint64_t ts_c,filter_callback_w cb,int width,int *cnt); inline int value2scale(double val,double mx); inline int filter1(struct xxxid_stats *s); @@ -262,5 +273,11 @@ inline int read_task_delayacct(void); inline int write_task_delayacct(int da); +/* configfile.c */ + +inline int config_file_load(int *pac,char ***pav); +inline void config_file_free(void); +inline int config_file_save(void); + #endif // __IOTOP_H__ diff -Nru iotop-c-1.22/src/main.c iotop-c-1.23/src/main.c --- iotop-c-1.22/src/main.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/main.c 2023-01-23 22:56:03.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -23,6 +23,31 @@ #include #include +#define OPT_SI 0x100 +#define OPT_THR 0x101 +#define OPT_ASCII 0x102 +#define OPT_NO_ONLY 0x103 +#define OPT_THREADS 0x104 +#define OPT_NO_ACCUMULATED 0x105 +#define OPT_NO_KILOBYTES 0x106 +#define OPT_NO_FULLCMDLINE 0x107 +#define OPT_SHOW_PID 0x108 +#define OPT_SHOW_PRIO 0x109 +#define OPT_SHOW_USER 0x10a +#define OPT_SHOW_READ 0x10b +#define OPT_SHOW_WRITE 0x10c +#define OPT_SHOW_SWAPIN 0x10d +#define OPT_SHOW_IO 0x10e +#define OPT_SHOW_GRAPH 0x10f +#define OPT_SHOW_CMD 0x110 +#define OPT_NO_DEADX 0x111 +#define OPT_SHOW_EXITED 0x112 +#define OPT_NO_REVERSE 0x113 +#define OPT_NO_SI 0x114 +#define OPT_UNICODE 0x115 +#define OPT_COLOR 0x116 +#define OPT_NO_ACCUM_BW 0x117 + static const char *progname=NULL; int maxpidlen=5; @@ -40,7 +65,7 @@ params.user_id=-1; } -static const char str_opt[]="boPaktqc123456789xel"; +static const char str_opt[]="boPaktqc123456789xelRA"; static inline void print_help(void) { printf( @@ -58,171 +83,334 @@ " -h, --help show this help message and exit\n" " -H, --help-type=TYPE set type of interactive help (none, win or inline)\n" " -o, --only only show processes or threads actually doing I/O\n" + " --no-only show all processes or threads\n" " -b, --batch non-interactive mode\n" " -n NUM, --iter=NUM number of iterations before ending [infinite]\n" " -d SEC, --delay=SEC delay between iterations [1 second]\n" " -p PID, --pid=PID processes/threads to monitor [all]\n" " -u USER, --user=USER users to monitor [all]\n" " -P, --processes only show processes, not all threads\n" + " --threads show all threads\n" " -a, --accumulated show accumulated I/O instead of bandwidth\n" + " --no-accumulated show bandwidth\n" + " -A, --accum-bw show accumulated bandwidth\n" + " --no-accum-bw show last iteration bandwidth\n" " -k, --kilobytes use kilobytes instead of a human friendly unit\n" + " --no-kilobytes use human friendly unit\n" " -t, --time add a timestamp on each line (implies --batch)\n" " -c, --fullcmdline show full command line\n" + " --no-fullcmdline show program names only\n" " -1, --hide-pid hide PID/TID column\n" + " --show-pid show PID/TID column\n" " -2, --hide-prio hide PRIO column\n" + " --show-prio show PRIO column\n" " -3, --hide-user hide USER column\n" + " --show-user show USER column\n" " -4, --hide-read hide DISK READ column\n" + " --show-read show DISK READ column\n" " -5, --hide-write hide DISK WRITE column\n" + " --show-write show DISK WRITE column\n" " -6, --hide-swapin hide SWAPIN column\n" + " --show-swapin show SWAPIN column\n" " -7, --hide-io hide IO column\n" + " --show-io show IO column\n" " -8, --hide-graph hide GRAPH column\n" + " --show-graph show GRAPH column\n" " -9, --hide-command hide COMMAND column\n" + " --show-command show COMMAND column\n" " -g TYPE, --grtype=TYPE set graph data source (io, r, w, rw and sw)\n" + " -R, --reverse-graph reverse GRAPH column direction\n" + " --no-reverse-graph do not reverse GRAPH column direction\n" " -q, --quiet suppress some lines of header (implies --batch)\n" " -x, --dead-x show exited processes/threads with letter x\n" + " --no-dead-x show exited processes/threads with background\n" " -e, --hide-exited hide exited processes\n" - " -l, --no-color do not colorize values\n", + " --show-exited show exited processes\n" + " -l, --no-color do not colorize values\n" + " --color colorize values\n" + " --si use SI units of 1000 when printing values\n" + " --no-si use non-SI units of 1024 when printing values\n" + " --threshold=1..10 threshold to switch to next unit\n" + " --ascii disable using Unicode\n" + " --unicode use Unicode drawing chars\n" + " -W, --write write preceding options to the config and exit\n", progname ); } -static inline void parse_args(int argc,char *argv[]) { +static inline void parse_args(int clac,char **clav) { char *no_color=getenv("NO_COLOR"); + int v; + int i; init_params(); memset(&config,0,sizeof(config)); config.f.sort_by=SORT_BY_GRAPH; config.f.sort_order=SORT_DESC; + config.f.base=1024; // use non-SI units by default + config.f.threshold=2; // default threshold is 2*base + config.f.unicode=1; // default is unicode // implement https://no-color.org/ proposal if (no_color&&*no_color) config.f.nocolor=1; - while (1) { - static struct option long_options[]={ - {"version",no_argument,NULL,'v'}, - {"help",no_argument,NULL,'h'}, - {"help-type",required_argument,NULL,'H'}, - {"batch",no_argument,NULL,'b'}, - {"only",no_argument,NULL,'o'}, - {"iter",required_argument,NULL,'n'}, - {"delay",required_argument,NULL,'d'}, - {"pid",required_argument,NULL,'p'}, - {"user",required_argument,NULL,'u'}, - {"processes",no_argument,NULL,'P'}, - {"accumulated",no_argument,NULL,'a'}, - {"kilobytes",no_argument,NULL,'k'}, - {"timestamp",no_argument,NULL,'t'}, - {"quiet",no_argument,NULL,'q'}, - {"fullcmdline",no_argument,NULL,'c'}, - {"hide-pid",no_argument,NULL,'1'}, - {"hide-prio",no_argument,NULL,'2'}, - {"hide-user",no_argument,NULL,'3'}, - {"hide-read",no_argument,NULL,'4'}, - {"hide-write",no_argument,NULL,'5'}, - {"hide-swapin",no_argument,NULL,'6'}, - {"hide-io",no_argument,NULL,'7'}, - {"hide-graph",no_argument,NULL,'8'}, - {"hide-command",no_argument,NULL,'9'}, - {"dead-x",no_argument,NULL,'x'}, - {"hide-exited",no_argument,NULL,'e'}, - {"no-color",no_argument,NULL,'l'}, - {"grtype",required_argument,NULL,'g'}, - {NULL,0,NULL,0} - }; - - int c=getopt_long(argc,argv,"vhbon:d:p:u:Paktqc123456789xelg:H:",long_options,NULL); - - if (c==-1) { - if (optindpw_uid; + } + break; + case OPT_SI: + config.f.base=1000; + break; + case OPT_THR: + v=atoi(optarg); + if (v<1||v>10) { + fprintf(stderr,"%s: threshold %s is not between 1 and 10\n",progname,optarg); exit(EXIT_FAILURE); } - params.user_id=pwd->pw_uid; - } - break; - default: - exit(EXIT_FAILURE); + config.f.threshold=v; + break; + case OPT_ASCII: + config.f.unicode=0; + break; + case OPT_NO_ONLY: + config.f.only=0; + break; + case OPT_THREADS: + config.f.processes=0; + break; + case OPT_NO_ACCUMULATED: + config.f.accumulated=0; + break; + case OPT_NO_KILOBYTES: + config.f.kilobytes=0; + break; + case OPT_NO_FULLCMDLINE: + config.f.fullcmdline=0; + break; + case OPT_SHOW_PID: + config.f.hidepid=0; + break; + case OPT_SHOW_PRIO: + config.f.hideprio=0; + break; + case OPT_SHOW_USER: + config.f.hideuser=0; + break; + case OPT_SHOW_READ: + config.f.hideread=0; + break; + case OPT_SHOW_WRITE: + config.f.hidewrite=0; + break; + case OPT_SHOW_SWAPIN: + config.f.hideswapin=0; + break; + case OPT_SHOW_IO: + config.f.hideio=0; + break; + case OPT_SHOW_GRAPH: + config.f.hidegraph=0; + break; + case OPT_SHOW_CMD: + config.f.hidecmd=0; + break; + case OPT_NO_DEADX: + config.f.deadx=0; + break; + case OPT_SHOW_EXITED: + config.f.hideexited=0; + break; + case OPT_NO_REVERSE: + config.f.reverse_graph=0; + break; + case OPT_NO_SI: + config.f.base=1024; + break; + case OPT_UNICODE: + config.f.unicode=1; + break; + case OPT_COLOR: + config.f.nocolor=0; + break; + case OPT_NO_ACCUM_BW: + config.f.accumbw=0; + break; + default: + exit(EXIT_FAILURE); + } } } } diff -Nru iotop-c-1.22/src/ucell.c iotop-c-1.23/src/ucell.c --- iotop-c-1.22/src/ucell.c 2022-07-08 17:39:35.000000000 +0000 +++ iotop-c-1.23/src/ucell.c 2023-01-22 04:00:53.000000000 +0000 @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-or-later -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -130,7 +130,7 @@ uc->cells[i].flags=0; uc->cells[i].d[0]=0; } - nc=reallocarray(uc->cells,newsz,sizeof *uc->cells); + nc=realloc(uc->cells,newsz*sizeof *uc->cells); if (uc->len>newsz) uc->len=newsz; if (nc) { @@ -144,7 +144,7 @@ cell *nc; int i; - nc=reallocarray(uc->cells,newsz,sizeof *uc->cells); + nc=realloc(uc->cells,newsz*sizeof *uc->cells); if (!nc) return -ENOMEM; @@ -271,7 +271,8 @@ *d=0; sl=strlen(s); - mbtowc(NULL,NULL,0); + if (mbtowc(NULL,NULL,0)) { + } for (;;) { int cl; int tw; @@ -694,7 +695,8 @@ if (!s) return 0; - mbtowc(NULL,NULL,0); // reset state + if (mbtowc(NULL,NULL,0)) { // reset state + } l=strlen(s); while (p0) { if (!iswalnum(ws[0])) diff -Nru iotop-c-1.22/src/ucell.h iotop-c-1.23/src/ucell.h --- iotop-c-1.22/src/ucell.h 2022-07-08 07:21:50.000000000 +0000 +++ iotop-c-1.23/src/ucell.h 2023-01-22 04:00:53.000000000 +0000 @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-or-later -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. diff -Nru iotop-c-1.22/src/utils.c iotop-c-1.23/src/utils.c --- iotop-c-1.22/src/utils.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/utils.c 2023-01-23 22:56:03.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -266,7 +266,8 @@ s="(null)"; sl=strlen(s); - mbtowc(NULL,NULL,0); + if (mbtowc(NULL,NULL,0)) { + } for (;;) { int cl; int tw; @@ -337,3 +338,8 @@ return is_a_dir(path); } +inline double timediff_in_s(uint64_t sta,uint64_t end) { + if (sta==end||sta==0) + return 0.0001; + return (end-sta)/1000.0; +} diff -Nru iotop-c-1.22/src/view_batch.c iotop-c-1.23/src/view_batch.c --- iotop-c-1.22/src/view_batch.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/view_batch.c 2023-01-23 22:56:03.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -18,11 +18,9 @@ #include #include -#define TIMEDIFF_IN_S(sta,end) ((((sta)==(end))||(sta)==0)?0.0001:(((end)-(sta))/1000.0)) - static inline void view_batch(struct xxxid_stats_arr *cs,struct xxxid_stats_arr *ps,struct act_stats *act) { - double time_s=TIMEDIFF_IN_S(act->ts_o,act->ts_c); - int diff_len=create_diff(cs,ps,time_s,NULL,0,NULL); + double time_s=timediff_in_s(act->ts_o,act->ts_c); + int diff_len=create_diff(cs,ps,time_s,act->ts_c,NULL,0,NULL); double total_a_read,total_a_write; char str_a_read[4],str_a_write[4]; double total_read,total_write; @@ -56,11 +54,21 @@ for (i=0;cs->sor&&isor[i]; - double read_val=config.f.accumulated?s->read_val_acc:s->read_val; - double write_val=config.f.accumulated?s->write_val_acc:s->write_val; char read_str[4],write_str[4]; + double write_val; + double read_val; char *pw_name; + if (config.f.accumbw) { + read_val=s->read_val_abw; + write_val=s->write_val_abw; + } else if (config.f.accumulated) { + read_val=s->read_val_acc; + write_val=s->write_val_acc; + } else { + read_val=s->read_val; + write_val=s->write_val; + } // show only processes, if configured if (config.f.processes&&s->pid!=s->tid) continue; diff -Nru iotop-c-1.22/src/view_curses.c iotop-c-1.23/src/view_curses.c --- iotop-c-1.22/src/view_curses.c 2022-07-08 16:38:30.000000000 +0000 +++ iotop-c-1.23/src/view_curses.c 2023-01-23 22:56:03.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -65,6 +65,9 @@ #ifndef KEY_RET #define KEY_RET KEY_CTRL_M #endif +#ifndef KEY_CTRL_R +#define KEY_CTRL_R 0x12 +#endif #ifndef KEY_CTRL_T #define KEY_CTRL_T 0x14 #endif @@ -78,6 +81,11 @@ #define KEY_ESCAPE 0x1b #endif +// fix for old ncurses that does not implement A_ITALIC +#ifndef A_ITALIC +#define A_ITALIC A_BOLD +#endif + #define HEADER_XXS_FORMAT "%4.0f%s%s/%4.0f%s%s|%4.0f%s%s/%4.0f%s%s" #define HEADER_XS_FORMAT "TR:%4.0f%s%sW:%4.0f%s%s|CR:%4.0f%s%sW:%4.0f%s%s" #define HEADER_S_FORMAT "T R:%7.2f%s%s W:%7.2f%s%s|C R:%7.2f%s%s W:%7.2f%s%s" @@ -112,7 +120,6 @@ static ucell *search_uc=NULL; // utf cell array static struct xxxid_stats *ionice_pos_data=NULL; static int has_unicode=0; -static int unicode=1; // enable unicode (only valid if unicode is available) static double hist_t_r[HISTORY_CNT]={0}; static double hist_t_w[HISTORY_CNT]={0}; static double hist_a_r[HISTORY_CNT]={0}; @@ -127,6 +134,7 @@ static WINDOW *whelp; // pop-up help window static int hx=1,hy=1,hw=2+2+3,hh=2; // help window size and position static size_t c1w=0,c2w=0,c3w=0,cdw=0; // help window column widths +static int helppos=0; // help window scroll position static WINDOW *wtda; // pop-up warning window static int whx=1,why=1,whw=2+2+20,whh=6; // warning window size and position static int dontrefresh=0; // flag to inhibit refresh of data @@ -139,9 +147,12 @@ const char *k3; } s_helpitem; +static char units[100]=""; +static char unitt[100]=""; + const s_helpitem thelp[]={ {.descr="Exit",.k2="q",.k3="Q"}, - {.descr="Toggle sort order",.k1="",.k2="r",.k3="R"}, + {.descr="Toggle sort order",.k1="",.k2="r"}, {.descr="Scroll to the top of the list",.k1=""}, {.descr="Scroll to the bottom of the list",.k1=""}, {.descr="Scroll one screen up",.k1=""}, @@ -153,7 +164,7 @@ {.descr="Cancel ionice/filter/search or close help window",.k1=""}, {.descr="Toggle showing only processes with IO activity",.k2="o",.k3="O"}, {.descr="Toggle showing processes/threads",.k2="p",.k3="P"}, - {.descr="Toggle showing accumulated/current values",.k2="a",.k3="A"}, + {.descr="Cycle accumulated/accum-bw/current values",.k2="a",.k3="A"}, {.descr="Toggle showing full command line",.k2="c",.k3="C"}, {.descr="Toggle showing TID",.k2="1"}, {.descr="Toggle showing PRIO",.k2="2"}, @@ -166,6 +177,7 @@ {.descr="Toggle showing COMMAND",.k2="9"}, {.descr="Show all columns",.k2="0"}, {.descr="Cycle GRAPH source (IO, R, W, R+W, SW)",.k2="g",.k3="G"}, + {.descr="Toggle reverse GRAPH direction",.k2="R"}, {.descr="Toggle showing inline help",.k2="?"}, {.descr="Toggle showing this help",.k2="h",.k3="H"}, {.descr="IOnice a process/thread",.k2="i",.k3="I"}, @@ -176,8 +188,12 @@ {.descr="Toggle exited processes xxx/inverse",.k2="x",.k3="X"}, {.descr="Toggle showing exited processes",.k2="e",.k3="E"}, {.descr="Toggle data freeze",.k2="s",.k3="S"}, + {.descr=units,.k1="",.k2="",.k3=""}, + {.descr=unitt,.k1="",.k2="",.k3=""}, {.descr="Toggle task_delayacct (if available)",.k1="",.k2="",.k3=""}, {.descr="Redraw screen",.k1="",.k2="",.k3=""}, + {.descr="Reset all settings to their defaults",.k2="D"}, + {.descr="Save current setting in config file",.k2="W"}, {.descr=NULL}, }; @@ -243,9 +259,7 @@ #define COLUMN_L(i) COLUMN_NAME((i)-1) #define COLUMN_R(i) COLUMN_NAME((i)+1) #define SORT_CHAR_IND(x) ((masked_sort_by(0)==x)?(config.f.sort_order==SORT_ASC?1:2):0) -#define SORT_CHAR(x) (((has_unicode&&unicode)?sort_dir_u:sort_dir_a)[SORT_CHAR_IND(x)]) - -#define TIMEDIFF_IN_S(sta,end) ((((sta)==(end))||(sta)==0)?0.0001:(((end)-(sta))/1000.0)) +#define SORT_CHAR(x) (((has_unicode&&config.f.unicode)?sort_dir_u:sort_dir_a)[SORT_CHAR_IND(x)]) inline e_grtype masked_grtype(int isforward) { if (!has_tda) @@ -335,7 +349,7 @@ attron(A_REVERSE); if (from==to) { - if (unicode&&has_unicode) { + if (config.f.unicode&&has_unicode) { mvprintw(from,xpos,"%s",scroll_u[3]); } else { attron(A_REVERSE); @@ -352,7 +366,7 @@ begpos=from; endpos=to; } else { - int u=unicode&&has_unicode; + int u=config.f.unicode&&has_unicode; int linecnt=visible-2; // count of lines usable by scroller int drscale=u?8:1; // draw scale int y=drscale*linecnt; // all scroll space @@ -368,11 +382,11 @@ for (i=from;i<=to;i++) { if (i==from||i==to) { attron(A_REVERSE); - mvprintw(i,xpos,"%s",(unicode&&has_unicode)?scroll_u[i==from?1:2]:scroll_a[i==from?1:2]); + mvprintw(i,xpos,"%s",(config.f.unicode&&has_unicode)?scroll_u[i==from?1:2]:scroll_a[i==from?1:2]); attroff(A_REVERSE); } if (i!=from&&i!=to) { - if (unicode&&has_unicode) { + if (config.f.unicode&&has_unicode) { if (items<=to-from+1) mvprintw(i,xpos,"%s",scroll_u[11]); else { @@ -410,43 +424,78 @@ static inline void view_help(void) { int i,a=c1w,b=c2w,c=c3w,d=cdw; + int hh=getmaxy(whelp); + int hw=getmaxx(whelp); + static int helpcnt=0; const s_helpitem *p; + int can_scroll; - mvwprintw(whelp,0,0,"%s",(has_unicode&&unicode)?"─":"_"); + if (!helpcnt) // count thelp items once + for (p=thelp;p->descr;p++) + helpcnt++; + + // adjust scroll position + if (hh-2>=helpcnt) { // all fits, no scroll + can_scroll=0; + helppos=0; + } else + can_scroll=1; + if (helpcnt-helpposdescr;i++,p++) mvwprintw(whelp,i,0," %-*.*s %-*.*s %-*.*s - %-*.*s ",a,a,p->k1?p->k1:"",b,b,p->k2?p->k2:"",c,c,p->k3?p->k3:"",d,d,p->descr); - mvwprintw(whelp,hh-1,0,"%s",(has_unicode&&unicode)?"─":"_"); + mvwprintw(whelp,hh-1,0,"%s",(has_unicode&&config.f.unicode)?"─":"_"); wattron(whelp,A_REVERSE|A_DIM); - for (i=1;i scroll ");i++) + mvwprintw(whelp,hh-1,i,"%c",(" < > scroll ")[i-vp-2]); + wattroff(whelp,A_REVERSE); + vp+=strlen(" < > scroll "); + for (i=vp;its_o,act->ts_c); + double time_s=timediff_in_s(act->ts_o,act->ts_c); double total_read,total_write; double total_a_read,total_a_write; char pg_t_r[HISTORY_POS*5]={0}; @@ -496,6 +545,7 @@ int gr_width; int diff_len; int saveskip; + int gs,ge,gi; int i,j,k; int maxy; int maxx; @@ -531,7 +581,7 @@ if (maxcmdline<0) maxcmdline=0; - diff_len=create_diff(cs,ps,time_s,filter_view,(has_unicode&&unicode)?gr_width*2:gr_width,&dispcount); + diff_len=create_diff(cs,ps,time_s,act->ts_c,filter_view,(has_unicode&&config.f.unicode)?gr_width*2:gr_width,&dispcount); calc_total(cs,&total_read,&total_write); calc_a_total(act,&total_a_read,&total_a_write,time_s); @@ -594,7 +644,7 @@ } } - for (i=0;i<((has_unicode&&unicode)?gr_width_h*2:gr_width_h);i++) { + for (i=0;i<((has_unicode&&config.f.unicode)?gr_width_h*2:gr_width_h);i++) { if (mx_t_r=ge:j<=ge;j+=gi) { + if (has_unicode&&config.f.unicode) { + strcat(pg_t_r,br_graph[value2scale(hist_t_r[j*2],mx_t_r)][value2scale(hist_t_r[j*2+gi],mx_t_r)]); + strcat(pg_t_w,br_graph[value2scale(hist_t_w[j*2],mx_t_w)][value2scale(hist_t_w[j*2+gi],mx_t_w)]); + strcat(pg_a_r,br_graph[value2scale(hist_a_r[j*2],mx_a_r)][value2scale(hist_a_r[j*2+gi],mx_a_r)]); + strcat(pg_a_w,br_graph[value2scale(hist_a_w[j*2],mx_a_w)][value2scale(hist_a_w[j*2+gi],mx_a_w)]); } else { strcat(pg_t_r,as_graph[value2scale(hist_t_r[j],mx_t_r)]); strcat(pg_t_w,as_graph[value2scale(hist_t_w[j],mx_t_w)]); @@ -714,11 +767,13 @@ maxcmdline--; // vertical scroller - iotop_sort_cb(NULL,(void *)(long)((has_unicode&&unicode)?gr_width*2:gr_width)); + iotop_sort_cb(NULL,(void *)(long)((has_unicode&&config.f.unicode)?gr_width*2:gr_width)); arr_sort(cs,iotop_sort_cb); if (maxy<10) noinlinehelp=1; + else + noinlinehelp=0; line=ionice_line+2; lastline=line; viewsizey=maxy-1-ionice_line-(noinlinehelp==0&&config.f.helptype==2?2:0); @@ -757,7 +812,7 @@ s=ms->threads->sor[k]; } // apply filters - if (filter_view(s,(has_unicode&&unicode)?gr_width*2:gr_width)) + if (filter_view(s,(has_unicode&&config.f.unicode)?gr_width*2:gr_width)) continue; if (skip) { skip--; @@ -766,21 +821,21 @@ for (j=0;jreadhist[j*2]); maxvisible=mymax(maxvisible,s->readhist[j*2+1]); } else maxvisible=mymax(maxvisible,s->readhist[j]); } if (masked_grtype(0)==E_GR_W) { - if (has_unicode&&unicode) { + if (has_unicode&&config.f.unicode) { maxvisible=mymax(maxvisible,s->writehist[j*2]); maxvisible=mymax(maxvisible,s->writehist[j*2+1]); } else maxvisible=mymax(maxvisible,s->writehist[j]); } if (masked_grtype(0)==E_GR_RW) { - if (has_unicode&&unicode) { + if (has_unicode&&config.f.unicode) { maxvisible=mymax(maxvisible,s->readhist[j*2]+s->writehist[j*2]); maxvisible=mymax(maxvisible,s->readhist[j*2+1]+s->writehist[j*2+1]); } else @@ -832,7 +887,7 @@ } } if (!config.f.processes) { - int fres=filter_view(s,(has_unicode&&unicode)?gr_width*2:gr_width); + int fres=filter_view(s,(has_unicode&&config.f.unicode)?gr_width*2:gr_width); if (fres==2) // exited process that is no longer visible; do not count as filtered continue; @@ -857,15 +912,23 @@ s=ms->threads->sor[k]; } // apply filters - if (filter_view(s,(has_unicode&&unicode)?gr_width*2:gr_width)) + if (filter_view(s,(has_unicode&&config.f.unicode)?gr_width*2:gr_width)) continue; if (skip) { skip--; continue; } - read_val=config.f.accumulated?s->read_val_acc:s->read_val; - write_val=config.f.accumulated?s->write_val_acc:s->write_val; + if (config.f.accumbw) { + read_val=s->read_val_abw; + write_val=s->write_val_abw; + } else if (config.f.accumulated) { + read_val=s->read_val_acc; + write_val=s->write_val_acc; + } else { + read_val=s->read_val; + write_val=s->write_val; + } humanize_val(&read_val,read_str,1); humanize_val(&write_val,write_str,1); @@ -882,64 +945,72 @@ hrevpos=-1; if (!config.f.hidegraph) { *graphstr=0; - for (j=0;j=ge:j<=ge;j+=gi) { uint8_t v1=0,v2=0; switch (masked_grtype(0)) { case E_GR_IO: - if (has_unicode&&unicode) { + if (has_unicode&&config.f.unicode) { v1=s->iohist[j*2]; - v2=s->iohist[j*2+1]; + v2=s->iohist[j*2+gi]; } else v1=s->iohist[j]; break; case E_GR_R: - if (has_unicode&&unicode) { + if (has_unicode&&config.f.unicode) { v1=value2scale(s->readhist[j*2],maxvisible); - v2=value2scale(s->readhist[j*2+1],maxvisible); + v2=value2scale(s->readhist[j*2+gi],maxvisible); } else v1=value2scale(s->readhist[j*2],maxvisible); break; case E_GR_W: - if (has_unicode&&unicode) { + if (has_unicode&&config.f.unicode) { v1=value2scale(s->writehist[j*2],maxvisible); - v2=value2scale(s->writehist[j*2+1],maxvisible); + v2=value2scale(s->writehist[j*2+gi],maxvisible); } else v1=value2scale(s->writehist[j*2],maxvisible); break; case E_GR_RW: - if (has_unicode&&unicode) { + if (has_unicode&&config.f.unicode) { v1=value2scale(s->readhist[j*2]+s->writehist[j*2],maxvisible); - v2=value2scale(s->readhist[j*2+1]+s->writehist[j*2+1],maxvisible); + v2=value2scale(s->readhist[j*2+gi]+s->writehist[j*2+gi],maxvisible); } else v1=value2scale(s->readhist[j*2]+s->writehist[j*2],maxvisible); break; case E_GR_SW: - if (has_unicode&&unicode) { + if (has_unicode&&config.f.unicode) { v1=s->sihist[j*2]; - v2=s->sihist[j*2+1]; + v2=s->sihist[j*2+gi]; } else v1=s->sihist[j]; break; } if (config.f.deadx) { // +1 avoids stepping on a char with one valid and one invalid value - if (((has_unicode&&unicode)?j*2+1:j)exited) + if (((has_unicode&&config.f.unicode)?j*2+1:j)exited) strcat(graphstr,"x"); else { - if (has_unicode&&unicode) + if (has_unicode&&config.f.unicode) strcat(graphstr,br_graph[v1][v2]); else strcat(graphstr,as_graph[v1]); } } else { // stepping on a char with one valid and one invalid value is not a problem with background - if (has_unicode&&unicode) + if (has_unicode&&config.f.unicode) strcat(graphstr,br_graph[v1][v2]); else strcat(graphstr,as_graph[v1]); - if (((has_unicode&&unicode)?j*2:j)exited) - hrevpos=strlen(graphstr); + if (config.f.reverse_graph) { + if (((has_unicode&&config.f.unicode)?j*2:j)>=s->exited&&s->exited) + hrevpos=strlen(graphstr); + } else { + if (((has_unicode&&config.f.unicode)?j*2:j)exited&&s->exited) + hrevpos=strlen(graphstr); + } } } strcat(graphstr," "); @@ -1002,27 +1073,36 @@ color_print_pc(s->blkio_val); } if (!config.f.hidegraph&&hrevpos>0) { - attron(A_REVERSE); - printw("%*.*s",hrevpos,hrevpos,graphstr); - attroff(A_REVERSE); - printw("%s",graphstr+hrevpos); + if (config.f.reverse_graph) { + graphstr[strlen(graphstr)-1]=0; // remove last space + printw("%*.*s",hrevpos,hrevpos,graphstr); + attron(A_REVERSE); + printw("%s",graphstr+hrevpos); + attroff(A_REVERSE); + printw(" "); + } else { + attron(A_REVERSE); + printw("%*.*s",hrevpos,hrevpos,graphstr); + attroff(A_REVERSE); + printw("%s",graphstr+hrevpos); + } } else printw("%s",!config.f.hidegraph?graphstr:""); if (!config.f.hidecmd) { - const char *ss=(has_unicode&&unicode)?th_lines_u[0]:th_lines_a[0]; + const char *ss=(has_unicode&&config.f.unicode)?th_lines_u[0]:th_lines_a[0]; if (ms->threads) { if (config.f.processes) { if (k==-1&&ms->threads->length) - ss=(has_unicode&&unicode)?th_lines_u[1]:th_lines_a[1]; + ss=(has_unicode&&config.f.unicode)?th_lines_u[1]:th_lines_a[1]; } else if (th_first_id!=th_last_id) { if (k==th_first_id) - ss=(has_unicode&&unicode)?th_lines_u[2+3*th_have_filtered]:th_lines_a[2+3*th_have_filtered]; + ss=(has_unicode&&config.f.unicode)?th_lines_u[2+3*th_have_filtered]:th_lines_a[2+3*th_have_filtered]; if (k!=th_first_id&&k!=th_last_id) - ss=(has_unicode&&unicode)?th_lines_u[3+3*th_have_filtered]:th_lines_a[3+3*th_have_filtered]; + ss=(has_unicode&&config.f.unicode)?th_lines_u[3+3*th_have_filtered]:th_lines_a[3+3*th_have_filtered]; if (k==th_last_id) - ss=(has_unicode&&unicode)?th_lines_u[4+3*th_have_filtered]:th_lines_a[4+3*th_have_filtered]; + ss=(has_unicode&&config.f.unicode)?th_lines_u[4+3*th_have_filtered]:th_lines_a[4+3*th_have_filtered]; } } printw("%s%s",ss,cmdline?cmdline:"(null)"); @@ -1278,7 +1358,7 @@ printw("a"); attroff(config.f.nocolor?A_ITALIC:COLOR_PAIR(CYAN_PAIR)); attroff(A_UNDERLINE); - printw(": %s ",config.f.accumulated?"bandwidth":"accum"); + printw(": %s ",config.f.accumbw?"bandwidth":config.f.accumulated?"accum-bw":"accum"); attron(A_UNDERLINE); attron(config.f.nocolor?A_ITALIC:COLOR_PAIR(CYAN_PAIR)); @@ -1293,7 +1373,7 @@ printw("u"); attroff(config.f.nocolor?A_ITALIC:COLOR_PAIR(CYAN_PAIR)); attroff(A_UNDERLINE); - printw(": %s ",unicode?"ASCII":"UTF"); + printw(": %s ",config.f.unicode?"ASCII":"UTF"); } attron(A_UNDERLINE); @@ -1630,6 +1710,18 @@ if (in_search) return curses_key_search(ch); switch (ch) { + case 'D': + params.delay=1; + memset(&config,0,sizeof(config)); + config.f.sort_by=SORT_BY_GRAPH; + config.f.sort_order=SORT_DESC; + config.f.base=1024; // use non-SI units by default + config.f.threshold=2; // default threshold is 2*base + config.f.unicode=1; // default is unicode + break; + case 'W': + config_file_save(); + break; case 's': case 'S': dontrefresh^=1; @@ -1647,9 +1739,11 @@ return 1; case ' ': case 'r': - case 'R': config.f.sort_order=(config.f.sort_order==SORT_ASC)?SORT_DESC:SORT_ASC; break; + case 'R': + config.f.reverse_graph=!config.f.reverse_graph; + break; case KEY_HOME: scrollpos=0; break; @@ -1794,7 +1888,15 @@ break; case 'a': case 'A': - config.f.accumulated=!config.f.accumulated; + if (!config.f.accumbw&&!config.f.accumulated) + config.f.accumulated=1; + else if (!config.f.accumbw&&config.f.accumulated) { + config.f.accumulated=0; + config.f.accumbw=1; + } else { + config.f.accumulated=0; + config.f.accumbw=0; + } break; case 'l': case 'L': @@ -1810,11 +1912,20 @@ break; case 'h': case 'H': - if (config.f.helptype!=1) + if (config.f.helptype!=1) { config.f.helptype=1; - else + helppos=0; + } else config.f.helptype=0; break; + case '<': + if (config.f.helptype==1) // out of bounds checks are in view_help + helppos--; + break; + case '>': + if (config.f.helptype==1) + helppos++; + break; case 'c': case 'C': config.f.fullcmdline=!config.f.fullcmdline; @@ -1869,7 +1980,7 @@ break; case 'u': case 'U': - unicode=!unicode; + config.f.unicode=!config.f.unicode; break; case 'x': case 'X': @@ -2023,6 +2134,14 @@ update_search(); } break; + case KEY_CTRL_B: + config.f.base=config.f.base==1000?1024:1000; + break; + case KEY_CTRL_R: + config.f.threshold++; + if (config.f.threshold>10) + config.f.threshold=1; + break; case KEY_CTRL_T: write_task_delayacct(!read_task_delayacct()); break; diff -Nru iotop-c-1.22/src/views.c iotop-c-1.23/src/views.c --- iotop-c-1.22/src/views.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/views.c 2023-01-23 22:56:03.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -33,8 +33,21 @@ } } -#define RRV(to,from) (((to)<(from))?(~0ULL)-(to)+(from):(to)-(from)) -#define RRVf(pto,pfrom,fld) RRV(pto->fld,pfrom->fld) +static inline uint64_t rrv(uint64_t to,uint64_t from) { + uint64_t result; + + if (toread_bytes; uint64_t w=act->write_bytes; - r=RRV(r,act->read_bytes_o); - w=RRV(w,act->write_bytes_o); + r=rrv(r,act->read_bytes_o); + w=rrv(w,act->write_bytes_o); *read=(double)r/time_s; *write=(double)w/time_s; } @@ -64,7 +77,7 @@ return 0; } -inline int create_diff(struct xxxid_stats_arr *cs,struct xxxid_stats_arr *ps,double time_s,filter_callback_w cb,int width,int *cnt) { +inline int create_diff(struct xxxid_stats_arr *cs,struct xxxid_stats_arr *ps,double time_s,uint64_t ts_c,filter_callback_w cb,int width,int *cnt) { int n=0; if (cnt) @@ -85,23 +98,29 @@ c->write_val=0; c->read_val_acc=0; c->write_val_acc=0; + c->read_val_abw=0; + c->write_val_abw=0; + c->ts_s=ts_c; // keep start ts + c->ts_e=ts_c; // keep end ts snprintf(temp,sizeof temp,"%i",c->tid); maxpidlen=maxpidlen<(int)strlen(temp)?(int)strlen(temp):maxpidlen; continue; } + c->ts_s=p->ts_s; // update end ts + c->ts_e=ts_c; // update end ts // round robin value - c->blkio_val=(double)RRVf(c,p,blkio_delay_total)/(time_s*10000000.0); + c->blkio_val=(double)rrv(c->blkio_delay_total,p->blkio_delay_total)/(time_s*10000000.0); if (c->blkio_val>100) c->blkio_val=100; - c->swapin_val=(double)RRVf(c,p,swapin_delay_total)/(time_s*10000000.0); + c->swapin_val=(double)rrv(c->swapin_delay_total,p->swapin_delay_total)/(time_s*10000000.0); if (c->swapin_val>100) c->swapin_val=100; - rv=(double)RRVf(c,p,read_bytes); - wv=(double)RRVf(c,p,write_bytes); + rv=(double)rrv(c->read_bytes,p->read_bytes); + wv=(double)rrv(c->write_bytes,p->write_bytes); c->read_val=rv/time_s; c->write_val=wv/time_s; @@ -109,6 +128,9 @@ c->read_val_acc=p->read_val_acc+rv; c->write_val_acc=p->write_val_acc+wv; + c->read_val_abw=c->read_val_acc/timediff_in_s(c->ts_s,c->ts_e); + c->write_val_abw=c->write_val_acc/timediff_in_s(c->ts_s,c->ts_e); + memcpy(c->iohist+1,p->iohist,sizeof c->iohist-sizeof *c->iohist); c->iohist[0]=value2scale(c->blkio_val,100.0); memcpy(c->sihist+1,p->sihist,sizeof c->sihist-sizeof *c->sihist); @@ -133,8 +155,6 @@ ps->arr[n]->swapin_val=0; ps->arr[n]->read_val=0; ps->arr[n]->write_val=0; - ps->arr[n]->read_val_acc=0; - ps->arr[n]->write_val_acc=0; // copy process data to cs p=malloc(sizeof *p); if (p) { @@ -199,11 +219,11 @@ if (config.f.kilobytes) { p=1; - *value/=1000.0; + *value/=(double)config.f.base; } else { - while (*value>10000) { + while (*value>config.f.base*config.f.threshold) { if (p+1pw_name,pb->pw_name); break; case SORT_BY_READ: - if (config.f.accumulated) + if (config.f.accumbw) + res=pa->read_val_abw>pb->read_val_abw?1:pa->read_val_abwread_val_abw?-1:0; + else if (config.f.accumulated) res=pa->read_val_acc>pb->read_val_acc?1:pa->read_val_accread_val_acc?-1:0; else res=pa->read_val>pb->read_val?1:pa->read_valread_val?-1:0; break; case SORT_BY_WRITE: - if (config.f.accumulated) + if (config.f.accumbw) + res=pa->write_val_abw>pb->write_val_abw?1:pa->write_val_abwwrite_val_abw?-1:0; + else if (config.f.accumulated) res=pa->write_val_acc>pb->write_val_acc?1:pa->write_val_accwrite_val_acc?-1:0; else res=pa->write_val>pb->write_val?1:pa->write_valwrite_val?-1:0; diff -Nru iotop-c-1.22/src/vmstat.c iotop-c-1.23/src/vmstat.c --- iotop-c-1.22/src/vmstat.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/vmstat.c 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. diff -Nru iotop-c-1.22/src/xxxid_info.c iotop-c-1.23/src/xxxid_info.c --- iotop-c-1.22/src/xxxid_info.c 2022-07-03 08:13:58.000000000 +0000 +++ iotop-c-1.23/src/xxxid_info.c 2023-01-22 04:00:53.000000000 +0000 @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-or-later Copyright (C) 2014 Vyacheslav Trushkin -Copyright (C) 2020-2022 Boian Bonev +Copyright (C) 2020-2023 Boian Bonev This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.