From 4d425deeb2ff4abe56e7b9cc85fa4e216ec94b36 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 22 Mar 2008 03:50:35 +0000 Subject: [PATCH] return bool from wxStreamTempInputBuffer::Update() indicating if anything was done; don't sleep in wxExecute() if IO is coming git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52678 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/execcmn.cpp | 48 +++++++++++++++++++++++------------------- src/msw/utilsexc.cpp | 12 +++++------ src/unix/utilsunx.cpp | 10 ++------- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/src/common/execcmn.cpp b/src/common/execcmn.cpp index a84c6d10f0..61bb0e2d04 100644 --- a/src/common/execcmn.cpp +++ b/src/common/execcmn.cpp @@ -52,7 +52,9 @@ public: void Init(wxPipeInputStream *stream); // check for input on our stream and cache it in our buffer if any - void Update(); + // + // return true if anything was done + bool Update(); ~wxStreamTempInputBuffer(); @@ -82,30 +84,32 @@ inline void wxStreamTempInputBuffer::Init(wxPipeInputStream *stream) } inline -void wxStreamTempInputBuffer::Update() +bool wxStreamTempInputBuffer::Update() { - if ( m_stream && m_stream->CanRead() ) + if ( !m_stream || !m_stream->CanRead() ) + return false; + + // realloc in blocks of 4Kb: this is the default (and minimal) buffer + // size of the Unix pipes so it should be the optimal step + // + // NB: don't use "static int" in this inline function, some compilers + // (e.g. IBM xlC) don't like it + enum { incSize = 4096 }; + + void *buf = realloc(m_buffer, m_size + incSize); + if ( !buf ) { - // realloc in blocks of 4Kb: this is the default (and minimal) buffer - // size of the Unix pipes so it should be the optimal step - // - // NB: don't use "static int" in this inline function, some compilers - // (e.g. IBM xlC) don't like it - enum { incSize = 4096 }; - - void *buf = realloc(m_buffer, m_size + incSize); - if ( !buf ) - { - // don't read any more, we don't have enough memory to do it - m_stream = NULL; - } - else // got memory for the buffer - { - m_buffer = buf; - m_stream->Read((char *)m_buffer + m_size, incSize); - m_size += m_stream->LastRead(); - } + // don't read any more, we don't have enough memory to do it + m_stream = NULL; } + else // got memory for the buffer + { + m_buffer = buf; + m_stream->Read((char *)m_buffer + m_size, incSize); + m_size += m_stream->LastRead(); + } + + return true; } inline diff --git a/src/msw/utilsexc.cpp b/src/msw/utilsexc.cpp index a675969f7e..456594d834 100644 --- a/src/msw/utilsexc.cpp +++ b/src/msw/utilsexc.cpp @@ -987,13 +987,13 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler) while ( data->state ) { #if wxUSE_STREAMS && !defined(__WXWINCE__) - bufOut.Update(); - bufErr.Update(); + if ( !bufOut.Update() && !bufErr.Update() ) #endif // wxUSE_STREAMS - - // don't eat 100% of the CPU -- ugly but anything else requires - // real async IO which we don't have for the moment - ::Sleep(50); + { + // don't eat 100% of the CPU -- ugly but anything else requires + // real async IO which we don't have for the moment + ::Sleep(50); + } // we must process messages or we'd never get wxWM_PROC_TERMINATED traits->AlwaysYield(); diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index ea8645c270..2db499dc9e 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -1313,17 +1313,11 @@ bool wxAppTraits::CheckForRedirectedIO(wxExecuteData& execData) #if HAS_PIPE_INPUT_STREAM bool hasIO = false; - if ( execData.bufOut ) - { - execData.bufOut->Update(); + if ( execData.bufOut && execData.bufOut->Update() ) hasIO = true; - } - if ( execData.bufErr ) - { - execData.bufErr->Update(); + if ( execData.bufErr && execData.bufErr->Update() ) hasIO = true; - } return hasIO; #else // !HAS_PIPE_INPUT_STREAM -- 2.47.2