summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qsystemsemaphore_symbian.cpp20
-rw-r--r--tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp10
-rw-r--r--tests/auto/qtipc/qsystemsemaphore/qsystemsemaphore.pro5
3 files changed, 25 insertions, 10 deletions
diff --git a/src/corelib/kernel/qsystemsemaphore_symbian.cpp b/src/corelib/kernel/qsystemsemaphore_symbian.cpp
index a25a119..07cfffc 100644
--- a/src/corelib/kernel/qsystemsemaphore_symbian.cpp
+++ b/src/corelib/kernel/qsystemsemaphore_symbian.cpp
@@ -73,6 +73,9 @@ void QSystemSemaphorePrivate::setErrorString(const QString &function, int err)
case KErrInUse:
errorString = QCoreApplication::tr("%1: out of resources", "QSystemSemaphore").arg(function);
error = QSystemSemaphore::OutOfResources;
+ case KErrPermissionDenied:
+ errorString = QCoreApplication::tr("%1: permission denied", "QSystemSemaphore").arg(function);
+ error = QSystemSemaphore::PermissionDenied;
break;
default:
errorString = QCoreApplication::tr("%1: unknown error %2", "QSystemSemaphore").arg(function).arg(err);
@@ -86,15 +89,24 @@ default:
int QSystemSemaphorePrivate::handle(QSystemSemaphore::AccessMode)
{
+ if (semaphore.Handle()) {
+ return semaphore.Handle();
+ }
+
// don't allow making handles on empty keys
if (key.isEmpty())
return 0;
+
QString safeName = makeKeyFileName();
TPtrC name(qt_QString2TPtrC(safeName));
- int err;
- err = semaphore.OpenGlobal(name,EOwnerProcess);
- if (err == KErrNotFound){
- err = semaphore.CreateGlobal(name,initialValue, EOwnerProcess);
+ int err = KErrAlreadyExists;
+ int tryCount = 10;
+ // Sort out race conditions by retrying several times until existing handle is acquired.
+ // Sometimes opening can fail inexplicably with KErrPermissionDenied many times in a row.
+ while (err != KErrNoMemory && err != KErrNone && tryCount-- >= 0) {
+ err = semaphore.CreateGlobal(name, initialValue, EOwnerProcess);
+ if (err != KErrNoMemory && err != KErrNone)
+ err = semaphore.OpenGlobal(name,EOwnerProcess);
}
if (err){
setErrorString(QLatin1String("QSystemSemaphore::handle"),err);
diff --git a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp
index 5825524..50205bc 100644
--- a/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp
+++ b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp
@@ -51,7 +51,7 @@
#define EXISTING_SIZE 1024
#ifdef Q_OS_SYMBIAN
-#define SRCDIR "c:/data/qsharedmemorytemp/"
+#define SRCDIR "c:/data/qsharedmemorytemp/lackey/"
#define LACKEYDIR SRCDIR "lackey"
#elif defined(Q_OS_WINCE)
#define LACKEYDIR SRCDIR
@@ -624,6 +624,10 @@ public:
QVERIFY(producer.isAttached());
char *memory = (char*)producer.data();
memory[1] = '0';
+#if defined(Q_OS_SYMBIAN)
+ // Sleep a while to ensure that consumers start properly
+ QTest::qSleep(1000);
+#endif
QTime timer;
timer.start();
int i = 0;
@@ -645,10 +649,6 @@ public:
memory[0] = 'E';
QVERIFY(producer.unlock());
-#if defined(Q_OS_SYMBIAN)
- // Sleep a while to ensure that consumers start properly
- QTest::qSleep(1000);
-#endif
}
private:
diff --git a/tests/auto/qtipc/qsystemsemaphore/qsystemsemaphore.pro b/tests/auto/qtipc/qsystemsemaphore/qsystemsemaphore.pro
index 8a5f8b2..e21e5df 100644
--- a/tests/auto/qtipc/qsystemsemaphore/qsystemsemaphore.pro
+++ b/tests/auto/qtipc/qsystemsemaphore/qsystemsemaphore.pro
@@ -1,4 +1,4 @@
-CONFIG += qttest_p4
+load(qttest_p4)
#QT = core
include(../qsharedmemory/src/src.pri)
@@ -31,5 +31,8 @@ QT += script
lackey.sources = ../lackey/lackey.exe
lackey.path = /sys/bin
DEPLOYMENT += lackey
+
+# PowerMgmt capability needed to kill lackey process
+TARGET.CAPABILITY = PowerMgmt
}