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:
@@ -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
|
||||||
|
@@ -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();
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user