[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