1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
/*
This file is part of libkdbus
SPDX-FileCopyrightText: 2011 Kevin Ottens <ervin@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QProcess>
#include <QTest>
#include <kdbusinterprocesslock.h>
#include <stdio.h>
static const char *counterFileName = "kdbusinterprocesslocktest.counter";
void writeCounter(int value)
{
QFile file(counterFileName);
file.open(QFile::WriteOnly);
QTextStream stream(&file);
stream << value;
file.close();
}
int readCounter()
{
QFile file(counterFileName);
file.open(QFile::ReadOnly);
QTextStream stream(&file);
int value = 0;
stream >> value;
file.close();
return value;
}
void removeCounter()
{
QFile::remove(counterFileName);
}
QProcess *executeNewChild()
{
qDebug() << "executeNewChild";
// Duplicated from kglobalsettingstest.cpp - make a shared helper method?
QProcess *proc = new QProcess();
QString appName = QStringLiteral("kdbusinterprocesslocktest");
#ifdef Q_OS_WIN
appName += ".exe";
#else
if (QFile::exists(appName + ".shell")) {
appName = "./" + appName + ".shell";
} else {
Q_ASSERT(QFile::exists(appName));
appName = "./" + appName;
}
#endif
proc->setProcessChannelMode(QProcess::ForwardedChannels);
proc->start(appName, QStringList() << QStringLiteral("child"));
return proc;
}
void work(int id, KDBusInterProcessLock &lock)
{
for (int i = 0; i < 10; i++) {
qDebug("%d: retrieve lock...", id);
lock.lock();
qDebug("%d: waiting...", id);
lock.waitForLockGranted();
qDebug("%d: retrieved lock", id);
int value = readCounter() + 1;
writeCounter(value);
qDebug("%d: counter updated to %d", id, value);
lock.unlock();
qDebug("%d: sleeping", id);
QTest::qSleep(20);
}
qDebug("%d: done", id);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QCoreApplication::setApplicationName(QStringLiteral("kdbusinterprocesslocktest"));
QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
QDir::setCurrent(QCoreApplication::applicationDirPath());
KDBusInterProcessLock lock(QStringLiteral("myfunnylock"));
if (argc >= 2) {
work(2, lock);
return 0;
}
writeCounter(0);
QProcess *proc = executeNewChild();
work(1, lock);
proc->waitForFinished();
delete proc;
int value = readCounter();
qDebug("Final value: %d", value);
const bool ok = (value == 20);
removeCounter();
return ok ? 0 : 1;
}
|