From 61dc021c06a1c9ab7e525eba52d6b183ad89f483 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Fri, 13 Sep 2019 22:09:32 +0100 Subject: [PATCH] locking.c: Explain why the code has an apparently pointless `stat' call. --- locking.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/locking.c b/locking.c index bfc5c77..6317b2e 100644 --- a/locking.c +++ b/locking.c @@ -192,6 +192,13 @@ again: if (fstat(fd, &st)) die(111, "error from fstat on `%s': %s", file, strerror(errno)); err = fcntl(fd, f & f_wait ? F_SETLKW : F_SETLK, &l) >= 0 ? 0 : errno; + /* It's tempting to `optimize' this code by opening a new file descriptor + * here so as to elide the additional call to fstat(2) above. But this + * doesn't work: if we successfully acquire the lock, we then have two file + * descriptors open on the lock file, so we have to close one -- but, under + * the daft fcntl(2) rules, even closing `nfd' will release the lock + * immediately. + */ if (stat(file, &nst)) { if (errno == ENOENT) { close(fd); goto again; } else die(111, "error from stat on `%s': %s", file, strerror(errno)); -- 2.11.0