MCPcopy Create free account
hub / github.com/FreesmTeam/FreesmLauncher / lock

Method lock

libraries/LocalPeer/src/LockedFile_win.cpp:94–162  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

92}
93
94bool LockedFile::lock(LockMode mode, bool block)
95{
96 if (!isOpen()) {
97 qWarning("QtLockedFile::lock(): file is not opened");
98 return false;
99 }
100
101 if (mode == NoLock)
102 return unlock();
103
104 if (mode == m_lock_mode)
105 return true;
106
107 if (m_lock_mode != NoLock)
108 unlock();
109
110 if (!wmutex && !(wmutex = getMutexHandle(-1, true)))
111 return false;
112
113 if (!waitMutex(wmutex, block))
114 return false;
115
116 if (mode == ReadLock) {
117 int idx = 0;
118 for (; idx < MAX_READERS; idx++) {
119 rmutex = getMutexHandle(idx, false);
120 if (!rmutex || waitMutex(rmutex, false))
121 break;
122 CloseHandle(rmutex);
123 }
124 bool ok = true;
125 if (idx >= MAX_READERS) {
126 qWarning("QtLockedFile::lock(): too many readers");
127 rmutex = 0;
128 ok = false;
129 } else if (!rmutex) {
130 rmutex = getMutexHandle(idx, true);
131 if (!rmutex || !waitMutex(rmutex, false))
132 ok = false;
133 }
134 if (!ok && rmutex) {
135 CloseHandle(rmutex);
136 rmutex = 0;
137 }
138 ReleaseMutex(wmutex);
139 if (!ok)
140 return false;
141 } else {
142 Q_ASSERT(rmutexes.isEmpty());
143 for (int i = 0; i < MAX_READERS; i++) {
144 Qt::HANDLE mutex = getMutexHandle(i, false);
145 if (mutex)
146 rmutexes.append(mutex);
147 }
148 if (rmutexes.size()) {
149 DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), TRUE, block ? INFINITE : 0);
150 if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {
151 if (res != WAIT_TIMEOUT)

Callers 1

isClientMethod · 0.45

Calls 3

appendMethod · 0.80
isEmptyMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected