QLockFile: Move the check for Linux /proc to a central place
I'll need it soon in QTemporaryFile. This also reduces the overhead, since QFile::exists -> QFileInfo::exists needs to check if there's a file engine that handles "/proc/version" (there isn't), convert the UTF-16 filename to UTF-8 and QFileSystemEngine::fillMetaData will issue a more expensive stat(2) syscall. access(2) is cheaper. This commit also introduces QT_LINUX_ALWAYS_HAVE_PROCFS that isn't defined anywhere, but could be passed during configure with -D if a build wants it. Change-Id: I1eba2b016de74620bfc8fffd14ccfd1593d59ade Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
49ab284d34
commit
3c689c4b3f
@ -199,7 +199,7 @@ QLockFile::LockError QLockFilePrivate::tryLock_sys()
|
||||
}
|
||||
|
||||
if (qt_write_loop(fd, fileData.constData(), fileData.size()) < fileData.size()) {
|
||||
close(fd);
|
||||
qt_safe_close(fd);
|
||||
if (!QFile::remove(fileName))
|
||||
qWarning("QLockFile: Could not remove our own lock file %s.", qPrintable(fileName));
|
||||
return QLockFile::UnknownError; // partition full
|
||||
@ -258,7 +258,7 @@ QString QLockFilePrivate::processNameByPid(qint64 pid)
|
||||
proc_name(pid, name, sizeof(name) / sizeof(char));
|
||||
return QFile::decodeName(name);
|
||||
#elif defined(Q_OS_LINUX)
|
||||
if (!QFile::exists(QStringLiteral("/proc/version")))
|
||||
if (!qt_haveLinuxProcfs())
|
||||
return QString();
|
||||
char exePath[64];
|
||||
char buf[PATH_MAX + 1];
|
||||
|
@ -340,6 +340,21 @@ static inline pid_t qt_safe_waitpid(pid_t pid, int *status, int options)
|
||||
timespec qt_gettime() Q_DECL_NOTHROW;
|
||||
void qt_nanosleep(timespec amount);
|
||||
|
||||
/* non-static */
|
||||
inline bool qt_haveLinuxProcfs()
|
||||
{
|
||||
#ifdef Q_OS_LINUX
|
||||
# ifdef QT_LINUX_ALWAYS_HAVE_PROCFS
|
||||
return true;
|
||||
# else
|
||||
static const bool present = (access("/proc/version", F_OK) == 0);
|
||||
return present;
|
||||
# endif
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT int qt_safe_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts);
|
||||
|
||||
static inline int qt_poll_msecs(struct pollfd *fds, nfds_t nfds, int timeout)
|
||||
|
Loading…
Reference in New Issue
Block a user