Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Oct 2011 14:54:16 +0200
From:      =?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?= <des@des.no>
To:        current@freebsd.org
Cc:        pjd@freebsd.org
Subject:   Re: incorrect use of pidfile(3)
Message-ID:  <864nzdaw7b.fsf@ds4.des.no>
In-Reply-To: <86pqi1b1qp.fsf@ds4.des.no> ("Dag-Erling =?utf-8?Q?Sm=C3=B8rg?= =?utf-8?Q?rav=22's?= message of "Thu, 13 Oct 2011 12:54:38 %2B0200")
References:  <86pqi1b1qp.fsf@ds4.des.no>

next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

After discussing this with pjd@ on IRC, I arrived at the attached patch,
which increases the length of time pidfile_open() itself waits (I hadn't
noticed that it already looped) and sets *pidptr to -1 if it fails to read
a pid.

DES
--=20
Dag-Erling Sm=C3=B8rgrav - des@des.no


--=-=-=
Content-Type: text/x-patch
Content-Disposition: inline; filename=pidfile_open-loop.diff

Index: lib/libutil/pidfile.c
===================================================================
--- lib/libutil/pidfile.c	(revision 226271)
+++ lib/libutil/pidfile.c	(working copy)
@@ -118,22 +118,19 @@
 	 */
 	fd = flopen(pfh->pf_path,
 	    O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK, mode);
-	if (fd == -1) {
-		count = 0;
+	if (fd == -1 && errno == EWOULDBLOCK && pidptr != NULL) {
+		*pidptr = -1;
+		count = 20;
 		rqtp.tv_sec = 0;
 		rqtp.tv_nsec = 5000000;
-		if (errno == EWOULDBLOCK && pidptr != NULL) {
-		again:
+		for (;;) {
 			errno = pidfile_read(pfh->pf_path, pidptr);
-			if (errno == 0)
-				errno = EEXIST;
-			else if (errno == EAGAIN) {
-				if (++count <= 3) {
-					nanosleep(&rqtp, 0);
-					goto again;
-				}
-			}
+			if (errno != EAGAIN || --count == 0)
+				break;
+			nanosleep(&rqtp, 0);
 		}
+		if (errno == 0)
+			errno = EEXIST;
 		free(pfh);
 		return (NULL);
 	}

--=-=-=--



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