mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 14:45:24 +00:00
Add HAVE_PTHREAD_H guard for pthread_sigmask
Correctly disable pthread related code if pthread is not avialable, in order to get it compile with MinGW on Windows.
This commit is contained in:
parent
2f80b2a013
commit
7233dc170f
@ -8507,7 +8507,9 @@ remoteIOEventLoop(virConnectPtr conn,
|
|||||||
struct remote_thread_call *tmp = priv->waitDispatch;
|
struct remote_thread_call *tmp = priv->waitDispatch;
|
||||||
struct remote_thread_call *prev;
|
struct remote_thread_call *prev;
|
||||||
char ignore;
|
char ignore;
|
||||||
|
#ifdef HAVE_PTHREAD_H
|
||||||
sigset_t oldmask, blockedsigs;
|
sigset_t oldmask, blockedsigs;
|
||||||
|
#endif
|
||||||
|
|
||||||
fds[0].events = fds[0].revents = 0;
|
fds[0].events = fds[0].revents = 0;
|
||||||
fds[1].events = fds[1].revents = 0;
|
fds[1].events = fds[1].revents = 0;
|
||||||
@ -8534,18 +8536,22 @@ remoteIOEventLoop(virConnectPtr conn,
|
|||||||
* after the call (RHBZ#567931). Same for SIGCHLD and SIGPIPE
|
* after the call (RHBZ#567931). Same for SIGCHLD and SIGPIPE
|
||||||
* at the suggestion of Paolo Bonzini and Daniel Berrange.
|
* at the suggestion of Paolo Bonzini and Daniel Berrange.
|
||||||
*/
|
*/
|
||||||
|
#ifdef HAVE_PTHREAD_H
|
||||||
sigemptyset (&blockedsigs);
|
sigemptyset (&blockedsigs);
|
||||||
sigaddset (&blockedsigs, SIGWINCH);
|
sigaddset (&blockedsigs, SIGWINCH);
|
||||||
sigaddset (&blockedsigs, SIGCHLD);
|
sigaddset (&blockedsigs, SIGCHLD);
|
||||||
sigaddset (&blockedsigs, SIGPIPE);
|
sigaddset (&blockedsigs, SIGPIPE);
|
||||||
ignore_value (pthread_sigmask(SIG_BLOCK, &blockedsigs, &oldmask));
|
ignore_value (pthread_sigmask(SIG_BLOCK, &blockedsigs, &oldmask));
|
||||||
|
#endif
|
||||||
|
|
||||||
repoll:
|
repoll:
|
||||||
ret = poll(fds, ARRAY_CARDINALITY(fds), -1);
|
ret = poll(fds, ARRAY_CARDINALITY(fds), -1);
|
||||||
if (ret < 0 && errno == EAGAIN)
|
if (ret < 0 && errno == EAGAIN)
|
||||||
goto repoll;
|
goto repoll;
|
||||||
|
|
||||||
|
#ifdef HAVE_PTHREAD_H
|
||||||
ignore_value (pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
|
ignore_value (pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
|
||||||
|
#endif
|
||||||
|
|
||||||
remoteDriverLock(priv);
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
@ -316,7 +316,9 @@ static int virClearCapabilities(void)
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
int virFork(pid_t *pid) {
|
int virFork(pid_t *pid) {
|
||||||
|
# ifdef HAVE_PTHREAD_H
|
||||||
sigset_t oldmask, newmask;
|
sigset_t oldmask, newmask;
|
||||||
|
# endif
|
||||||
struct sigaction sig_action;
|
struct sigaction sig_action;
|
||||||
int saved_errno, ret = -1;
|
int saved_errno, ret = -1;
|
||||||
|
|
||||||
@ -326,6 +328,7 @@ int virFork(pid_t *pid) {
|
|||||||
* Need to block signals now, so that child process can safely
|
* Need to block signals now, so that child process can safely
|
||||||
* kill off caller's signal handlers without a race.
|
* kill off caller's signal handlers without a race.
|
||||||
*/
|
*/
|
||||||
|
# ifdef HAVE_PTHREAD_H
|
||||||
sigfillset(&newmask);
|
sigfillset(&newmask);
|
||||||
if (pthread_sigmask(SIG_SETMASK, &newmask, &oldmask) != 0) {
|
if (pthread_sigmask(SIG_SETMASK, &newmask, &oldmask) != 0) {
|
||||||
saved_errno = errno;
|
saved_errno = errno;
|
||||||
@ -333,6 +336,7 @@ int virFork(pid_t *pid) {
|
|||||||
"%s", _("cannot block signals"));
|
"%s", _("cannot block signals"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
/* Ensure we hold the logging lock, to protect child processes
|
/* Ensure we hold the logging lock, to protect child processes
|
||||||
* from deadlocking on another thread's inherited mutex state */
|
* from deadlocking on another thread's inherited mutex state */
|
||||||
@ -345,9 +349,11 @@ int virFork(pid_t *pid) {
|
|||||||
virLogUnlock();
|
virLogUnlock();
|
||||||
|
|
||||||
if (*pid < 0) {
|
if (*pid < 0) {
|
||||||
|
# ifdef HAVE_PTHREAD_H
|
||||||
/* attempt to restore signal mask, but ignore failure, to
|
/* attempt to restore signal mask, but ignore failure, to
|
||||||
avoid obscuring the fork failure */
|
avoid obscuring the fork failure */
|
||||||
ignore_value (pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
|
ignore_value (pthread_sigmask(SIG_SETMASK, &oldmask, NULL));
|
||||||
|
# endif
|
||||||
virReportSystemError(saved_errno,
|
virReportSystemError(saved_errno,
|
||||||
"%s", _("cannot fork child process"));
|
"%s", _("cannot fork child process"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -357,6 +363,7 @@ int virFork(pid_t *pid) {
|
|||||||
|
|
||||||
/* parent process */
|
/* parent process */
|
||||||
|
|
||||||
|
# ifdef HAVE_PTHREAD_H
|
||||||
/* Restore our original signal mask now that the child is
|
/* Restore our original signal mask now that the child is
|
||||||
safely running */
|
safely running */
|
||||||
if (pthread_sigmask(SIG_SETMASK, &oldmask, NULL) != 0) {
|
if (pthread_sigmask(SIG_SETMASK, &oldmask, NULL) != 0) {
|
||||||
@ -364,6 +371,7 @@ int virFork(pid_t *pid) {
|
|||||||
virReportSystemError(errno, "%s", _("cannot unblock signals"));
|
virReportSystemError(errno, "%s", _("cannot unblock signals"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -399,6 +407,7 @@ int virFork(pid_t *pid) {
|
|||||||
sigaction(i, &sig_action, NULL);
|
sigaction(i, &sig_action, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifdef HAVE_PTHREAD_H
|
||||||
/* Unmask all signals in child, since we've no idea
|
/* Unmask all signals in child, since we've no idea
|
||||||
what the caller's done with their signal mask
|
what the caller's done with their signal mask
|
||||||
and don't want to propagate that to children */
|
and don't want to propagate that to children */
|
||||||
@ -408,6 +417,7 @@ int virFork(pid_t *pid) {
|
|||||||
virReportSystemError(errno, "%s", _("cannot unblock signals"));
|
virReportSystemError(errno, "%s", _("cannot unblock signals"));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user