2008-01-30 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Wed, 30 Jan 2008 13:24:21 +0000 (13:24 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Wed, 30 Jan 2008 13:24:21 +0000 (13:24 +0000)
* kdpipeiodevice.cpp: New version by Frank Osterfeld, fixes race
condition.

gpgme/ChangeLog
gpgme/kdpipeiodevice.cpp

index c354e958e3710cb0a8e215db49b96ef9e50e5f9e..5bc5dca6d959a6a3da6827703b5976295d035b03 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-30  Marcus Brinkmann  <marcus@g10code.de>
+
+       * kdpipeiodevice.cpp: New version by Frank Osterfeld, fixes race
+       condition.
+
 2008-01-28  Marcus Brinkmann  <marcus@g10code.de>
 
        * engine-gpgsm.c (map_input_enc): Rename to ...
index dd2503bd0fc5124e85c7f155c553938f4f00c0bf..c4dd9f7c571664b0ad6ebf59ee99554c9b8e58e8 100644 (file)
@@ -106,6 +106,7 @@ public:
     bool error;
     bool eofShortCut;
     int errorCode;
+    bool isReading;
     bool consumerBlocksOnUs;
    
 private:
@@ -127,6 +128,7 @@ Reader::Reader( int fd_, Qt::HANDLE handle_ )
       error( false ),
       eofShortCut( false ),
       errorCode( 0 ),
+      isReading( false ),
       consumerBlocksOnUs( false ),
       rptr( 0 ), wptr( 0 )
 {
@@ -321,24 +323,28 @@ bool KDPipeIODevice::Private::startWriterThread()
 
 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 @@ void Reader::run() {
 
            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 );