summaryrefslogtreecommitdiffstats
path: root/lib/libutil/pidfile.c
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2011-10-16 21:30:15 +0000
committerpjd <pjd@FreeBSD.org>2011-10-16 21:30:15 +0000
commit770f64229ce141801d6971ceea42082015323a53 (patch)
tree7dd9db17078c6dc0d10bafacfead86efc28d0572 /lib/libutil/pidfile.c
parent2cd40fe2b68029b4e3872631ccfea41808316a14 (diff)
downloadFreeBSD-src-770f64229ce141801d6971ceea42082015323a53.zip
FreeBSD-src-770f64229ce141801d6971ceea42082015323a53.tar.gz
In pidfile_open(), if the pidfile is locked, but empty (PID is not stored yet)
and the caller requested other process' PID by passing non-NULL pidptr argument, we will wait at most 100ms for the PID to show up in the file and if it won't, we will store -1 in *pidptr. From now on, pidfile_open() function never sets errno to EAGAIN on failure. In collaboration with: des MFC after: 1 week
Diffstat (limited to 'lib/libutil/pidfile.c')
-rw-r--r--lib/libutil/pidfile.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/lib/libutil/pidfile.c b/lib/libutil/pidfile.c
index 6b99936..953d1e0 100644
--- a/lib/libutil/pidfile.c
+++ b/lib/libutil/pidfile.c
@@ -119,20 +119,20 @@ pidfile_open(const char *path, mode_t mode, pid_t *pidptr)
fd = flopen(pfh->pf_path,
O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK, mode);
if (fd == -1) {
- count = 0;
- rqtp.tv_sec = 0;
- rqtp.tv_nsec = 5000000;
if (errno == EWOULDBLOCK && pidptr != NULL) {
- again:
- errno = pidfile_read(pfh->pf_path, pidptr);
- if (errno == 0)
- errno = EEXIST;
- else if (errno == EAGAIN) {
- if (++count <= 3) {
- nanosleep(&rqtp, 0);
- goto again;
- }
+ count = 20;
+ rqtp.tv_sec = 0;
+ rqtp.tv_nsec = 5000000;
+ for (;;) {
+ errno = pidfile_read(pfh->pf_path, pidptr);
+ if (errno != EAGAIN || --count == 0)
+ break;
+ nanosleep(&rqtp, 0);
}
+ if (errno == EAGAIN)
+ *pidptr = -1;
+ if (errno == 0 || errno == EAGAIN)
+ errno = EEXIST;
}
free(pfh);
return (NULL);
OpenPOWER on IntegriCloud