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

List:       kde-pim
Subject:    Re: [Kde-pim] [patch] handling of static data in akonadi and
From:       Jarosław Staniek <js () iidea ! pl>
Date:       2008-05-20 22:10:21
Message-ID: 48334C4D.1040807 () iidea ! pl
[Download RAW message or body]

Ingo Klöcker said the following, On 2008-05-20 23:34:

> Or just
> 
>   if ( s_slavePool.isDestroyed() ) {
>       return;
>   }
> 
> I guess it doesn't really make much of a difference. deleteLater() will 
> most likely have no effect because event processing will already have 
> been stopped when s_slavePool is destroyed.

Attached patch for this class only.


-- 
regards / pozdrawiam, Jaroslaw Staniek
  Sponsored by OpenOffice Polska (http://www.openoffice.com.pl/en) to work on
  Kexi & KOffice (http://www.kexi.pl/en, http://www.koffice.org/kexi)
  KDE Libraries for MS Windows (http://windows.kde.org)

["smtpjob.patch" (text/plain)]

Index: mailtransport/smtpjob.cpp
===================================================================
--- mailtransport/smtpjob.cpp	(wersja 810313)
+++ mailtransport/smtpjob.cpp	(kopia robocza)
@@ -36,20 +36,27 @@
 
 using namespace MailTransport;
 
-static int slavePoolRef = 0;
-static QHash<int,KIO::Slave*> slavePool;
+struct SlavePool
+{
+  SlavePool() : ref( 0 ) {}
+  int ref;
+  QHash<int,KIO::Slave*> slaves;
 
-static void removeSlaveFromPool( KIO::Slave *slave, bool disconnect = false )
-{
-  const int slaveKey = slavePool.key( slave );
-  if ( slaveKey > 0 ) {
-    slavePool.remove( slaveKey );
-    if ( disconnect ) {
-      KIO::Scheduler::disconnectSlave( slave );
+  void removeSlave( KIO::Slave *slave, bool disconnect = false )
+  {
+    const int slaveKey = slaves.key( slave );
+    if ( slaveKey > 0 ) {
+      slaves.remove( slaveKey );
+      if ( disconnect ) {
+        KIO::Scheduler::disconnectSlave( slave );
+      }
     }
   }
-}
+};
 
+K_GLOBAL_STATIC( SlavePool, s_slavePool )
+
+
 /**
  * Private class that helps to provide binary compatibility between releases.
  * @internal
@@ -70,27 +77,33 @@
   d->currentState = SmtpJobPrivate::Idle;
   d->slave = 0;
   d->finished = false;
-  slavePoolRef++;
+  if ( !s_slavePool.isDestroyed() )
+    s_slavePool->ref++;
   KIO::Scheduler::connect( SIGNAL(slaveError(KIO::Slave*,int,QString)),
                            this, SLOT(slaveError(KIO::Slave*,int,QString)) );
 }
 
 SmtpJob::~SmtpJob()
 {
-  slavePoolRef--;
-  if ( slavePoolRef == 0 ) {
-    kDebug() << "clearing SMTP slave pool" << slavePool.count();
-    foreach ( KIO::Slave *slave, slavePool.values() ) {
-      KIO::Scheduler::disconnectSlave( slave );
+  if ( !s_slavePool.isDestroyed() ) {
+    s_slavePool->ref--;
+    if ( s_slavePool->ref == 0 ) {
+      kDebug() << "clearing SMTP slave pool" << s_slavePool->slaves.count();
+      foreach ( KIO::Slave *slave, s_slavePool->slaves.values() ) {
+        KIO::Scheduler::disconnectSlave( slave );
+      }
+      s_slavePool->slaves.clear();
     }
-    slavePool.clear();
   }
   delete d;
 }
 
 void SmtpJob::doStart()
 {
-  if ( slavePool.contains( transport()->id() ) ||
+  if ( s_slavePool.isDestroyed() )
+    return;
+
+  if ( s_slavePool->slaves.contains( transport()->id() ) ||
        transport()->precommand().isEmpty() ) {
     d->currentState = SmtpJobPrivate::Smtp;
     startSmtpJob();
@@ -104,6 +117,9 @@
 
 void SmtpJob::startSmtpJob()
 {
+  if ( s_slavePool.isDestroyed() )
+    return;
+
   KUrl destination;
   destination.setProtocol( ( transport()->encryption() == Transport::EnumEncryption::SSL ) ?
                            SMTPS_PROTOCOL : SMTP_PROTOCOL );
@@ -174,7 +190,7 @@
 
   destination.setPath( QLatin1String( "/send" ) );
 
-  d->slave = slavePool.value( transport()->id() );
+  d->slave = s_slavePool->slaves.value( transport()->id() );
   if ( !d->slave ) {
     kDebug() << "creating new SMTP slave";
     KIO::MetaData slaveConfig;
@@ -185,7 +201,7 @@
       slaveConfig.insert( QLatin1String( "sasl" ), transport()->authenticationTypeString() );
     }
     d->slave = KIO::Scheduler::getConnectedSlave( destination, slaveConfig );
-    slavePool.insert( transport()->id(), d->slave );
+    s_slavePool->slaves.insert( transport()->id(), d->slave );
   } else {
     kDebug() << "re-using existing slave";
   }
@@ -210,6 +226,9 @@
 
 bool SmtpJob::doKill()
 {
+  if ( s_slavePool.isDestroyed() )
+    return false;
+
   if ( !hasSubjobs() ) {
     return true;
   }
@@ -219,7 +238,7 @@
     KIO::SimpleJob *job = static_cast<KIO::SimpleJob*>( subjobs().first() );
     clearSubjobs();
     KIO::Scheduler::cancelJob( job );
-    removeSlaveFromPool( d->slave );
+    s_slavePool->removeSlave( d->slave );
     return true;
   }
   return false;
@@ -227,6 +246,9 @@
 
 void SmtpJob::slotResult( KJob *job )
 {
+  if ( s_slavePool.isDestroyed() )
+    return;
+
   // The job has finished, so we don't care about any further errors. Set
   // d->finished to true, so slaveError() knows about this and doesn't call
   // emitResult() anymore.
@@ -242,7 +264,7 @@
 
   TransportJob::slotResult( job );
   if ( error() && d->currentState == SmtpJobPrivate::Smtp ) {
-    removeSlaveFromPool( d->slave, error() != KIO::ERR_SLAVE_DIED );
+    s_slavePool->removeSlave( d->slave, error() != KIO::ERR_SLAVE_DIED );
     return;
   }
   if ( !error() && d->currentState == SmtpJobPrivate::Precommand ) {
@@ -257,6 +279,9 @@
 
 void SmtpJob::dataRequest( KIO::Job *job, QByteArray &data )
 {
+  if ( s_slavePool.isDestroyed() )
+    return;
+
   Q_ASSERT( job );
   if ( buffer()->atEnd() ) {
     data.clear();
@@ -269,7 +294,10 @@
 
 void SmtpJob::slaveError( KIO::Slave *slave, int errorCode, const QString &errorMsg )
 {
-  removeSlaveFromPool( slave, errorCode != KIO::ERR_SLAVE_DIED );
+  if ( s_slavePool.isDestroyed() )
+    return;
+
+  s_slavePool->removeSlave( slave, errorCode != KIO::ERR_SLAVE_DIED );
   if ( d->slave == slave && !d->finished ) {
     setError( errorCode );
     setErrorText( KIO::buildErrorString( errorCode, errorMsg ) );


_______________________________________________
KDE PIM mailing list kde-pim@kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
KDE PIM home page at http://pim.kde.org/

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

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