]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/utilsunx.cpp
Adding MSVC makefile support for building the TIFF library
[wxWidgets.git] / src / unix / utilsunx.cpp
index 0b2e074026f1d1d63e67448acc147a105dedfa9c..2082e6bca195d3e70a89d1743ea1578be81918df 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "wx/utils.h"
 #include "wx/process.h"
+#include "wx/thread.h"
 
 #include "wx/unix/execute.h"
 
         #ifdef __SUN__
             int usleep(unsigned int usec);
         #else // !Sun
-        #ifdef __EMX__
-            /* I copied this from the XFree86 diffs. AV. */
-            #define INCL_DOSPROCESS
-            #include <os2.h>
-            void usleep(unsigned long delay)
-            {
-                DosSleep(delay ? (delay/1000l) : 1l);
-            }
-        #else
-            void usleep(unsigned long usec);
-        #endif
+            #ifdef __EMX__
+                /* I copied this from the XFree86 diffs. AV. */
+                #define INCL_DOSPROCESS
+                #include <os2.h>
+                inline void usleep(unsigned long delay)
+                {
+                    DosSleep(delay ? (delay/1000l) : 1l);
+                }
+            #else // !Sun && !EMX
+                void usleep(unsigned long usec);
+            #endif
         #endif // Sun/EMX/Something else
     };
-#define HAVE_USLEEP 1
+
+    #define HAVE_USLEEP 1
 #endif // Unices without usleep()
 
 // ============================================================================
@@ -217,9 +219,24 @@ void wxHandleProcessTermination(wxEndProcessData *proc_data)
     // systems wait() might be used instead in a loop (until the right pid
     // terminates)
     int status = 0;
-    if ( waitpid(pid, &status, 0) == -1 || !WIFEXITED(status) )
+    int rc;
+
+    // wait for child termination and if waitpid() was interrupted, try again
+    do
+    {
+       rc = waitpid(pid, &status, 0);
+    }
+    while ( rc == -1 && errno == EINTR );
+
+
+    if( rc == -1 || ! (WIFEXITED(status) || WIFSIGNALED(status)) )
     {
-        wxLogSysError(_("Waiting for subprocess termination failed"));
+       wxLogSysError(_("Waiting for subprocess termination failed"));
+       /* AFAIK, this can only happen if something went wrong within
+          wxGTK, i.e. due to a race condition or some serious bug.
+          After having fixed the order of statements in
+          GTK_EndProcessDetector(). (KB)
+       */
     }
     else
     {
@@ -229,19 +246,18 @@ void wxHandleProcessTermination(wxEndProcessData *proc_data)
             proc_data->process->OnTerminate(proc_data->pid,
                                             WEXITSTATUS(status));
         }
-    }
-
-    // clean up
-    if ( proc_data->pid > 0 )
-    {
-        delete proc_data;
-    }
-    else
-    {
-        // wxExecute() will know about it
-        proc_data->exitcode = status;
+        // clean up
+        if ( proc_data->pid > 0 )
+        {
+           delete proc_data;
+        }
+        else
+        {
+           // wxExecute() will know about it
+           proc_data->exitcode = status;
 
-        proc_data->pid = 0;
+           proc_data->pid = 0;
+        }
     }
 }
 
@@ -345,11 +361,8 @@ long wxExecute( wxChar **argv, bool sync, wxProcess *process )
     else
     {
 #if wxUSE_GUI
-        // we're in parent
-        close(end_proc_detect[1]); // close writing side
-
         wxEndProcessData *data = new wxEndProcessData;
-        data->tag = wxAddProcessCallback(data, end_proc_detect[0]);
+
 
         ARGS_CLEANUP;
 
@@ -360,6 +373,9 @@ long wxExecute( wxChar **argv, bool sync, wxProcess *process )
 
             // sync execution: indicate it by negating the pid
             data->pid = -pid;
+            data->tag = wxAddProcessCallback(data, end_proc_detect[0]);
+            // we're in parent
+            close(end_proc_detect[1]); // close writing side
 
             // it will be set to 0 from GTK_EndProcessDetector
             while (data->pid != 0)
@@ -374,10 +390,13 @@ long wxExecute( wxChar **argv, bool sync, wxProcess *process )
         else
         {
             // async execution, nothing special to do - caller will be
-            // notified about the process terminationif process != NULL, data
+            // notified about the process termination if process != NULL, data
             // will be deleted in GTK_EndProcessDetector
             data->process = process;
             data->pid = pid;
+            data->tag = wxAddProcessCallback(data, end_proc_detect[0]);
+            // we're in parent
+            close(end_proc_detect[1]); // close writing side
 
             return pid;
         }
@@ -565,6 +584,15 @@ bool wxGetUserName(wxChar *buf, int sz)
     return FALSE;
 }
 
+wxString wxGetOsDescription()
+{
+#ifndef WXWIN_OS_DESCRIPTION
+    #error WXWIN_OS_DESCRIPTION should be defined in config.h by configure
+#else
+    return WXWIN_OS_DESCRIPTION;
+#endif
+}
+
 // ----------------------------------------------------------------------------
 // error and debug output routines (deprecated, use wxLog)
 // ----------------------------------------------------------------------------