diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/main.cpp | 9 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp | 25 |
2 files changed, 24 insertions, 10 deletions
diff --git a/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/main.cpp b/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/main.cpp index 63f38f43f3..30c9d01e98 100644 --- a/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/main.cpp +++ b/tests/auto/corelib/kernel/qsharedmemory/sharedmemoryhelper/main.cpp @@ -43,6 +43,7 @@ #include <QStringList> #include <QDebug> #include <QTest> +#include <stdio.h> void set(QSharedMemory &sm, int pos, QChar value) { @@ -82,7 +83,10 @@ int producer() return EXIT_FAILURE; } } + // tell parent we're ready //qDebug("producer created and attached"); + puts(""); + fflush(stdout); if (!producer.lock()) { qWarning() << "Could not lock" << producer.key(); @@ -129,9 +133,8 @@ int producer() //qDebug("producer done"); - // Sleep for a bit to let all consumers start, otherwise they will get stuck in the attach loop, - // because at least in Symbian the shared memory will be destroyed if there are no active handles to it. - QTest::qSleep(3000); + // Sleep for a bit to let all consumers exit + getchar(); return EXIT_SUCCESS; } diff --git a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp b/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp index 5d9b470494..c7c75947ad 100644 --- a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp +++ b/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp @@ -177,6 +177,7 @@ void tst_QSharedMemory::cleanup() #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> +#include <errno.h> #endif QString tst_QSharedMemory::helperBinary() @@ -211,7 +212,7 @@ int tst_QSharedMemory::remove(const QString &key) int id = shmget(unix_key, 0, 0660); if (-1 == id) { - qDebug() << "shmget failed"; + qDebug() << "shmget failed" << strerror(errno); return -4; } @@ -634,9 +635,8 @@ class Producer : public QThread { public: - void run() + Producer() : producer(QLatin1String("market")) { - QSharedMemory producer(QLatin1String("market")); int size = 1024; if (!producer.create(size)) { // left over from a crash... @@ -646,7 +646,11 @@ public: QVERIFY(producer.create(size)); } } - QVERIFY(producer.isAttached()); + } + + void run() + { + char *memory = (char*)producer.data(); memory[1] = '0'; QTime timer; @@ -671,6 +675,8 @@ public: QVERIFY(producer.unlock()); } + + QSharedMemory producer; private: }; @@ -701,6 +707,7 @@ void tst_QSharedMemory::simpleThreadedProducerConsumer() #endif Producer p; + QVERIFY(p.producer.isAttached()); if (producerIsThread) p.start(); @@ -741,9 +748,10 @@ void tst_QSharedMemory::simpleProcessProducerConsumer() rememberKey("market"); QProcess producer; - producer.setProcessChannelMode(QProcess::ForwardedChannels); producer.start(helperBinary(), QStringList("producer")); QVERIFY2(producer.waitForStarted(), "Could not start helper binary"); + QVERIFY2(producer.waitForReadyRead(), "Helper process failed to create shared memory segment: " + + producer.readAllStandardError()); QList<QProcess*> consumers; unsigned int failedProcesses = 0; @@ -758,8 +766,6 @@ void tst_QSharedMemory::simpleProcessProducerConsumer() ++failedProcesses; } - QVERIFY(producer.waitForFinished(5000)); - bool consumerFailed = false; while (!consumers.isEmpty()) { @@ -773,6 +779,11 @@ void tst_QSharedMemory::simpleProcessProducerConsumer() } QCOMPARE(consumerFailed, false); QCOMPARE(failedProcesses, (unsigned int)(0)); + + // tell the producer to exit now + producer.write("", 1); + producer.waitForBytesWritten(); + QVERIFY(producer.waitForFinished(5000)); } void tst_QSharedMemory::uniqueKey_data() |