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

List:       kde-commits
Subject:    branches/work/icecream-make-it-cool/daemon
From:       Dirk Mueller <mueller () kde ! org>
Date:       2006-09-01 8:57:14
Message-ID: 1157101034.475339.26862.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 579548 by mueller:

trying to workaround the busy wait loop


 M  +18 -16    workit.cpp  


--- branches/work/icecream-make-it-cool/daemon/workit.cpp #579547:579548
@@ -261,8 +261,8 @@
            assert((flags = fcntl(f, F_GETFD, 0)) < 0 || (flags & FD_CLOEXEC));
         }
 
-        ret = execv( argv[0], const_cast<char *const*>( argv ) ); // no return
-        printf( "execv failed: %s\n", strerror(errno) );
+        execv( argv[0], const_cast<char *const*>( argv ) ); // no return
+        perror( "ICECC: execv" );
 
         char resultByte = 1;
         write(main_sock[1], &resultByte, 1);
@@ -270,6 +270,8 @@
     } else {
         close( main_sock[1] );
         close( sock_in[0] );
+        close( sock_out[1] );
+        close( sock_err[1] );
 
         struct timeval starttv;
         gettimeofday(&starttv, 0 );
@@ -318,9 +320,6 @@
             msg = 0;
         }
         close( sock_in[1] );
-        close( sock_out[1] );
-        close( sock_err[1] );
-
         log_block parent_wait("parent, waiting");
         // idea borrowed from kprocess
         for(;;)
@@ -362,24 +361,19 @@
             log_block bfor("for writing loop");
             fd_set rfds;
             FD_ZERO( &rfds );
-            FD_SET( sock_out[0], &rfds );
-            FD_SET( sock_err[0], &rfds );
+            if (sock_out[0] >= 0)
+                FD_SET( sock_out[0], &rfds );
+            if (sock_err[0] >= 0)
+                FD_SET( sock_err[0], &rfds );
             FD_SET( client_fd, &rfds );
 
             int max_fd = std::max( sock_out[0], sock_err[0] );
             if ( client_fd > max_fd )
                 max_fd = client_fd;
 
-            struct timeval tv;
-            /* Wait up to five seconds. */
-            tv.tv_sec = 5;
-            tv.tv_usec = 0;
+            ret = select( max_fd+1, &rfds, 0, 0, NULL );
+            log_info() << " sel returned  " << ret << endl;
 
-            {
-                log_block bselect("waiting in select");
-                ret =  select( max_fd+1, &rfds, 0, 0, &tv );
-            }
-
             switch( ret )
             {
             case -1:
@@ -431,6 +425,10 @@
                         buffer[bytes] = 0;
                         rmsg.out.append( buffer );
                     }
+                    else if (bytes == 0) {
+                        close(sock_out[0]);
+                        sock_out[0] = -1;
+                    }
                 }
                 if ( FD_ISSET(sock_err[0], &rfds) ) {
                     ssize_t bytes = read( sock_err[0], buffer, sizeof(buffer)-1 );
@@ -438,6 +436,10 @@
                         buffer[bytes] = 0;
                         rmsg.err.append( buffer );
                     }
+                    else if (bytes == 0) {
+                        close(sock_err[0]);
+                        sock_err[0] = -1;
+                    }
                 }
                 if ( FD_ISSET( client_fd, &rfds ) ) {
                     rmsg.err.append( "client cancelled\n" );
[prev in list] [next in list] [prev in thread] [next in thread] 

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