2008-04-22 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Tue, 22 Apr 2008 11:20:50 +0000 (11:20 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Tue, 22 Apr 2008 11:20:50 +0000 (11:20 +0000)
* w32-qt-io.cpp, kdpipeiodevice.cpp: New versions from Frank
Osterfeld, implement blocking select.

gpgme/ChangeLog
gpgme/kdpipeiodevice.cpp
gpgme/w32-qt-io.cpp

index 35af33a..219d482 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-22  Marcus Brinkmann  <marcus@g10code.de>
+
+       * w32-qt-io.cpp, kdpipeiodevice.cpp: New versions from Frank
+       Osterfeld, implement blocking select.
+
 2008-03-11  Marcus Brinkmann  <marcus@g10code.de>
 
        * data.c (gpgme_data_read, gpgme_data_write): Retry on EINTR.
index c4dd9f7..5661790 100644 (file)
@@ -480,8 +480,8 @@ bool KDPipeIODevice::waitForReadyRead( int msecs ) { KDAB_CHECK_THIS;
     LOCKED( r );
     if ( r->bytesInBuffer() != 0 || r->eof || r->error )
         return true;
-    assert( false );
-    return r->bufferNotEmptyCondition.wait( &r->mutex, msecs ) ;
+
+    return msecs >= 0 ? r->bufferNotEmptyCondition.wait( &r->mutex, msecs ) : r->bufferNotEmptyCondition.wait( &r->mutex );
 }
 
 template <typename T>
index 9ccdff9..264d729 100644 (file)
@@ -573,9 +573,6 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
   TRACE_BEG2 (DEBUG_SYSIO, "_gpgme_io_select", fds,
              "nfds=%u, nonblock=%u", nfds, nonblock);
 
-  /* We only implement the special case of nonblock == true.  */
-  assert (nonblock);
-
   int count = 0;
 
   TRACE_SEQ (dbg_help, "select on [ ");
@@ -587,9 +584,12 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
        }
       else if (fds[i].for_read )
       {
-          const KDPipeIODevice * const chan = find_channel (fds[i].fd, 0);
-          assert (chan);   
-          fds[i].signaled = chan->readWouldBlock() ? 0 : 1;
+          KDPipeIODevice * const chan = find_channel (fds[i].fd, 0);
+          assert (chan);
+          if ( nonblock )
+              fds[i].signaled = chan->readWouldBlock() ? 0 : 1;
+          else
+              fds[i].signaled = chan->waitForReadyRead( 1000 ) ? 1 : 0;
          TRACE_ADD1 (dbg_help, "w0x%x ", fds[i].fd);
           if ( fds[i].signaled ) 
               count++;
@@ -598,7 +598,7 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)
         {
           const KDPipeIODevice * const chan = find_channel (fds[i].fd, 0);
           assert (chan);
-          fds[i].signaled = chan->writeWouldBlock() ? 0 : 1;
+          fds[i].signaled = nonblock ? ( chan->writeWouldBlock() ? 0 : 1 ) : 1;
           TRACE_ADD1 (dbg_help, "w0x%x ", fds[i].fd);
           if ( fds[i].signaled ) 
               count++;