summaryrefslogtreecommitdiff
path: root/tests/test-performance/dbus-spammer/dbus-spammer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-performance/dbus-spammer/dbus-spammer.cpp')
-rw-r--r--tests/test-performance/dbus-spammer/dbus-spammer.cpp238
1 files changed, 238 insertions, 0 deletions
diff --git a/tests/test-performance/dbus-spammer/dbus-spammer.cpp b/tests/test-performance/dbus-spammer/dbus-spammer.cpp
new file mode 100644
index 0000000..2d84a60
--- /dev/null
+++ b/tests/test-performance/dbus-spammer/dbus-spammer.cpp
@@ -0,0 +1,238 @@
+#include <stdio.h>
+#include <signal.h>
+#include "dbus-services.h"
+
+sig_atomic_t volatile g_exit = 0;
+
+Maintainer::Maintainer(Threads* t) : QObject()
+{
+ allOnline = false;
+ threads = t;
+ timerID = startTimer(0);
+}
+
+Maintainer::~Maintainer()
+{
+ killTimer(timerID);
+}
+
+void Maintainer::timerEvent(QTimerEvent*)
+{
+ if( !allOnline )
+ {
+ int count = 0;
+ Threads::iterator th;
+ for( th = threads->begin(); th != threads->end(); ++th )
+ {
+ DbusSpammer* t = dynamic_cast<DbusSpammer*>(*th);
+ if( t )
+ {
+ if( t->firstTime )
+ count++;
+ }
+ }
+
+ allOnline = (count == 0) && (threads->count() > 0);
+
+ if( allOnline )
+ printf("All thread online and working!\n");
+ }
+
+ fflush(stdout);
+ fflush(stderr);
+
+ if( g_exit )
+ QMetaObject::invokeMethod(QCoreApplication::instance(), "quit");
+}
+
+class CommandLineParser
+{
+public:
+ CommandLineParser(int argc, char** argv)
+ {
+ threadCount = 10;
+ dataSize = 512;
+
+ parseArguments(argc, argv);
+ }
+
+public:
+ int threadCount;
+ int dataSize;
+
+private:
+ void parseArguments(int argc, char** argv)
+ {
+ int option, tmp;
+
+ while( (option = getopt(argc, argv, "ht:s:")) != -1 )
+ {
+ switch( option )
+ {
+ case 'h':
+ usage(0);
+ return;
+ case 't':
+ tmp = atoi(optarg);
+ if( tmp > 0 )
+ {
+ threadCount = tmp;
+ printf("Thread count: %d\n", threadCount);
+ }
+ else
+ {
+ printf("Invalid thread count, using default value %d!\n", threadCount);
+ }
+ break;
+ case 's':
+ tmp = atoi(optarg);
+ if( tmp > 0 )
+ {
+ dataSize = tmp;
+ printf("Data size: %d\n", dataSize);
+ }
+ else
+ {
+ printf("Invalid data size, using default value %d!\n", dataSize);
+ }
+ break;
+ default:
+ usage(-1);
+ return;
+ }
+ }
+ }
+
+ void usage(int theExitCode)
+ {
+ printf("usage: dbus-spammer [-h] [-t thread_count] [-s data_size]\n");
+ printf("default values:\n");
+ printf(" thread_count: %d\n", threadCount);
+ printf(" data_size : %d\n", dataSize);
+ exit(theExitCode);
+ }
+};
+
+void signal_handler(int signo, siginfo_t *info, void *data)
+{
+ switch( signo )
+ {
+ case SIGHUP:
+ case SIGTERM:
+ case SIGINT:
+ default:
+ puts("Caught exit signal!");
+ g_exit = 1;
+ }
+
+ (void)info;
+ (void)data;
+}
+
+bool installSignals()
+{
+ struct sigaction sa;
+
+ memset(&sa, 0, sizeof(struct sigaction));
+ sa.sa_sigaction = signal_handler;
+ sa.sa_flags = SA_SIGINFO;
+
+ if( sigaction(SIGHUP, &sa, NULL) < 0 || sigaction(SIGTERM, &sa, NULL) < 0 || sigaction(SIGINT, &sa, NULL) < 0 )
+ {
+ puts("Failed to install signal handlers");
+ return false;
+ }
+
+ return true;
+}
+
+int main(int argc, char **argv)
+{
+ QCoreApplication app(argc, argv);
+ CommandLineParser cmd(argc, argv);
+
+ int count = cmd.threadCount;
+
+ Threads threads;
+ Servers servers;
+
+ if( !installSignals() )
+ {
+ return -2;
+ }
+
+ if( !QDBusConnection::sessionBus().isConnected() )
+ {
+ puts("Cannot connect to the D-Bus session bus.");
+ return -1;
+ }
+
+ Maintainer maintainer(&threads);
+
+ printf("Starting pair: ");
+ for( int i = 0; i < count; i++ )
+ {
+ printf("#%d", i);
+ fflush(stdout);
+ DbusServer* s = new DbusServer(i);
+ s->start(QThread::NormalPriority);
+ servers.push_back(s);
+ usleep(100000);
+
+ QThread* t = new DbusSpammer(i, s->getServiceName(), cmd.dataSize);
+ threads.push_back(t);
+ t->start(QThread::NormalPriority);
+ }
+
+ puts("");
+
+ app.exec();
+
+ Threads::iterator th;
+ printf("Cleaning thread: ");
+ for( th = threads.begin(); th != threads.end(); ++th )
+ {
+ DbusSpammer* t = dynamic_cast<DbusSpammer*>(*th);
+ if( t )
+ {
+ printf("#%d", t->threadID);
+
+ t->quit();
+ int cnt = 0;
+ while( t->isRunning() )
+ {
+ fflush(stdout);
+ fflush(stderr);
+ if( ++cnt == 1000 )
+ {
+ printf("[T!]");
+ t->terminate();
+ break;
+ }
+ usleep(1000);
+ }
+ delete t;
+ }
+ }
+ puts(" ... done!");
+
+ Servers::iterator sv;
+ printf("Cleaning service: ");
+ for( sv = servers.begin(); sv != servers.end(); ++sv )
+ {
+ DbusServer* s = dynamic_cast<DbusServer*>(*sv);
+ if( s )
+ {
+ printf("#%d", s->getServiceID());
+ s->quit();
+ while( !s->isFinished() )
+ usleep(1000);
+
+ delete s;
+ }
+ }
+
+ puts(" ... done!");
+
+ return 0;
+}