bool AutoSystemInfo::IsLowMemoryProcess() { ULONG64 commit = ULONG64(-1); this->GetAvailableCommit(&commit); return commit <= CONFIG_FLAG(LowMemoryCap); }
uchar *QFSFileEnginePrivate::map(qint64 offset, qint64 size, QFile::MemoryMapFlags flags) { #ifndef Q_OS_WINPHONE Q_Q(QFSFileEngine); Q_UNUSED(flags); if (openMode == QFile::NotOpen) { q->setError(QFile::PermissionsError, qt_error_string(ERROR_ACCESS_DENIED)); return 0; } if (offset == 0 && size == 0) { q->setError(QFile::UnspecifiedError, qt_error_string(ERROR_INVALID_PARAMETER)); return 0; } // check/setup args to map DWORD access = 0; if (flags & QFileDevice::MapPrivateOption) { #ifdef FILE_MAP_COPY access = FILE_MAP_COPY; #else q->setError(QFile::UnspecifiedError, "MapPrivateOption unsupported"); return 0; #endif } else if (openMode & QIODevice::WriteOnly) { access = FILE_MAP_WRITE; } else if (openMode & QIODevice::ReadOnly) { access = FILE_MAP_READ; } if (mapHandle == NULL) { // get handle to the file HANDLE handle = fileHandle; #ifndef Q_OS_WINCE if (handle == INVALID_HANDLE_VALUE && fh) handle = (HANDLE)::_get_osfhandle(QT_FILENO(fh)); #endif #ifdef Q_USE_DEPRECATED_MAP_API nativeClose(); // handle automatically closed by kernel with mapHandle (below). handle = ::CreateFileForMapping((const wchar_t*)fileEntry.nativeFilePath().utf16(), GENERIC_READ | (openMode & QIODevice::WriteOnly ? GENERIC_WRITE : 0), 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // Since this is a special case, we check if the return value was NULL and if so // we change it to INVALID_HANDLE_VALUE to follow the logic inside this function. if(0 == handle) handle = INVALID_HANDLE_VALUE; #endif if (handle == INVALID_HANDLE_VALUE) { q->setError(QFile::PermissionsError, qt_error_string(ERROR_ACCESS_DENIED)); return 0; } // first create the file mapping handle DWORD protection = (openMode & QIODevice::WriteOnly) ? PAGE_READWRITE : PAGE_READONLY; #ifndef Q_OS_WINRT mapHandle = ::CreateFileMapping(handle, 0, protection, 0, 0, 0); #else mapHandle = ::CreateFileMappingFromApp(handle, 0, protection, 0, 0); #endif if (mapHandle == NULL) { q->setError(QFile::PermissionsError, qt_error_string()); #ifdef Q_USE_DEPRECATED_MAP_API ::CloseHandle(handle); #endif return 0; } } DWORD offsetHi = offset >> 32; DWORD offsetLo = offset & Q_UINT64_C(0xffffffff); SYSTEM_INFO sysinfo; #ifndef Q_OS_WINRT ::GetSystemInfo(&sysinfo); #else ::GetNativeSystemInfo(&sysinfo); #endif DWORD mask = sysinfo.dwAllocationGranularity - 1; DWORD extra = offset & mask; if (extra) offsetLo &= ~mask; // attempt to create the map #ifndef Q_OS_WINRT LPVOID mapAddress = ::MapViewOfFile(mapHandle, access, offsetHi, offsetLo, size + extra); #else LPVOID mapAddress = ::MapViewOfFileFromApp(mapHandle, access, (ULONG64(offsetHi) << 32) + offsetLo, size + extra); #endif if (mapAddress) { uchar *address = extra + static_cast<uchar*>(mapAddress); maps[address] = extra; return address; } switch(GetLastError()) { case ERROR_ACCESS_DENIED: q->setError(QFile::PermissionsError, qt_error_string()); break; case ERROR_INVALID_PARAMETER: // size are out of bounds default: q->setError(QFile::UnspecifiedError, qt_error_string()); } ::CloseHandle(mapHandle); mapHandle = NULL; #else // !Q_OS_WINPHONE Q_UNUSED(offset); Q_UNUSED(size); Q_UNUSED(flags); Q_UNIMPLEMENTED(); #endif // Q_OS_WINPHONE return 0; }