]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/utilsunx.cpp
Declare namespace std {} before using namespace std; for MetroWerks
[wxWidgets.git] / src / unix / utilsunx.cpp
index abe366b9fcb50c804cd85a9422f9b338211aceef..6169570d98c6a47701e4dc55a329c4bf56373e57 100644 (file)
@@ -15,6 +15,8 @@
 // headers
 // ----------------------------------------------------------------------------
 
+#include <pwd.h>
+
 // for compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 
 #if wxUSE_BASE
 
-#if defined( __MWERKS__ ) && defined(__MACH__)
-#define WXWIN_OS_DESCRIPTION "MacOS X"
-#define HAVE_NANOSLEEP
+#if defined(__MWERKS__) && defined(__MACH__)
+    #ifndef WXWIN_OS_DESCRIPTION
+        #define WXWIN_OS_DESCRIPTION "MacOS X"
+    #endif
+    #ifndef HAVE_NANOSLEEP
+        #define HAVE_NANOSLEEP
+    #endif
+    #ifndef HAVE_UNAME
+        #define HAVE_UNAME
+    #endif
+
+    // our configure test believes we can use sigaction() if the function is
+    // available but Metrowekrs with MSL run-time does have the function but
+    // doesn't have sigaction struct so finally we can't use it...
+    #ifdef __MSL__
+        #undef wxUSE_ON_FATAL_EXCEPTION
+        #define wxUSE_ON_FATAL_EXCEPTION 0
+    #endif
 #endif
 
 // not only the statfs syscall is called differently depending on platform, but
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
-#include <pwd.h>
 #include <errno.h>
 #include <netdb.h>
 #include <signal.h>
@@ -148,12 +164,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);
@@ -166,15 +182,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
 // ----------------------------------------------------------------------------
@@ -507,7 +528,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]
@@ -925,7 +948,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);
@@ -933,7 +956,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
 }
 
@@ -1120,7 +1143,7 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
     }
 
 
-#if defined(__DARWIN__) && defined(__WXMAC__)
+#if defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))
     endProcData->tag = wxAddProcessCallbackForPid(endProcData, execData.pid);
 #else
     endProcData->tag = wxAddProcessCallback
@@ -1130,7 +1153,7 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
                 );
 
     execData.pipeEndProcDetect.Close();
-#endif // defined(__DARWIN__) && defined(__WXMAC__)
+#endif // defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))
 
     if ( execData.flags & wxEXEC_SYNC )
     {
@@ -1141,14 +1164,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();