util: Workaround lack of flock on Solaris
authorAlan Coopersmith <alan.coopersmith@oracle.com>
Sat, 22 Apr 2017 04:57:50 +0000 (21:57 -0700)
committerEric Engestrom <eric.engestrom@intel.com>
Wed, 16 Oct 2019 12:45:57 +0000 (13:45 +0100)
v2: Replace autoconf check for flock() with meson check

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Acked-by: Eric Engestrom <eric.engestrom@intel.com>
meson.build
src/util/disk_cache.c

index c96f1ed0f7be7e756883d2e4002926ff6ccfbef3..e1ca9559b56b290a2bbedb1696add46479d88185 100644 (file)
@@ -1144,7 +1144,7 @@ foreach h : ['xlocale.h', 'sys/sysctl.h', 'linux/futex.h', 'endian.h', 'dlfcn.h'
   endif
 endforeach
 
-foreach f : ['strtof', 'mkostemp', 'timespec_get', 'memfd_create', 'random_r']
+foreach f : ['strtof', 'mkostemp', 'timespec_get', 'memfd_create', 'random_r', 'flock']
   if cc.has_function(f)
     pre_args += '-DHAVE_@0@'.format(f.to_upper())
   endif
index 9272e9c547185a65d8ba643d6561a5f8f85f102b..77af64ed3b04d3ee08a52039e200eefe248251bb 100644 (file)
@@ -907,7 +907,17 @@ cache_put(void *job, int thread_index)
     * open with the flock held. So just let that file be responsible
     * for writing the file.
     */
+#ifdef HAVE_FLOCK
    err = flock(fd, LOCK_EX | LOCK_NB);
+#else
+   struct flock lock = {
+      .l_start = 0,
+      .l_len = 0, /* entire file */
+      .l_type = F_WRLCK,
+      .l_whence = SEEK_SET
+   };
+   err = fcntl(fd, F_SETLK, &lock);
+#endif
    if (err == -1)
       goto done;