diff options
author | pjd <pjd@FreeBSD.org> | 2011-10-16 21:30:15 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2011-10-16 21:30:15 +0000 |
commit | 770f64229ce141801d6971ceea42082015323a53 (patch) | |
tree | 7dd9db17078c6dc0d10bafacfead86efc28d0572 /lib/libutil/pidfile.c | |
parent | 2cd40fe2b68029b4e3872631ccfea41808316a14 (diff) | |
download | FreeBSD-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.c | 24 |
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); |