[svn] gpgme - r1300 - trunk/gpgme

svn author marcus cvs at cvs.gnupg.org
Wed Jan 30 14:24:22 CET 2008


Author: marcus
Date: 2008-01-30 14:24:21 +0100 (Wed, 30 Jan 2008)
New Revision: 1300

Modified:
   trunk/gpgme/ChangeLog
   trunk/gpgme/kdpipeiodevice.cpp
Log:
2008-01-30  Marcus Brinkmann  <marcus at g10code.de>

	* kdpipeiodevice.cpp: New version by Frank Osterfeld, fixes race
	condition.


Modified: trunk/gpgme/ChangeLog
===================================================================
--- trunk/gpgme/ChangeLog	2008-01-28 19:49:40 UTC (rev 1299)
+++ trunk/gpgme/ChangeLog	2008-01-30 13:24:21 UTC (rev 1300)
@@ -1,3 +1,8 @@
+2008-01-30  Marcus Brinkmann  <marcus at g10code.de>
+
+	* kdpipeiodevice.cpp: New version by Frank Osterfeld, fixes race
+	condition.
+
 2008-01-28  Marcus Brinkmann  <marcus at g10code.de>
 
 	* engine-gpgsm.c (map_input_enc): Rename to ...

Modified: trunk/gpgme/kdpipeiodevice.cpp
===================================================================
--- trunk/gpgme/kdpipeiodevice.cpp	2008-01-28 19:49:40 UTC (rev 1299)
+++ trunk/gpgme/kdpipeiodevice.cpp	2008-01-30 13:24:21 UTC (rev 1300)
@@ -106,6 +106,7 @@
     bool error;
     bool eofShortCut;
     int errorCode;
+    bool isReading;
     bool consumerBlocksOnUs;
    
 private:
@@ -127,6 +128,7 @@
       error( false ),
       eofShortCut( false ),
       errorCode( 0 ),
+      isReading( false ),
       consumerBlocksOnUs( false ),
       rptr( 0 ), wptr( 0 )
 {
@@ -321,24 +323,28 @@
 
 void KDPipeIODevice::Private::emitReadyRead()
 {
-    static int s_counter = 0;
-    const int counter = s_counter++;
     QPointer<Private> thisPointer( this );
-    qDebug( "KDPipeIODevice::Private::emitReadyRead %p, %d", this, counter );
+    qDebug( "KDPipeIODevice::Private::emitReadyRead %p", this );
 
     emit q->readyRead();
 
     if ( !thisPointer )
         return;
-    
+
+    bool mustNotify = false;
+
     if ( reader ) {
-        qDebug( "KDPipeIODevice::Private::emitReadyRead %p, %d: locking reader (CONSUMER THREAD)", this, counter );
+        qDebug( "KDPipeIODevice::Private::emitReadyRead %p: locking reader (CONSUMER THREAD)", this );
         synchronized( reader ) {
-            qDebug( "KDPipeIODevice::Private::emitReadyRead %p, %d: locked reader (CONSUMER THREAD)", this, counter );
+            qDebug( "KDPipeIODevice::Private::emitReadyRead %p: locked reader (CONSUMER THREAD)", this );
             reader->readyReadSentCondition.wakeAll();
+            mustNotify = !reader->bufferEmpty() && reader->isReading;
+            qDebug( "KDPipeIODevice::emitReadyRead %p: bufferEmpty: %d reader in ReadFile: %d", this, reader->bufferEmpty(), reader->isReading );
         }
     }
-    qDebug( "KDPipeIODevice::Private::emitReadyRead %p leaving %d", this, counter );
+    if ( mustNotify )
+        QTimer::singleShot( 100, this, SLOT( emitReadyRead() ) );  
+    qDebug( "KDPipeIODevice::Private::emitReadyRead %p leaving", this );
 
 }
 
@@ -732,10 +738,12 @@
 
 	    qDebug( "%p: Reader::run: trying to read %d bytes", this, numBytes );
 #ifdef Q_OS_WIN32
+            isReading = true;
 	    mutex.unlock();
             DWORD numRead;
 	    const bool ok = ReadFile( handle, buffer + wptr, numBytes, &numRead, 0 );
 	    mutex.lock();
+            isReading = false;
 	    if ( ok ) {
                 if ( numRead == 0 ) {
                     qDebug( "%p: Reader::run: got eof (numRead==0)", this );




More information about the Gnupg-commits mailing list