aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/top
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2019-09-27 20:20:21 +0000
committerDimitry Andric <dim@FreeBSD.org>2019-09-27 20:20:21 +0000
commita6f721ece8259d41096eae6527ff0b2c101144a1 (patch)
treea58cade6b18d3214174329382c672cdbb829f081 /usr.bin/top
parentb2dba6634b0bbcca6112c46e081ae929d9b4cb1c (diff)
downloadsrc-a6f721ece8259d41096eae6527ff0b2c101144a1.tar.gz
src-a6f721ece8259d41096eae6527ff0b2c101144a1.zip
Notes
Diffstat (limited to 'usr.bin/top')
-rw-r--r--usr.bin/top/top.12
-rw-r--r--usr.bin/top/top.c50
2 files changed, 28 insertions, 24 deletions
diff --git a/usr.bin/top/top.1 b/usr.bin/top/top.1
index a26fbc181229..5b422fffe737 100644
--- a/usr.bin/top/top.1
+++ b/usr.bin/top/top.1
@@ -147,7 +147,7 @@ no information is available about the percentage of time spent by the CPU in eve
.It Fl s Ar time
Set the delay between screen updates to
.Ar time
-seconds.
+seconds, which may be fractional.
The default delay between updates is 1 second.
.It Fl o Ar field
Sort the process display area on the specified field.
diff --git a/usr.bin/top/top.c b/usr.bin/top/top.c
index 01cad421b64c..cd357a092e9f 100644
--- a/usr.bin/top/top.c
+++ b/usr.bin/top/top.c
@@ -233,7 +233,7 @@ main(int argc, const char *argv[])
static char tempbuf2[50];
sigset_t old_sigmask, new_sigmask;
int topn = Infinity;
- double delay = 2;
+ struct timeval delay = { 2, 0 };
int displays = 0; /* indicates unspecified */
int sel_ret = 0;
time_t curr_time;
@@ -377,20 +377,26 @@ main(int argc, const char *argv[])
break;
}
- case 's':
- delay = strtod(optarg, &nptr);
- if (nptr == optarg) {
- warnx("warning: invalid delay");
- delay = 2;
- warnings++;
- }
- if (delay < 0) {
- warnx("warning: seconds delay should be positive -- using default");
- delay = 2;
- warnings++;
- }
-
- break;
+ case 's':
+ {
+ double delay_d = strtod(optarg, &nptr);
+ if (nptr == optarg)
+ {
+ warnx("warning: invalid delay");
+ warnings++;
+ }
+ else if (delay_d <= 0)
+ {
+ warnx("warning: seconds delay should be positive -- using default");
+ warnings++;
+ }
+ else
+ {
+ delay.tv_sec = delay_d;
+ delay.tv_usec = (delay_d - delay.tv_sec) * 1e6;
+ }
+ break;
+ }
case 'q': /* be quick about it */
errno = 0;
@@ -704,7 +710,8 @@ restart:
no_command = true;
if (!interactive)
{
- usleep(delay * 1e6);
+ timeout = delay;
+ select(0, NULL, NULL, NULL, &timeout);
if (leaveflag) {
end_screen();
exit(0);
@@ -718,8 +725,7 @@ restart:
/* set up arguments for select with timeout */
FD_ZERO(&readfds);
FD_SET(0, &readfds); /* for standard input */
- timeout.tv_sec = delay;
- timeout.tv_usec = 0;
+ timeout = delay;
if (leaveflag) {
end_screen();
@@ -880,12 +886,10 @@ restart:
case CMD_delay: /* new seconds delay */
new_message(MT_standout, "Seconds to delay: ");
- if ((i = readline(tempbuf1, 8, true)) > -1)
+ if ((i = readline(tempbuf1, 8, true)) > 0)
{
- if ((delay = i) == 0)
- {
- delay = 1;
- }
+ delay.tv_sec = i;
+ delay.tv_usec = 0;
}
clear_message();
break;