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
This commit is contained in:
Vadim Zeitlin
2008-03-22 03:50:35 +00:00
parent eacb6b56a6
commit 4d425deeb2
3 changed files with 34 additions and 36 deletions

View File

@@ -52,7 +52,9 @@ public:
void Init(wxPipeInputStream *stream); void Init(wxPipeInputStream *stream);
// check for input on our stream and cache it in our buffer if any // 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(); ~wxStreamTempInputBuffer();
@@ -82,30 +84,32 @@ inline void wxStreamTempInputBuffer::Init(wxPipeInputStream *stream)
} }
inline 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); // realloc in blocks of 4Kb: this is the default (and minimal) buffer
if ( !buf ) // size of the Unix pipes so it should be the optimal step
{ //
// don't read any more, we don't have enough memory to do it // NB: don't use "static int" in this inline function, some compilers
m_stream = NULL; // (e.g. IBM xlC) don't like it
} enum { incSize = 4096 };
else // got memory for the buffer
{ void *buf = realloc(m_buffer, m_size + incSize);
m_buffer = buf; if ( !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 inline

View File

@@ -987,13 +987,13 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler)
while ( data->state ) while ( data->state )
{ {
#if wxUSE_STREAMS && !defined(__WXWINCE__) #if wxUSE_STREAMS && !defined(__WXWINCE__)
bufOut.Update(); if ( !bufOut.Update() && !bufErr.Update() )
bufErr.Update();
#endif // wxUSE_STREAMS #endif // wxUSE_STREAMS
{
// don't eat 100% of the CPU -- ugly but anything else requires // don't eat 100% of the CPU -- ugly but anything else requires
// real async IO which we don't have for the moment // real async IO which we don't have for the moment
::Sleep(50); ::Sleep(50);
}
// we must process messages or we'd never get wxWM_PROC_TERMINATED // we must process messages or we'd never get wxWM_PROC_TERMINATED
traits->AlwaysYield(); traits->AlwaysYield();

View File

@@ -1313,17 +1313,11 @@ bool wxAppTraits::CheckForRedirectedIO(wxExecuteData& execData)
#if HAS_PIPE_INPUT_STREAM #if HAS_PIPE_INPUT_STREAM
bool hasIO = false; bool hasIO = false;
if ( execData.bufOut ) if ( execData.bufOut && execData.bufOut->Update() )
{
execData.bufOut->Update();
hasIO = true; hasIO = true;
}
if ( execData.bufErr ) if ( execData.bufErr && execData.bufErr->Update() )
{
execData.bufErr->Update();
hasIO = true; hasIO = true;
}
return hasIO; return hasIO;
#else // !HAS_PIPE_INPUT_STREAM #else // !HAS_PIPE_INPUT_STREAM