diff options
author | Alan Conway <aconway@apache.org> | 2008-07-08 15:56:04 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2008-07-08 15:56:04 +0000 |
commit | 1b4c02dc9fbef138f7ed59550d533fe3ae13017f (patch) | |
tree | 3b82530feeac8cccbcba94ad26f776ce07a9651f /cpp/src/qpid/DataDir.cpp | |
parent | 43664d69dc90c128ad3f73327ac8331b02d7a38c (diff) | |
download | qpid-python-1b4c02dc9fbef138f7ed59550d533fe3ae13017f.tar.gz |
QPID-1148 - from Manuel Tiera
Lock file abstraction in sys/ with implementation portable to Linux and Solaris.
Changes by myself:
- Makefile.am - must be updated for any new/renamed/removed source files.
- Exception.h, Daemon.h, LockFile.h: Replaced throwIf() with if (...) throw ErrnoException(...)
The idiom throwIf(call-system-function(), "msg", errno) is incorret
(my fault, not Manuels). It assumes the first argument that makes a
system call call will be evaluated before the last one which fetches
errno. This may not be true on some compilers/platforms.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@674865 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/DataDir.cpp')
-rw-r--r-- | cpp/src/qpid/DataDir.cpp | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/cpp/src/qpid/DataDir.cpp b/cpp/src/qpid/DataDir.cpp index 879f4de202..18b52b9b8f 100644 --- a/cpp/src/qpid/DataDir.cpp +++ b/cpp/src/qpid/DataDir.cpp @@ -26,13 +26,13 @@ #include <sys/file.h> #include <fcntl.h> #include <cerrno> +#include <unistd.h> namespace qpid { DataDir::DataDir (std::string path) : enabled (!path.empty ()), - dirPath (path), - dirFd(-1) + dirPath (path) { if (!enabled) { @@ -50,24 +50,12 @@ DataDir::DataDir (std::string path) : else throw Exception ("Data directory not found: " + path); } - int dirFd = ::open(path.c_str(), 0); - if (dirFd == -1) - throw Exception(QPID_MSG("Can't open data directory: " << dirPath << ": " << strError(errno))); - int result = ::flock(dirFd, LOCK_EX | LOCK_NB); - if (result != 0) { - if (errno == EWOULDBLOCK) - throw Exception(QPID_MSG("Data directory locked by another process: " << path)); - throw Exception(QPID_MSG("Cannot lock data directory: " << strError(errno))); - } - QPID_LOG (info, "Locked data directory: " << dirPath); + std::string lockFileName(path); + lockFileName += "/lock"; + lockFile = std::auto_ptr<sys::LockFile>(new sys::LockFile(lockFileName, true)); } -DataDir::~DataDir () { - if (dirFd != -1) { - ::close(dirFd); // Closing the fd unlocks the directory. - QPID_LOG (info, "Unlocked data directory: " << dirPath); - } -} +DataDir::~DataDir () {} } // namespace qpid |