Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Nov 2001 11:20:01 -0800 (PST)
From:      "Andrew R. Reiter" <arr@FreeBSD.org>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/32138: better progress reporting for dump(8) 
Message-ID:  <200111201920.fAKJK1W89184@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/32138; it has been noted by GNATS.

From: "Andrew R. Reiter" <arr@FreeBSD.org>
To: Mikhail Teterin <mi@aldan.algebra.com>
Cc: iedowse@maths.tcd.ie, arr@FreeBSD.org,
	FreeBSD-gnats-submit@FreeBSD.org
Subject: Re: bin/32138: better progress reporting for dump(8) 
Date: Tue, 20 Nov 2001 14:18:05 -0500 (EST)

 :
 :What's not safe about it? The only thing happening in the signal handler
 :is ``tschedule -= 300;''.  I think, it is quite safe --  see above I can
 :even make it ``if (tschedule > 300) tschedule -= 300;'' :-) Could you be
 :more specific? Thanks!
 :
 :	-mi
 
 just quickly:
  - signal handlers really should just set a flag and then check the flag
 at the appropriate time (depending on how your program flow is).
  - setproctitle(3) is not safe to use within a handler
 
 
 :
 :How about this:
 :Index: dump.8
 :===================================================================
 :RCS file: /home/ncvs/src/sbin/dump/dump.8,v
 :retrieving revision 1.39
 :diff -U2 -r1.39 dump.8
 :--- dump.8	15 Jul 2001 14:00:19 -0000	1.39
 :+++ dump.8	20 Nov 2001 19:07:30 -0000
 :@@ -320,5 +320,6 @@
 : .Pp
 : .Nm Dump
 :-tells the operator what is going on at periodic intervals,
 :+tells the operator what is going on at periodic intervals --
 :+every 5 minutes, or promptly after receiving SIGINFO --
 : including usually low estimates of the number of blocks to write,
 : the number of tapes it will take, the time to completion, and
 :Index: dump.h
 :===================================================================
 :RCS file: /home/ncvs/src/sbin/dump/dump.h,v
 :retrieving revision 1.11
 :diff -U2 -r1.11 dump.h
 :--- dump.h	17 Nov 2001 00:06:55 -0000	1.11
 :+++ dump.h	20 Nov 2001 19:07:30 -0000
 :@@ -96,4 +96,5 @@
 : /* operator interface functions */
 : void	broadcast __P((char *message));
 :+void	infosch	__P((int));
 : void	lastdump __P((int arg));	/* int should be char */
 : void	msg __P((const char *fmt, ...)) __printflike(1, 2);
 :@@ -103,4 +104,5 @@
 : void	timeest __P((void));
 : time_t	unctime __P((char *str));
 :+void	title __P((void));
 : 
 : /* mapping rouintes */
 :Index: optr.c
 :===================================================================
 :RCS file: /home/ncvs/src/sbin/dump/optr.c,v
 :retrieving revision 1.16
 :diff -U2 -r1.16 optr.c
 :--- optr.c	17 Nov 2001 00:06:55 -0000	1.16
 :+++ optr.c	20 Nov 2001 19:07:30 -0000
 :@@ -52,4 +52,5 @@
 : #include <string.h>
 : #include <stdarg.h>
 :+#include <signal.h>
 : #include <unistd.h>
 : #include <utmp.h>
 :@@ -188,5 +189,5 @@
 :  */
 : 
 :-time_t	tschedule = 0;
 :+static time_t	tschedule = 0;
 : 
 : void
 :@@ -196,9 +197,7 @@
 : 	int deltat;
 : 
 :-	(void) time((time_t *) &tnow);
 :+	(void) time(&tnow);
 : 	if (tnow >= tschedule) {
 : 		tschedule = tnow + 300;
 :-		if (blockswritten < 500)
 :-			return;
 : 		deltat = tstart_writing - tnow +
 : 			(1.0 * (tnow - tstart_writing))
 :@@ -207,7 +206,21 @@
 : 			(blockswritten * 100.0) / tapesize,
 : 			deltat / 3600, (deltat % 3600) / 60);
 :+		title();
 : 	}
 : }
 : 
 :+/*
 :+ *	Reschedule the next printout of the estimate
 :+ */
 :+void
 :+infosch(int signal) {
 :+	/*
 :+	 * 300 seconds -- 5 minutes -- is the magical constant,
 :+	 * only used in this file
 :+	 */
 :+	if (tschedule > 300)
 :+		tschedule -= 300;
 :+}
 :+
 : void
 : #if __STDC__
 :@@ -235,4 +248,31 @@
 : 	(void) vsnprintf(lastmsg, sizeof(lastmsg), fmt, ap);
 : 	va_end(ap);
 :+}
 :+
 :+/*
 :+ * This function can be called to place, what msg() above pushed to
 :+ * stderr, into the process title, viewable with the ps-command.
 :+ * A side effect of this function, is it replaces the final '\n' (if any)
 :+ * with the '\0' in the global variable lastmsg -- to avoid the literal
 :+ * "\n" being put into the proctitle.
 :+ * So, if the lastmsg needs to be output elsewhere, that should happen
 :+ * before calling title().
 :+ */
 :+void title()
 :+{
 :+	int lastlen;
 :+
 :+	lastlen = strlen(lastmsg);
 :+	if (lastmsg[lastlen-1] == '\n')
 :+		lastmsg[lastlen-1] = '\0';
 :+
 :+	/*
 :+	 * It would be unwise to run multiple dumps of same disk
 :+	 * at  the  same time.  So  ``disk''  is sufficient  for
 :+	 * identifying, to  which family of dump  processes this
 :+	 * one belongs  -- the other processes  continue to have
 :+	 * the original titles.
 :+	 */
 :+	setproctitle("%s: %s", disk, lastmsg);
 : }
 : 
 :Index: tape.c
 :===================================================================
 :RCS file: /home/ncvs/src/sbin/dump/tape.c,v
 :retrieving revision 1.14
 :diff -U2 -r1.14 tape.c
 :--- tape.c	17 Nov 2001 00:06:55 -0000	1.14
 :+++ tape.c	20 Nov 2001 19:07:31 -0000
 :@@ -522,4 +522,5 @@
 : 	 *	All signals are inherited...
 : 	 */
 :+	setproctitle(NULL); /* restore the proctitle modified by title() */
 : 	childpid = fork();
 : 	if (childpid < 0) {
 :@@ -612,4 +613,5 @@
 : 
 : 		enslave();  /* Share open tape file descriptor with slaves */
 :+		signal(SIGINFO, infosch); /* report progress on SIGINFO */
 : 
 : 		asize = 0;
 :
 :
 :
 
 --
 Andrew R. Reiter
 arr@watson.org
 arr@FreeBSD.org
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200111201920.fAKJK1W89184>