X-Git-Url: http://git.liburcu.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Flockfile.cpp;h=3e972fbac597baff8b915838553ae2581540baaa;hp=5dce37d6fd2f5aa7f5ad1bc763dad987957eb117;hb=e560c525031d7aba481e0b8655c48a14bade24c2;hpb=513792873b851baef066648b41f9cbfe978063fc diff --git a/src/common/lockfile.cpp b/src/common/lockfile.cpp index 5dce37d6f..3e972fbac 100644 --- a/src/common/lockfile.cpp +++ b/src/common/lockfile.cpp @@ -10,49 +10,93 @@ #include #include +#include + #ifdef HAVE_FLOCK +#include + +static int lock_file(const char *filepath, int fd) +{ + int ret; + + /* + * Attempt to lock the file. If this fails, there is + * already a process using the same lock file running + * and we should exit. + */ + ret = flock(fd, LOCK_EX | LOCK_NB); + if (ret == -1) { + /* EWOULDBLOCK are expected if the file is locked: don't spam the logs. */ + if (errno != EWOULDBLOCK) { + PERROR("Failed to apply lock on lock file: file_path=`%s`", filepath); + } + } + + return ret; +} + #else /* HAVE_FLOCK */ -#include +static int lock_file(const char *filepath, int fd) +{ + int ret; + struct flock lock = {}; + + lock.l_whence = SEEK_SET; + lock.l_type = F_WRLCK; + + /* + * Attempt to lock the file. If this fails, there is + * already a process using the same lock file running + * and we should exit. + */ + ret = fcntl(fd, F_SETLK, &lock); + if (ret == -1) { + /* EAGAIN and EACCESS are expected if the file is locked: don't spam the logs. */ + if (errno != EAGAIN && errno != EACCES) { + PERROR("Failed to set lock on lock file: file_path=`%s`", filepath); + } + } + + return ret; +} + +#endif /* HAVE_FLOCK */ int utils_create_lock_file(const char *filepath) { - int ret; - int fd; - struct flock lock; + int ret, fd; LTTNG_ASSERT(filepath); - memset(&lock, 0, sizeof(lock)); fd = open(filepath, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); if (fd < 0) { - PERROR("open lock file %s", filepath); + PERROR("Failed to open lock file `%s`", filepath); fd = -1; goto error; } /* - * Attempt to lock the file. If this fails, there is - * already a process using the same lock file running - * and we should exit. + * Attempt to lock the file. If this fails, there is already a process using the same lock + * file running and we should exit. + * + * lock_file is chosen based on the build configuration, see implementations above. */ - lock.l_whence = SEEK_SET; - lock.l_type = F_WRLCK; - - ret = fcntl(fd, F_SETLK, &lock); + ret = lock_file(filepath, fd); if (ret == -1) { - PERROR("fcntl lock file"); - ERR("Could not get lock file %s, another instance is running.", filepath); + ERR("Could not get lock file `%s`, another instance is running.", filepath); + if (close(fd)) { - PERROR("close lock file"); + PERROR("Failed to close lock file fd: fd=%d", fd); } + fd = ret; goto error; } + DBG_FMT("Acquired lock file: file_path={}", filepath); + error: return fd; -} - -#endif /* HAVE_FLOCK */ \ No newline at end of file +} \ No newline at end of file