Combine the check for wxMac and then the other check for wxMac/wxCocoa into
one define called USE_OLD_DARWIN_END_PROCESS_DETECT because it's wrong to created pipeEndProcDetect on wxCocoa when it's not going to use it! The next commit will show why it's now "Old". git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49154 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1220,13 +1220,18 @@ bool wxHandleFatalExceptions(bool doit)
|
|||||||
|
|
||||||
#if wxUSE_GUI
|
#if wxUSE_GUI
|
||||||
|
|
||||||
|
#if __DARWIN__
|
||||||
|
#include <sys/errno.h>
|
||||||
|
#endif
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxExecute support
|
// wxExecute support
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
// Darwin doesn't use the same process end detection mechanisms so we don't
|
#define USE_OLD_DARWIN_END_PROCESS_DETECT (defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__)))
|
||||||
// need wxExecute-related helpers for it
|
|
||||||
#if !(defined(__DARWIN__) && defined(__WXMAC__))
|
// wxMac/wxCocoa don't use the same process end detection mechanisms so we don't
|
||||||
|
// need wxExecute-related helpers for them
|
||||||
|
#if !USE_OLD_DARWIN_END_PROCESS_DETECT
|
||||||
|
|
||||||
bool wxGUIAppTraits::CreateEndProcessPipe(wxExecuteData& execData)
|
bool wxGUIAppTraits::CreateEndProcessPipe(wxExecuteData& execData)
|
||||||
{
|
{
|
||||||
@@ -1296,7 +1301,7 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
|
|||||||
|
|
||||||
if ( !(flags & wxEXEC_NOEVENTS) )
|
if ( !(flags & wxEXEC_NOEVENTS) )
|
||||||
{
|
{
|
||||||
#if defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))
|
#if USE_OLD_DARWIN_END_PROCESS_DETECT
|
||||||
endProcData->tag = wxAddProcessCallbackForPid(endProcData, execData.pid);
|
endProcData->tag = wxAddProcessCallbackForPid(endProcData, execData.pid);
|
||||||
#else
|
#else
|
||||||
endProcData->tag = wxAddProcessCallback
|
endProcData->tag = wxAddProcessCallback
|
||||||
@@ -1306,7 +1311,7 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
|
|||||||
);
|
);
|
||||||
|
|
||||||
execData.pipeEndProcDetect.Close();
|
execData.pipeEndProcDetect.Close();
|
||||||
#endif // defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))
|
#endif // USE_OLD_DARWIN_END_PROCESS_DETECT
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( flags & wxEXEC_SYNC )
|
if ( flags & wxEXEC_SYNC )
|
||||||
@@ -1324,6 +1329,35 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
|
|||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
int result = waitpid(execData.pid, &status, 0);
|
int result = waitpid(execData.pid, &status, 0);
|
||||||
|
#ifdef __DARWIN__
|
||||||
|
/* DE: waitpid manpage states that waitpid can fail with EINTR
|
||||||
|
if the call is interrupted by a caught signal. I suppose
|
||||||
|
that means that this ought to be a while loop.
|
||||||
|
|
||||||
|
The odd thing is that it seems to fail EVERY time. It fails
|
||||||
|
with a quickly exiting process (e.g. echo), and fails with a
|
||||||
|
slowly exiting process (e.g. sleep 2) but clearly after
|
||||||
|
having waited for the child to exit. Maybe it's a bug in
|
||||||
|
my particular version.
|
||||||
|
|
||||||
|
It works, however, from the CFSocket callback without this
|
||||||
|
trick but in that case it's used only after CFSocket calls
|
||||||
|
the callback and with the WNOHANG flag which would seem to
|
||||||
|
preclude it from being interrupted or at least make it much
|
||||||
|
less likely since it would not then be waiting.
|
||||||
|
|
||||||
|
If Darwin's man page is to be believed then this is definitely
|
||||||
|
necessary. It's just weird that I've never seen it before
|
||||||
|
and apparently no one else has either or you'd think they'd
|
||||||
|
have reported it by now. Perhaps blocking the GUI while
|
||||||
|
waiting for a child process to exit is simply not that common.
|
||||||
|
*/
|
||||||
|
if(result == -1 && errno == EINTR)
|
||||||
|
{
|
||||||
|
result = waitpid(execData.pid, &status, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( result == -1 )
|
if ( result == -1 )
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user