possible fix for #5441 -- ardour hangs on shutdown (trying to stop harvid/xjadeo)
This commit is contained in:
parent
ca1d58c254
commit
b7c617b057
@ -32,6 +32,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "system_exec.h"
|
#include "system_exec.h"
|
||||||
@ -293,6 +294,10 @@ SystemExec::output_interposer()
|
|||||||
{
|
{
|
||||||
DWORD bytesRead = 0;
|
DWORD bytesRead = 0;
|
||||||
char data[BUFSIZ];
|
char data[BUFSIZ];
|
||||||
|
#if 0 // untested code to set up nonblocking
|
||||||
|
unsigned long l = 1;
|
||||||
|
ioctlsocket(stdoutP[0], FIONBIO, &l);
|
||||||
|
#endif
|
||||||
while(1) {
|
while(1) {
|
||||||
#if 0 // for non-blocking pipes..
|
#if 0 // for non-blocking pipes..
|
||||||
DWORD bytesAvail = 0;
|
DWORD bytesAvail = 0;
|
||||||
@ -411,14 +416,15 @@ SystemExec::terminate ()
|
|||||||
::pthread_mutex_lock(&write_lock);
|
::pthread_mutex_lock(&write_lock);
|
||||||
close_stdin();
|
close_stdin();
|
||||||
if (pid) {
|
if (pid) {
|
||||||
::usleep(100000);
|
::usleep(50000);
|
||||||
|
sched_yield();
|
||||||
wait(WNOHANG);
|
wait(WNOHANG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pid) {
|
if (pid) {
|
||||||
::fprintf(stderr, "Child process is running. trying SIGTERM\n");
|
|
||||||
::kill(pid, SIGTERM);
|
::kill(pid, SIGTERM);
|
||||||
::usleep(50000);
|
::usleep(50000);
|
||||||
|
sched_yield();
|
||||||
wait(WNOHANG);
|
wait(WNOHANG);
|
||||||
}
|
}
|
||||||
if (pid) {
|
if (pid) {
|
||||||
@ -482,7 +488,7 @@ SystemExec::start (int stderr_mode)
|
|||||||
::close(pok[1]);
|
::close(pok[1]);
|
||||||
char buf;
|
char buf;
|
||||||
for ( ;; ) {
|
for ( ;; ) {
|
||||||
int n = ::read(pok[0], &buf, 1 );
|
ssize_t n = ::read(pok[0], &buf, 1 );
|
||||||
if ( n==1 ) {
|
if ( n==1 ) {
|
||||||
/* child process returned from execve */
|
/* child process returned from execve */
|
||||||
pid=0;
|
pid=0;
|
||||||
@ -602,7 +608,11 @@ SystemExec::output_interposer()
|
|||||||
{
|
{
|
||||||
int rfd=pout[0];
|
int rfd=pout[0];
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
size_t r;
|
ssize_t r;
|
||||||
|
unsigned long l = 1;
|
||||||
|
|
||||||
|
ioctl(rfd, FIONBIO, &l); // set non-blocking I/O
|
||||||
|
|
||||||
for (;fcntl(rfd, F_GETFL)!=-1;) {
|
for (;fcntl(rfd, F_GETFL)!=-1;) {
|
||||||
r = read(rfd, buf, sizeof(buf));
|
r = read(rfd, buf, sizeof(buf));
|
||||||
if (r < 0 && (errno == EINTR || errno == EAGAIN)) {
|
if (r < 0 && (errno == EINTR || errno == EAGAIN)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user