diff options
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | libdbus-qeventloop/dbusconnectioneventloop.cpp | 71 | ||||
-rw-r--r-- | libdbus-qeventloop/dbusconnectioneventloop.h | 13 | ||||
-rw-r--r-- | libdbus-qeventloop/libdbus-qeventloop.pro | 1 | ||||
-rw-r--r-- | libresourceqt/libresourceqt.pro | 1 | ||||
-rw-r--r-- | libresourceqt/src/resource-engine.cpp | 11 | ||||
-rw-r--r-- | libresourceqt/src/resource-engine.h | 1 | ||||
-rw-r--r-- | resourceqt-client/client.cpp | 26 | ||||
-rw-r--r-- | resourceqt-client/client.h | 61 | ||||
-rw-r--r-- | tests/test-dbus-qeventloop/test-dbus-qeventloop.cpp | 14 |
10 files changed, 178 insertions, 27 deletions
diff --git a/debian/changelog b/debian/changelog index 868f17f..0cc8956 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +libresourceqt (1.4) unstable; urgency=low + + * libdbus-qeventloop fix + + -- Martin Wolf <ext-martin.2.wolf@nokia.com> Wed, 07 Apr 2010 13:00:00 +0200 + libresourceqt (1.3) unstable; urgency=low * Also Fixes: NB#161198 - Unable to hear audio from any other MAFW player process except for the qmafw-dbus-wrapper diff --git a/libdbus-qeventloop/dbusconnectioneventloop.cpp b/libdbus-qeventloop/dbusconnectioneventloop.cpp index 0bce26e..e759d36 100644 --- a/libdbus-qeventloop/dbusconnectioneventloop.cpp +++ b/libdbus-qeventloop/dbusconnectioneventloop.cpp @@ -5,12 +5,41 @@ #include "dbusconnectioneventloop.h" +DBUSConnectionEventLoop DBUSConnectionEventLoop::classInstance; + +bool DBUSConnectionEventLoop::addConnection(DBusConnection* conn) +{ + return classInstance.internalAddConnection(conn); +} + +void DBUSConnectionEventLoop::removeConnection(DBusConnection* conn) +{ + classInstance.internalRemoveConnection(conn); +} + DBUSConnectionEventLoop::DBUSConnectionEventLoop() : QObject() { + MYDEBUG(); } DBUSConnectionEventLoop::~DBUSConnectionEventLoop() { + MYDEBUG(); + cleanup(); +} + +void DBUSConnectionEventLoop::cleanup() +{ + MYDEBUG(); + + Connections::iterator it; + for (it = connections.begin(); it != connections.end(); ++it) { + MYDEBUGC("Cleaning connection %p", *it); + + dbus_connection_set_watch_functions(*it, NULL, NULL, NULL, NULL, NULL); + dbus_connection_set_timeout_functions(*it, NULL, NULL, NULL, NULL, NULL); + dbus_connection_set_wakeup_main_function(*it, NULL, NULL, NULL); + } } // Handle a socket being ready to read. @@ -122,11 +151,12 @@ void DBUSConnectionEventLoop::removeWatch(DBusWatch *watch, void *data) DBUSConnectionEventLoop::Watcher &watcher = it.value(); if (watcher.watch == watch) { - if (watcher.read) + if (watcher.read) { delete watcher.read; - - if (watcher.write) + } + if (watcher.write) { delete watcher.write; + } loop->watchers.erase(it); @@ -229,14 +259,28 @@ void DBUSConnectionEventLoop::wakeupMain(void *data) } // The initialization point -bool DBUSConnectionEventLoop::addConnection(DBusConnection* conn) +bool DBUSConnectionEventLoop::internalAddConnection(DBusConnection* conn) { - bool rc; + MYDEBUG(); + + bool rc = true; if (conn == NULL) { return false; } + MYDEBUGC("Adding connection %p", conn); + + // Check if connection is in list + Connections::iterator it; + for (it = connections.begin(); it != connections.end(); ++it) { + if( *it == conn ) { + MYDEBUGC("Connection already in list, skipping"); + // Skip adding duplicate connection + return true; + } + } + // Add new connection connections.append(conn); if ( @@ -265,3 +309,20 @@ bool DBUSConnectionEventLoop::addConnection(DBusConnection* conn) return rc; } + +void DBUSConnectionEventLoop::internalRemoveConnection(DBusConnection* conn) +{ + MYDEBUG(); + + Connections::iterator it; + for (it = connections.begin(); it != connections.end(); ++it) { + if( *it == conn ) { + dbus_connection_set_watch_functions(*it, NULL, NULL, NULL, NULL, NULL); + dbus_connection_set_timeout_functions(*it, NULL, NULL, NULL, NULL, NULL); + dbus_connection_set_wakeup_main_function(*it, NULL, NULL, NULL); + + connections.erase(it); + return; + } + } +} diff --git a/libdbus-qeventloop/dbusconnectioneventloop.h b/libdbus-qeventloop/dbusconnectioneventloop.h index 8067e75..d44f667 100644 --- a/libdbus-qeventloop/dbusconnectioneventloop.h +++ b/libdbus-qeventloop/dbusconnectioneventloop.h @@ -48,18 +48,24 @@ class DBUSConnectionEventLoop : public QObject { Q_OBJECT private: + static DBUSConnectionEventLoop classInstance; + Q_DISABLE_COPY(DBUSConnectionEventLoop) + DBUSConnectionEventLoop(); public: - DBUSConnectionEventLoop(); virtual ~DBUSConnectionEventLoop(); -public: /** * Add new dbus connection into handler. * \return true if everything went well. */ - bool addConnection(DBusConnection* conn); + static bool addConnection(DBusConnection* conn); + static void removeConnection(DBusConnection* conn); + +private: + bool internalAddConnection(DBusConnection* conn); + void internalRemoveConnection(DBusConnection* conn); /** * Helper class for dbus watcher @@ -100,6 +106,7 @@ private slots: protected: void timerEvent(QTimerEvent *e); + void cleanup(); static dbus_bool_t addWatch(DBusWatch *watch, void *data); static void removeWatch(DBusWatch *watch, void *data); diff --git a/libdbus-qeventloop/libdbus-qeventloop.pro b/libdbus-qeventloop/libdbus-qeventloop.pro index 5b0ef18..cbed3cf 100644 --- a/libdbus-qeventloop/libdbus-qeventloop.pro +++ b/libdbus-qeventloop/libdbus-qeventloop.pro @@ -14,6 +14,7 @@ HEADERS += dbusconnectioneventloop.h QT = core CONFIG += qt link_pkgconfig dll PKGCONFIG += dbus-1 +DEFINES += QT_NO_DEBUG_OUTPUT QT_NO_WARNING_OUTPUT QT_NO_DEBUG_STREAM # Install directives headers.files = $$HEADERS diff --git a/libresourceqt/libresourceqt.pro b/libresourceqt/libresourceqt.pro index f2d642c..f8ef8d8 100644 --- a/libresourceqt/libresourceqt.pro +++ b/libresourceqt/libresourceqt.pro @@ -28,6 +28,7 @@ MOC_DIR = build CONFIG += qt link_pkgconfig dll QT = core PKGCONFIG += dbus-1 libresource0 +DEFINES += QT_NO_DEBUG_OUTPUT QT_NO_WARNING_OUTPUT QT_NO_DEBUG_STREAM # Install directives headers.files = $${PUBLIC_HEADERS} diff --git a/libresourceqt/src/resource-engine.cpp b/libresourceqt/src/resource-engine.cpp index 014d2cc..38afb64 100644 --- a/libresourceqt/src/resource-engine.cpp +++ b/libresourceqt/src/resource-engine.cpp @@ -14,7 +14,7 @@ static void handleAdviceMessage(resmsg_t *msg, resset_t *rs, void *data); ResourceEngine::ResourceEngine(ResourceSet *resourceSet) : QObject(resourceSet), connected(false), resourceSet(resourceSet), - dbusEngine(NULL), libresourceConnection(NULL), libresourceSet(NULL), + libresourceConnection(NULL), libresourceSet(NULL), requestId(0), messageMap(), connectionMode(0) { if (resourceSet->alwaysGetReply()) { @@ -28,7 +28,6 @@ ResourceEngine::ResourceEngine(ResourceSet *resourceSet) ResourceEngine::~ResourceEngine() { - delete dbusEngine; if (libresourceSet != NULL) libresourceSet->userdata = NULL; //need to destroy all libresource structures, but how? @@ -38,9 +37,6 @@ bool ResourceEngine::initialize() { DBusError dbusError; DBusConnection *dbusConnection; - dbusEngine = new DBUSConnectionEventLoop; - if(dbusEngine == NULL) - return false; dbus_error_init(&dbusError); dbusConnection = dbus_bus_get(DBUS_BUS_SESSION, &dbusError); @@ -50,7 +46,7 @@ bool ResourceEngine::initialize() return false; } dbus_error_free(&dbusError); - dbusEngine->addConnection(dbusConnection); + DBUSConnectionEventLoop::addConnection(dbusConnection); libresourceConnection = resproto_init(RESPROTO_ROLE_CLIENT, RESPROTO_TRANSPORT_DBUS, connectionIsUp, dbusConnection); if (libresourceConnection == NULL) { @@ -178,6 +174,9 @@ bool ResourceEngine::connectToManager() libresourceSet = resconn_connect(libresourceConnection, &resourceMessage, statusCallbackHandler); + if (libresourceSet == NULL) + return false; + libresourceSet->userdata = this; //save our context return true; } diff --git a/libresourceqt/src/resource-engine.h b/libresourceqt/src/resource-engine.h index 897c27e..17768a5 100644 --- a/libresourceqt/src/resource-engine.h +++ b/libresourceqt/src/resource-engine.h @@ -61,7 +61,6 @@ private: bool connected; ResourceSet *resourceSet; DBusConnection *dbusConnection; - DBUSConnectionEventLoop *dbusEngine; resconn_t *libresourceConnection; resset_t *libresourceSet; quint32 requestId; diff --git a/resourceqt-client/client.cpp b/resourceqt-client/client.cpp index 078e6e4..e0adbd0 100644 --- a/resourceqt-client/client.cpp +++ b/resourceqt-client/client.cpp @@ -297,6 +297,10 @@ void Client::showResources(const QList<Resource*> resList) void Client::resourceAcquiredHandler(const QList<ResourceType>& /*grantedResList*/) { + if( timeStat.markEnd() ) { + timeStat.report("\nOperation took %.2f ms\n"); + } + QList<Resource*> list = resourceSet->resources(); if (!list.count()) { printf("\nGranted resource set is empty. Possible bug?\n"); @@ -311,18 +315,30 @@ void Client::resourceAcquiredHandler(const QList<ResourceType>& /*grantedResList void Client::resourceDeniedHandler() { + if( timeStat.markEnd() ) { + timeStat.report("\nOperation took %.2f ms\n"); + } + printf("\nManager denies access to resources!\n"); showPrompt(); } void Client::resourceLostHandler() { + if( timeStat.markEnd() ) { + timeStat.report("\nOperation took %.2f ms\n"); + } + printf("\nLost resources from manager!\n"); showPrompt(); } void Client::resourceReleasedHandler() { + if( timeStat.markEnd() ) { + timeStat.report("\nOperation took %.2f ms\n"); + } + printf("\nAll resources released\n"); showPrompt(); } @@ -376,12 +392,22 @@ void Client::timerEvent(QTimerEvent*) } } else if (params[0] == "acquire") { + timeStat.markStart(); if (!resourceSet || !resourceSet->acquire()) { + if( timeStat.markEnd() ) { + timeStat.report("Operation took %.2f ms\n"); + } + printf("Acquire failed!\n"); } } else if (params[0] == "release") { + timeStat.markStart(); if (!resourceSet || !resourceSet->release()) { + if( timeStat.markEnd() ) { + timeStat.report("Operation took %.2f ms\n"); + } + printf("Release failed!\n"); } } diff --git a/resourceqt-client/client.h b/resourceqt-client/client.h index ed32538..c61a74c 100644 --- a/resourceqt-client/client.h +++ b/resourceqt-client/client.h @@ -5,6 +5,7 @@ #include <QtCore/QTextStream> #include <policy/resource-set.h> +#include <sys/resource.h> #define RES_AUDIO_PLAYBACK (1<<0) #define RES_VIDEO_PLAYBACK (1<<1) @@ -19,6 +20,64 @@ #define RES_SNAP_BUTTON (1<<10) #define RES_LENS_COVER (1<<11) +class TimeStat +{ +public: + double totalTime; + + TimeStat() + { + running = false; + totalTime = 0; + }; + + inline void markStart() + { + running = true; + getrusage(RUSAGE_SELF, &start); + } + + inline bool markEnd() + { + getrusage(RUSAGE_SELF, &end); + + if( !running ) + return false; + + running = false; + timevalSub(&end.ru_utime, &start.ru_utime, &end.ru_utime); + timevalSub(&end.ru_stime, &start.ru_stime, &end.ru_stime); + + double sys = end.ru_stime.tv_sec * 1000.0 + end.ru_stime.tv_usec / 1000.0; + double usr = end.ru_utime.tv_sec * 1000.0 + end.ru_utime.tv_usec / 1000.0; + totalTime = sys + usr; + + return true; + } + + void report(const char* format) + { + printf(format, totalTime); + } + +private: + bool running; + struct rusage start; + struct rusage end; + + void timevalSub(struct timeval *a, struct timeval *b, struct timeval *diff) + { + diff->tv_sec = a->tv_sec - b->tv_sec; + if( a->tv_usec < b->tv_usec ) + { + diff->tv_sec--; + diff->tv_usec = 1000000 - b->tv_usec + a->tv_usec; + } + else + diff->tv_usec = a->tv_usec - b->tv_usec; + } +}; + class Client : public QObject { Q_OBJECT @@ -47,6 +106,8 @@ private: uint32_t resourcesOptional; QString applicationClass; + TimeStat timeStat; + ResourcePolicy::ResourceSet* resourceSet; ResourcePolicy::Resource* allocateResource(ResourcePolicy::ResourceType resource, bool optional); diff --git a/tests/test-dbus-qeventloop/test-dbus-qeventloop.cpp b/tests/test-dbus-qeventloop/test-dbus-qeventloop.cpp index 3a005c0..746a6ed 100644 --- a/tests/test-dbus-qeventloop/test-dbus-qeventloop.cpp +++ b/tests/test-dbus-qeventloop/test-dbus-qeventloop.cpp @@ -8,7 +8,6 @@ class TestDbusQEventLoop: public QObject private: DBusConnection* systemBus; DBusConnection* sessionBus; - DBUSConnectionEventLoop* dbusEventLoop; void resetValues() { wasInNotifyFnc = 0; @@ -131,7 +130,6 @@ protected: private slots: void initTestCase() { // First allocate and obtain - dbusEventLoop = new DBUSConnectionEventLoop(); systemBus = dbus_bus_get(DBUS_BUS_SYSTEM, NULL); sessionBus = dbus_bus_get(DBUS_BUS_SESSION, NULL);; // Last check, if server is running @@ -140,9 +138,8 @@ private slots: // Create event loop ... - QVERIFY(dbusEventLoop != NULL); - QVERIFY(dbusEventLoop->addConnection(systemBus) == true); - QVERIFY(dbusEventLoop->addConnection(sessionBus) == true); + QVERIFY(DBUSConnectionEventLoop::addConnection(systemBus) == true); + QVERIFY(DBUSConnectionEventLoop::addConnection(sessionBus) == true); // Then test ... otherwise something don't have to be allocated (i.e. event loop) QVERIFY(systemBus != NULL); QVERIFY(sessionBus != NULL); @@ -183,13 +180,6 @@ private slots: // Free message, it is not necessary to test, QVERIFY upper will end function dbus_message_unref(message); - // Cleanup allocated pointers - QVERIFY(dbusEventLoop != NULL); - if (dbusEventLoop) { - delete dbusEventLoop; - dbusEventLoop = NULL; - } - // Check if everything went well QVERIFY(systemTimeout == false); QVERIFY(systemResponse == 12345); |