summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qprocess_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/io/qprocess_p.h')
-rw-r--r--src/corelib/io/qprocess_p.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/corelib/io/qprocess_p.h b/src/corelib/io/qprocess_p.h
index f658e54d4b..2a2cc9fb84 100644
--- a/src/corelib/io/qprocess_p.h
+++ b/src/corelib/io/qprocess_p.h
@@ -59,6 +59,9 @@
#include "QtCore/qshareddata.h"
#include "private/qringbuffer_p.h"
#include "private/qiodevice_p.h"
+#ifdef Q_OS_UNIX
+#include <QtCore/private/qorderedmutexlocker_p.h>
+#endif
#ifdef Q_OS_WIN
#include "QtCore/qt_windows.h"
@@ -148,6 +151,13 @@ public:
inline QString nameToString(const Key &name) const { return name; }
inline Value prepareValue(const QString &value) const { return value; }
inline QString valueToString(const Value &value) const { return value; }
+ struct MutexLocker {
+ MutexLocker(const QProcessEnvironmentPrivate *) {}
+ };
+ struct OrderedMutexLocker {
+ OrderedMutexLocker(const QProcessEnvironmentPrivate *,
+ const QProcessEnvironmentPrivate *) {}
+ };
#else
inline Key prepareName(const QString &name) const
{
@@ -164,6 +174,37 @@ public:
}
inline Value prepareValue(const QString &value) const { return Value(value); }
inline QString valueToString(const Value &value) const { return value.string(); }
+
+ struct MutexLocker : public QMutexLocker
+ {
+ MutexLocker(const QProcessEnvironmentPrivate *d) : QMutexLocker(&d->mutex) {}
+ };
+ struct OrderedMutexLocker : public QOrderedMutexLocker
+ {
+ OrderedMutexLocker(const QProcessEnvironmentPrivate *d1,
+ const QProcessEnvironmentPrivate *d2) :
+ QOrderedMutexLocker(&d1->mutex, &d2->mutex)
+ {}
+ };
+
+ QProcessEnvironmentPrivate() : QSharedData() {}
+ QProcessEnvironmentPrivate(const QProcessEnvironmentPrivate &other) :
+ QSharedData()
+ {
+ // This being locked ensures that the functions that only assign
+ // d pointers don't need explicit locking.
+ // We don't need to lock our own mutex, as this object is new and
+ // consequently not shared. For the same reason, non-const methods
+ // do not need a lock, as they detach objects (however, we need to
+ // ensure that they really detach before using prepareName()).
+ MutexLocker locker(&other);
+ hash = other.hash;
+ nameMap = other.nameMap;
+ // We need to detach our members, so that our mutex can protect them.
+ // As we are being detached, they likely would be detached a moment later anyway.
+ hash.detach();
+ nameMap.detach();
+ }
#endif
typedef QHash<Key, Value> Hash;
@@ -172,6 +213,8 @@ public:
#ifdef Q_OS_UNIX
typedef QHash<QString, Key> NameHash;
mutable NameHash nameMap;
+
+ mutable QMutex mutex;
#endif
static QProcessEnvironment fromList(const QStringList &list);
@@ -317,6 +360,7 @@ public:
bool waitForDeadChild();
#endif
#ifdef Q_OS_WIN
+ bool drainOutputPipes();
void flushPipeWriter();
qint64 pipeWriterBytesToWrite() const;
#endif