8#define MUTEX_PREFIX "QtLockedFile mutex "
10#define MAX_READERS MAXIMUM_WAIT_OBJECTS
12#if QT_VERSION >= 0x050000
13#define QT_WA(unicode, ansi) unicode
16Qt::HANDLE QtLockedFile::getMutexHandle(
int idx,
bool doCreate)
18 if (mutexname.isEmpty()) {
21 + fi.absoluteFilePath().toLower();
23 QString mname(mutexname);
25 mname += QString::number(idx);
29 QT_WA( {
mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); },
30 {
mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } );
32 qErrnoWarning(
"QtLockedFile::lock(): CreateMutex failed");
37 QT_WA( {
mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); },
38 {
mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } );
40 if (GetLastError() != ERROR_FILE_NOT_FOUND)
41 qErrnoWarning(
"QtLockedFile::lock(): OpenMutex failed");
48bool QtLockedFile::waitMutex(Qt::HANDLE
mutex,
bool doBlock)
51 DWORD res = WaitForSingleObject(
mutex, doBlock ? INFINITE : 0);
60 qErrnoWarning(
"QtLockedFile::lock(): WaitForSingleObject failed");
67bool QtLockedFile::lock(LockMode mode,
bool block)
70 qWarning(
"QtLockedFile::lock(): file is not opened");
77 if (mode == m_lock_mode)
80 if (m_lock_mode != NoLock)
83 if (!wmutex && !(wmutex = getMutexHandle(-1,
true)))
86 if (!waitMutex(wmutex, block))
89 if (mode == ReadLock) {
92 rmutex = getMutexHandle(idx,
false);
93 if (!rmutex || waitMutex(rmutex,
false))
99 qWarning(
"QtLockedFile::lock(): too many readers");
104 rmutex = getMutexHandle(idx,
true);
105 if (!rmutex || !waitMutex(rmutex,
false))
112 ReleaseMutex(wmutex);
117 Q_ASSERT(rmutexes.isEmpty());
119 Qt::HANDLE
mutex = getMutexHandle(i,
false);
121 rmutexes.append(
mutex);
123 if (rmutexes.size()) {
124 DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(),
125 TRUE, block ? INFINITE : 0);
126 if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {
127 if (res != WAIT_TIMEOUT)
128 qErrnoWarning(
"QtLockedFile::lock(): WaitForMultipleObjects failed");
129 m_lock_mode = WriteLock;
140bool QtLockedFile::unlock()
143 qWarning(
"QtLockedFile::unlock(): file is not opened");
150 if (m_lock_mode == ReadLock) {
151 ReleaseMutex(rmutex);
156 foreach(Qt::HANDLE
mutex, rmutexes) {
161 ReleaseMutex(wmutex);
164 m_lock_mode = QtLockedFile::NoLock;
168QtLockedFile::~QtLockedFile()