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
[-- Attachment #1 --]
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
--
Dag-Erling Smørgrav - des@des.no
[-- Attachment #2 --]
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>
