Locations::clear_ranges() leaves punch/loop/session ranges intact if they exist
[ardour.git] / libs / pbd / system_exec.cc
index 811bd43d3907aded2701ba02581aa79c2f3186b8..123fb909ad4f971ae4a2960e637fb7429bac6982 100644 (file)
@@ -413,8 +413,7 @@ int
 SystemExec::wait (int options)
 {
        while (is_running()) {
-               WaitForSingleObject(pid->hProcess, INFINITE);
-               Sleep(20);
+               WaitForSingleObject(pid->hProcess, 40);
        }
        return 0;
 }
@@ -422,7 +421,12 @@ SystemExec::wait (int options)
 bool
 SystemExec::is_running ()
 {
-       return pid?true:false;
+       if (!pid) return false;
+       DWORD exit_code;
+       if (GetExitCodeProcess(pid->hProcess, &exit_code)) {
+               if (exit_code == STILL_ACTIVE) return true;
+       }
+       return false;
 }
 
 int
@@ -805,6 +809,10 @@ SystemExec::start (int stderr_mode, const char *vfork_exec_wrapper)
 #else
        signal(SIGPIPE, SIG_DFL);
 #endif
+       if (!vfork_exec_wrapper) {
+               error << _("Cannot start external process, no vfork wrapper") << endmsg;
+               return -1;
+       }
 
        int good_fds[2] = { pok[1],  -1 };
        close_allv(good_fds);