X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2887179b1fa36f13e7686aae3043893735667dca..9a35701127e3e8d2c7fb433d85c7b3954ccbfc9f:/src/unix/utilsunx.cpp diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index f216487e98..9d7034dda6 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -15,6 +15,9 @@ // headers // ---------------------------------------------------------------------------- +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + #include "wx/defs.h" #include "wx/string.h" @@ -39,11 +42,12 @@ #endif // wxUSE_STREAMS -#ifdef __WXBASE__ +#if wxUSE_BASE #if defined( __MWERKS__ ) && defined(__MACH__) #define WXWIN_OS_DESCRIPTION "MacOS X" #define HAVE_NANOSLEEP +#define HAVE_UNAME #endif // not only the statfs syscall is called differently depending on platform, but @@ -145,12 +149,12 @@ void wxSleep(int nSecs) sleep(nSecs); } -void wxUsleep(unsigned long milliseconds) +void wxMicroSleep(unsigned long microseconds) { #if defined(HAVE_NANOSLEEP) timespec tmReq; - tmReq.tv_sec = (time_t)(milliseconds / 1000); - tmReq.tv_nsec = (milliseconds % 1000) * 1000 * 1000; + tmReq.tv_sec = (time_t)(microseconds / 1000000); + tmReq.tv_nsec = (microseconds % 1000000) * 1000; // we're not interested in remaining time nor in return value (void)nanosleep(&tmReq, (timespec *)NULL); @@ -163,15 +167,20 @@ void wxUsleep(unsigned long milliseconds) #error "usleep() cannot be used in MT programs under Solaris." #endif // Sun - usleep(milliseconds * 1000); // usleep(3) wants microseconds + usleep(microseconds); #elif defined(HAVE_SLEEP) // under BeOS sleep() takes seconds (what about other platforms, if any?) - sleep(milliseconds * 1000); + sleep(microseconds * 1000000); #else // !sleep function - #error "usleep() or nanosleep() function required for wxUsleep" + #error "usleep() or nanosleep() function required for wxMicroSleep" #endif // sleep function } +void wxMilliSleep(unsigned long milliseconds) +{ + wxMicroSleep(milliseconds*1000); +} + // ---------------------------------------------------------------------------- // process management // ---------------------------------------------------------------------------- @@ -504,7 +513,9 @@ long wxExecute(wxChar **argv, // start an xterm executing it. if ( !(flags & wxEXEC_SYNC) ) { - for ( int fd = 0; fd < FD_SETSIZE; fd++ ) + // FD_SETSIZE is unsigned under BSD, signed under other platforms + // so we need a cast to avoid warnings on all platforms + for ( int fd = 0; fd < (int)FD_SETSIZE; fd++ ) { if ( fd == pipeIn[wxPipe::Read] || fd == pipeOut[wxPipe::Write] @@ -574,6 +585,9 @@ long wxExecute(wxChar **argv, { ARGS_CLEANUP; + // save it for WaitForChild() use + execData.pid = pid; + // prepare for IO redirection #if wxUSE_STREAMS @@ -817,17 +831,6 @@ wxString wxGetOsDescription() #endif // !__WXMAC__ -int wxGetOsVersion(int *verMaj, int *verMin) -{ - // we want this function to work even if there is no wxApp - wxConsoleAppTraits traitsConsole; - wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; - if ( ! traits ) - traits = &traitsConsole; - - return traits->GetOSVersion(verMaj, verMin); -} - unsigned long wxGetProcessId() { return (unsigned long)getpid(); @@ -930,7 +933,7 @@ bool wxSetEnv(const wxString& variable, const wxChar *value) s << _T('=') << value; // transform to ANSI - const char *p = s.mb_str(); + const wxWX2MBbuf p = s.mb_str(); // the string will be free()d by libc char *buf = (char *)malloc(strlen(p) + 1); @@ -938,7 +941,7 @@ bool wxSetEnv(const wxString& variable, const wxChar *value) return putenv(buf) == 0; #else // no way to set an env var - return FALSE; + return false; #endif } @@ -1049,7 +1052,7 @@ void wxFatalError( const wxString &msg, const wxString &title ) #endif // WXWIN_COMPATIBILITY_2_2 -#endif // __WXBASE__ +#endif // wxUSE_BASE #if wxUSE_GUI @@ -1146,14 +1149,27 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) // process terminates while ( endProcData->pid != 0 ) { + bool idle = true; + #if wxUSE_STREAMS if ( execData.bufOut ) + { execData.bufOut->Update(); + idle = false; + } if ( execData.bufErr ) + { execData.bufErr->Update(); + idle = false; + } #endif // wxUSE_STREAMS + // don't consume 100% of the CPU while we're sitting in this + // loop + if ( idle ) + wxMilliSleep(1); + // give GTK+ a chance to call GTK_EndProcessDetector here and // also repaint the GUI wxYield(); @@ -1171,6 +1187,9 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) } } +#endif // wxUSE_GUI +#if wxUSE_BASE + void wxHandleProcessTermination(wxEndProcessData *proc_data) { // notify user about termination if required @@ -1191,5 +1210,4 @@ void wxHandleProcessTermination(wxEndProcessData *proc_data) } } -#endif // wxUSE_GUI - +#endif // wxUSE_BASE