diff options
author | Zdenek Prikryl <zprikryl@redhat.com> | 2009-02-12 17:58:20 +0100 |
---|---|---|
committer | Zdenek Prikryl <zprikryl@redhat.com> | 2009-02-12 17:58:20 +0100 |
commit | a7d954d98109ecb09c7440f5bba7deca3e4c538b (patch) | |
tree | 39bea2139ddaad26dc72dfd88f38e16bd9657925 /lib | |
parent | ad3b6d23b32a1008c02bcc08609966d54e6224e4 (diff) | |
download | abrt-a7d954d98109ecb09c7440f5bba7deca3e4c538b.tar.gz abrt-a7d954d98109ecb09c7440f5bba7deca3e4c538b.tar.xz abrt-a7d954d98109ecb09c7440f5bba7deca3e4c538b.zip |
fixed lock functionality
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Utils/DebugDump.cpp | 72 | ||||
-rw-r--r-- | lib/Utils/DebugDump.h | 6 |
2 files changed, 59 insertions, 19 deletions
diff --git a/lib/Utils/DebugDump.cpp b/lib/Utils/DebugDump.cpp index 14b77906..19d3a2be 100644 --- a/lib/Utils/DebugDump.cpp +++ b/lib/Utils/DebugDump.cpp @@ -34,29 +34,22 @@ #include <ctype.h> #include <time.h> #include <unistd.h> -#include <stdio.h> CDebugDump::CDebugDump() : - m_sDebugDumpDir("") + m_sDebugDumpDir(""), + m_nFD(0), + m_bLockCreated(false) {} void CDebugDump::Open(const std::string& pDir) { - int fd; m_sDebugDumpDir = pDir; std::string lockPath = m_sDebugDumpDir + "/.lock"; if (!ExistFileDir(pDir)) { throw "CDebugDump::CDebugDump(): "+pDir+" does not exist."; } - if ((m_nFD = open(lockPath.c_str(), O_RDWR | O_CREAT, 0640)) < 0) - { - throw std::string("CDebugDump::Open(): can not create lock file"); - } - if (lockf(m_nFD,F_LOCK, 0) < 0) - { - throw std::string("CDebugDump::Open(): cannot lock DebugDump"); - } + Lock(); } bool CDebugDump::Exist(const std::string& pPath) @@ -79,13 +72,59 @@ bool CDebugDump::ExistFileDir(const std::string& pPath) return false; } +void CDebugDump::Lock() +{ + std::string lockPath = m_sDebugDumpDir + ".lock"; + if (ExistFileDir(lockPath)) + { + if ((m_nFD = open(lockPath.c_str(), O_RDWR | O_CREAT, 0640)) < 0) + { + throw std::string("CDebugDump::Create(): can not create lock file"); + } + m_bLockCreated = false; + } + else + { + if ((m_nFD = open(lockPath.c_str(), O_RDWR | O_CREAT, 0640)) < 0) + { + throw std::string("CDebugDump::Create(): can not create lock file"); + } + m_bLockCreated = true; + } + if (lockf(m_nFD,F_LOCK, 0) < 0) + { + throw std::string("CDebugDump::Create(): cannot lock DebugDump"); + } +} + +void CDebugDump::UnLock() +{ + std::string lockPath = m_sDebugDumpDir + ".lock"; + lockf(m_nFD,F_ULOCK, 0); + close(m_nFD); + if (m_bLockCreated) + { + remove(lockPath.c_str()); + m_bLockCreated = false; + } +} + void CDebugDump::Create(const std::string& pDir) { + m_sDebugDumpDir = pDir; + std::string lockPath = pDir + ".lock"; + if (ExistFileDir(pDir)) + { + throw "CDebugDump::CDebugDump(): "+pDir+" already exists."; + } + + Lock(); + if (mkdir(pDir.c_str(), 0755) == -1) { throw "CDebugDump::Create(): Cannot create dir: " + pDir; } - Open(pDir); + SaveEnvironment(); SaveTime(); } @@ -96,7 +135,7 @@ void CDebugDump::Delete(const std::string& pDir) { return; } - Open(pDir); + Lock(); DIR *dir = opendir(pDir.c_str()); std::string fullPath; struct dirent *dent = NULL; @@ -123,15 +162,12 @@ void CDebugDump::Delete(const std::string& pDir) throw "CDebugDump::DeleteDir(): Cannot remove dir: " + fullPath; } } - Close(); + UnLock(); } void CDebugDump::Close() { - std::string lockPath = m_sDebugDumpDir + "/.lock"; - lockf(m_nFD,F_ULOCK, 0); - close(m_nFD); - remove(lockPath.c_str()); + UnLock(); } void CDebugDump::SaveEnvironment() diff --git a/lib/Utils/DebugDump.h b/lib/Utils/DebugDump.h index 1217136e..a6bb0511 100644 --- a/lib/Utils/DebugDump.h +++ b/lib/Utils/DebugDump.h @@ -43,8 +43,9 @@ class CDebugDump { private: std::string m_sDebugDumpDir; - int m_nFD; + bool m_bLockCreated; + void SaveEnvironment(); void SaveTime(); @@ -55,6 +56,9 @@ class CDebugDump void SaveBinaryFile(const std::string& pName, const char* pData, const unsigned int pSize); bool ExistFileDir(const std::string& pPath); + void Lock(); + void UnLock(); + public: CDebugDump(); |