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 - [email protected]
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);
}
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "[email protected]"