[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [publictransport] engine/script: Fix deadlock in Scripting::Storage
From:       Friedrich_Karl_Tilman_Pülz <fpuelz () gmx ! de>
Date:       2012-11-30 20:36:57
Message-ID: 20121130203657.9304AA60D6 () git ! kde ! org
[Download RAW message or body]

Git commit c9719c54586edd50d89ff263de853341db40c94a by Friedrich Karl Tilman Pülz.
Committed on 28/11/2012 at 06:03.
Pushed by fkpulz into branch 'master'.

Fix deadlock in Scripting::Storage

Fixed by making the QReadWriteLock recursive, eg. needed for
Storage::lifetime(). And a QWriteLocker was used instead of
a QReadLocker.

Discovered with ScriptApiTest.

M  +3    -2    engine/script/scripting.cpp

http://commits.kde.org/publictransport/c9719c54586edd50d89ff263de853341db40c94a

diff --git a/engine/script/scripting.cpp b/engine/script/scripting.cpp
index 9a7189a..923c4b2 100644
--- a/engine/script/scripting.cpp
+++ b/engine/script/scripting.cpp
@@ -1631,7 +1631,8 @@ const char* Storage::LIFETIME_ENTRYNAME_SUFFIX = "__expires__";
 class StoragePrivate {
 public:
     StoragePrivate( const QString &serviceProvider )
-            : readWriteLock(new QReadWriteLock), readWriteLockPersistent(new QReadWriteLock),
+            : readWriteLock(new QReadWriteLock(QReadWriteLock::Recursive)),
+              readWriteLockPersistent(new QReadWriteLock(QReadWriteLock::Recursive)),
               serviceProvider(serviceProvider), lastLifetimeCheck(0), config(0) {
     };
 
@@ -1725,7 +1726,7 @@ void Storage::clear()
 
 int Storage::lifetime( const QString& name )
 {
-    QWriteLocker locker( d->readWriteLockPersistent );
+    QReadLocker locker( d->readWriteLockPersistent );
     return lifetime( name, d->persistentGroup() );
 }
 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic