| 102 | } |
| 103 | |
| 104 | bool LockFile::lock(LockType lockType) |
| 105 | { |
| 106 | if (!mIsOpen) |
| 107 | return false; |
| 108 | |
| 109 | bool success = false; |
| 110 | #if FALCOR_WINDOWS |
| 111 | OVERLAPPED overlapped = {0}; |
| 112 | overlapped.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| 113 | DWORD flags = lockType == LockType::Shared ? 0 : LOCKFILE_EXCLUSIVE_LOCK; |
| 114 | success = ::LockFileEx(mFileHandle, flags, DWORD(0), ~DWORD(0), ~DWORD(0), &overlapped); |
| 115 | if (!success) |
| 116 | { |
| 117 | auto err = ::GetLastError(); |
| 118 | if (err == ERROR_IO_PENDING) |
| 119 | { |
| 120 | DWORD bytes; |
| 121 | if (::GetOverlappedResult(mFileHandle, &overlapped, &bytes, TRUE)) |
| 122 | success = true; |
| 123 | } |
| 124 | } |
| 125 | ::CloseHandle(overlapped.hEvent); |
| 126 | #elif FALCOR_LINUX |
| 127 | int operation = lockType == LockType::Shared ? LOCK_SH : LOCK_EX; |
| 128 | success = ::flock(mFileHandle, operation) == 0; |
| 129 | #endif |
| 130 | return success; |
| 131 | } |
| 132 | |
| 133 | bool LockFile::unlock() |
| 134 | { |