LibCore: Add LockFile, a filesystem based mutex

This API wraps flock(2) and also handles the file creation and deletion
when the LockFile goes out of scope.
This commit is contained in:
Peter Elliott 2021-07-21 21:04:24 -06:00 committed by Andreas Kling
parent 7da12f0faf
commit fdcfd2816e
Notes: sideshowbarker 2024-07-18 08:30:32 +09:00
3 changed files with 90 additions and 0 deletions

View File

@ -15,6 +15,7 @@ set(SOURCES
IODevice.cpp
LocalServer.cpp
LocalSocket.cpp
LockFile.cpp
MimeData.cpp
NetworkJob.cpp
NetworkResponse.cpp

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2021, Peter Elliott <pelliott@ualberta.ca>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibCore/File.h>
#include <LibCore/LockFile.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/file.h>
#include <unistd.h>
namespace Core {
LockFile::LockFile(char const* filename, Type type)
: m_filename(filename)
{
if (!Core::File::ensure_parent_directories(m_filename))
return;
m_fd = open(filename, O_RDONLY | O_CREAT, 0666);
if (m_fd == -1) {
m_errno = errno;
return;
}
if (flock(m_fd, LOCK_NB | ((type == Type::Exclusive) ? LOCK_EX : LOCK_SH)) == -1) {
m_errno = errno;
close(m_fd);
m_fd = -1;
}
}
LockFile::~LockFile()
{
release();
}
bool LockFile::is_held() const
{
return m_fd != -1;
}
void LockFile::release()
{
if (m_fd == -1)
return;
unlink(m_filename);
flock(m_fd, LOCK_NB | LOCK_UN);
close(m_fd);
m_fd = -1;
}
}

View File

@ -0,0 +1,32 @@
/*
* Copyright (c) 2021, Peter Elliott <pelliott@ualberta.ca>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
namespace Core {
class LockFile {
public:
enum class Type {
Exclusive,
Shared
};
LockFile(LockFile const& other) = delete;
LockFile(char const* filename, Type type = Type::Exclusive);
~LockFile();
bool is_held() const;
int error_code() const { return m_errno; }
void release();
private:
int m_fd { -1 };
int m_errno { 0 };
char const* m_filename { nullptr };
};
}